CRectTrackerについて

解決


かかし  2011-02-25 20:12:19  No: 72371  IP: [192.*.*.*]

お世話になります。

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);
}

編集 削除
かかし  2011-02-26 00:10:37  No: 72372  IP: [192.*.*.*]

お世話になります。

矩形領域の指定はできるようになりましたが
マウスの左ボタンを離した時にOnLButtonUp(WM_LBUTTONUPメッセージ)
が発生しません。

やりたいことは、ピクチャーコントロール内でマウス左ボタンを押した時に矩形領域の開始座標X,Yを取得し、マウス左ボタンを離した時に矩形領域の終了座標X,Yを取得したいのですが。上手くいきません。

編集 削除
仲澤@失業者  2011-02-28 10:32:57  No: 72373  IP: [192.*.*.*]

どうしてもピクチャーコントロールが使いたいようですね(笑)。
細かなメッセージを全て取得するには、ピクチャーコントロールを
サブクラス化してください。
それ以外の方法はありません。

編集 削除
かかし  2011-02-28 10:50:34  No: 72374  IP: [192.*.*.*]

お世話になります。

有難う御座います。

検討してみます。

編集 削除
かかし  2011-02-28 14:52:24  No: 72375  IP: [192.*.*.*]

お世話になります。

OnLButtonDown内で

ClipCursor(&Rect);

TrackRubberBandを組み合わせることでできました。

有難う御座いました。

編集 削除