CRectTrackerの描画について

[戻る]
なお 2006/12/14(木) 12:50:58
かなりの初心者です。
カメラ画像をビットマップとして表示し、その画面の上でCRectTRackerを使って範囲を指
定しようとしています。しかし、範囲指定をしても矩形が描画されません。トラッキング
処理をしている時は表示されるのですが、それ以外はダメです。どうしたらいいんでしょ
うか。つたない説明ですみません・・・・

(開発環境)Microsoft VisualC++6.0
(ソース)
CRVISIONView::~CRVISIONView()
{   //初期設定
    m_tracker.m_rect.SetRect(100,100,100,100);
    m_tracker.m_nStyle |= CRectTracker::resizeInside
        |CRectTracker::hatchInside;
}
void CRVISIONView::OnPaint() 
{
  CPaintDC dc(this); // 描画用のデバイス コンテキスト
  CDC *pDC = this->GetDC();
        
  int ret;
  ret = meimage( dispid, imgbuff);/* 画像メモリをバッファに読み込む */
  if(ret == 0){
    BitDisp(IDC_MONITOR_LEFT,0,0,XSIZE,YSIZE,XRATE,YRATE,SRCCOPY);
                  /* 画像メモリの映像を表示 */
  }
  ret = meimage( dispid_r, imgbuff);/* 画像メモリをバッファに読み込む */
  if(ret == 0){
    BitDisp(IDC_MONITOR_RIGHT,350,0,XSIZE,YSIZE,XRATE,YRATE,SRCCOPY);
                    /* 画像メモリの映像を表示 */
  }

  m_tracker.Draw(pDC);
  ReleaseDC(pDC);

  //CFormView::OnPaint();
}
void CRVISIONView::OnLButtonDown(UINT nFlags, CPoint point) 
{        
  BOOL bResult = m_tracker.HitTest(point) != CRectTracker::hitNothing;
    
  if (bResult){//更新
    m_tracker.Track(this,point,TRUE);
    InvalidateRect(NULL, FALSE);
  }
  else if(nFlags){
    m_tracker.TrackRubberBand(this,point,TRUE);
    InvalidateRect(NULL,FALSE);

  }
        
    CFormView::OnLButtonDown(nFlags, point);
}
です。どうかお願いします。

Kerry 2006/12/14(木) 13:56:43
> void CRVISIONView::OnPaint() 
> {
>     CPaintDC dc(this); // 描画用のデバイス コンテキスト
>     CDC *pDC = this->GetDC();

ここでGetDCしてるのはなんでですか?
CPaintDCの方に描画すべきではないですか?

なお 2006/12/14(木) 15:25:43
返信が遅くなって本当にすいません。 
CPaintDC にどうやって、描画していいのか分らず、このような形を取っています。
どうすれば、よいですか?教えていただけると、うれしいです。

Kerry 2006/12/14(木) 15:55:23
CPaintDCはCDCの派生クラスなので

    CPaintDC dc(this);

    // ..略..

    m_tracker(&dc);

これでok

なお 2006/12/14(木) 16:02:29
それでやってみましたが、描画されませんでした……

Kerry 2006/12/14(木) 16:11:51
もしかして、矩形を右から左方向(または下から上方向)に
ドラッグしてますか?

そうであれば、矩形座標を正規化しないと正常に描画されないので
TrackRubberBand()の後に、CRect::NormalizeRect()で矩形を正規化
してみてください。

    m_tracker.TrackRubberBand( ..略.. );
    m_tracker.m_rect.NormalizeRect();

Kerry 2006/12/14(木) 16:16:41
自己レス

> TrackRubberBand()の後に、CRect::NormalizeRect()で矩形を正規化
> してみてください。

Track()の後にも必要ですね。

なお 2006/12/14(木) 16:27:00
if (bResult){//更新
        m_tracker.Track(this,point,TRUE);
   //追加        m_tracker.m_rect.NormalizeRect();

        InvalidateRect(NULL, FALSE);
    }
    else if(nFlags & (CRectTracker_flag == 1)){
        m_tracker.TrackRubberBand(this,point,TRUE);
 //追加             m_tracker.m_rect.NormalizeRect();

    }

のように変更したけどダメでした。追加の仕方をまちがっていますか?

Kerry 2006/12/14(木) 16:36:28
問題ないと思います…


なんででしょうね。
私の環境で試してみましたが、問題なく描画されております。

OnPaint()の処理をトラッカーの描画だけにしてもダメですか?

なお 2006/12/14(木) 16:46:46
ダメでした.....

Kerry 2006/12/14(木) 16:56:22
わかった。たぶん原因は↓コレです。

> CRVISIONView::~CRVISIONView()
> {   //初期設定
>     m_tracker.m_rect.SetRect(100,100,100,100);
>     m_tracker.m_nStyle |= CRectTracker::resizeInside
>         |CRectTracker::hatchInside;
> }

デストラクタじゃなくてコンストラクタで初期化しないと
ダメですね。

なお 2006/12/14(木) 17:00:46
本当に申し訳ありません。
コンストラクタで初期化って、ドコですればいいんですか。
こんな初歩的なことを聞いて本当にすいません…
関数が定義されているところにかけばいいんでしょうか?

Kerry 2006/12/14(木) 17:05:59
はい、そうです。そこに書いてください。↓のように

CRVISIONView::CRVISIONView()
    : CFormView(CRVISIONView::IDD)
{
    //{{AFX_DATA_INIT(CRVISIONView)
    //}}AFX_DATA_INIT

    m_tracker.m_rect.SetRect(100, 100, 100, 100);
    m_tracker.m_nStyle |= CRectTracker::resizeInside
        | CRectTracker::hatchInside;
}

なお 2006/12/14(木) 17:10:43
[[解決]]
できました!
ありがとうございました!
本当にうれしいです!
感謝感激です☆
長々と本当にありがとうございました!

PATIO 2006/12/15(金) 13:33:51
もう見て無いかもしれませんけれど、
せめてC++言語の基礎知識はほしいですね。
話を見ているとC++言語とMFCの使い方とWindowsのアプリケーションの組み方を
同時に勉強しているように見えます。
この方法だと、なぜ、コンストラクタに書かないといけないのかとか
そもそもコンストラクタって何とか
そういう部分の知識が無いまま突き進んでしまって
後々苦労すると思います。

まずはMFCを使用しないで、ウインドウも出さないアプリ(コンソールアプリ)を
使った形で純粋にC++言語の勉強からやった方が良いと思いますよ。
C++言語の知識はVC++以外の環境でも役に立ちますしね。

古いスレッドには追加発言できません。