お世話になります。
VS2005 MFCでダイアログベースのアプリケーションを
作成しています。
CRectTrackerを用いて画像表示されているピクチャコントロールに
マウス左ボタンを押している間に矩形を描画したいのですが
描画ができません。
何方か教えて頂けないでしょうか。
初期化処理
BOOL CImageViewToolDlg::OnInitDialog()
{
m_tracker.m_nStyle |= CRectTracker::solidLine ; // 外の枠線のスタイルを指定します
//m_trackerの初期化します
m_tracker.m_rect.left = 100;
m_tracker.m_rect.top = 100;
m_tracker.m_rect.right = 100;
m_tracker.m_rect.bottom = 100;
}
TIFF画像表示処理、OnPaint()から呼ばれます。
void CImageViewToolDlg::TiffImageView(CString imageFilePath)
{
//ピクチャコントロールボックスのハンドル取得
const HWND hWndPict = ::GetDlgItem( m_hWnd, IDC_PICT_AREA1 );
RECT Rect;
::GetClientRect( hWndPict, &Rect );
//ピクチャコントロールボックスの幅/高さ取得
const int width = Rect.right - Rect.left;
const int height = Rect.bottom - Rect.top;
HDC hdc = ::GetDC( hWndPict );
::Graphics TiffGraphics( hdc );
//TIFFファイル名設定
Image tiffImage( imageFilePath );
//ピクチャコントロールボックスのサイズに合わせて画像表示
TiffGraphics.DrawImage( &tiffImage, 0, 0, width, height );
::ReleaseDC( hWndPict, hdc );
//------------------矩形描画用のデバイスコンテキスト取得-------------
CDC* pDC = m_pict.GetDC();
//矩形描画
m_tracker.Draw(pDC);
ReleaseDC(pDC);
}
マウス左ボタンを押したときの処理
void CImageViewToolDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
tiffImagePoint ImagePointP;
WINDOWPLACEMENT winplace;
CRect rect;
RECT CampRect;
//画像表示モード1、2、3でかつ画像表示中あるか確認
if ( ( ( 0 <= m_ModeSelect) && ( m_ModeSelect <= 2 ) ) && ( m_imageDisp ) ) {
if ( m_bCapture == false ) {
SetCapture();
m_bCapture = true;
}
m_pict.GetWindowPlacement( &winplace );
CampRect = winplace.rcNormalPosition;
//マウスの座標をピクチャコントロール用に補正
point.x -= CampRect.left;
point.y -= CampRect.top;
m_pict.GetClientRect( &rect );
m_rect = rect;
//ピクチャコントロール内にマウスがあるか判断
if ( rect.PtInRect( point ) == FALSE ) {
m_bCapture = false;
ReleaseCapture();
}
else {
if ( !m_xvChkButton ) {
ImagePointP.startPoint_x = point.x;
ImagePointP.startPoint_y = point.y;
ImagePointP.endPoint_x = 0;
ImagePointP.endPoint_y = 0;
//ピクチャーコントロールのマウス位置からTIFFファイル内の縦横位置に変換する。
ChangeTiffImagePoint( FALSE, &ImagePointP );
} else {
m_startPointX = point.x;
m_startPointY = point.y;
//-------------------------------矩形描画----------------------------
BOOL bResult = m_tracker.HitTest(point) != CRectTracker::hitNothing;
if (bResult){//更新
m_tracker.Track(this,point,TRUE);
m_tracker.m_rect.NormalizeRect();
InvalidateRect(m_rect, FALSE);
}
else if(nFlags){
m_tracker.TrackRubberBand(this,point,TRUE);
m_tracker.m_rect.NormalizeRect();
}
//-------------------------------------------------------------------
}
}
}
CDialog::OnLButtonDown(nFlags, point);
}
お世話になります。
矩形領域の指定はできるようになりましたが
マウスの左ボタンを離した時にOnLButtonUp(WM_LBUTTONUPメッセージ)
が発生しません。
やりたいことは、ピクチャーコントロール内でマウス左ボタンを押した時に矩形領域の開始座標X,Yを取得し、マウス左ボタンを離した時に矩形領域の終了座標X,Yを取得したいのですが。上手くいきません。
どうしてもピクチャーコントロールが使いたいようですね(笑)。
細かなメッセージを全て取得するには、ピクチャーコントロールを
サブクラス化してください。
それ以外の方法はありません。
お世話になります。
有難う御座います。
検討してみます。
お世話になります。
OnLButtonDown内で
ClipCursor(&Rect);
と
TrackRubberBandを組み合わせることでできました。
有難う御座いました。