CRectTrackerの描画について – プログラミング – Home

CRectTrackerの描画について
 
通知
すべてクリア

[解決済] CRectTrackerの描画について


なお
 なお
(@なお)
ゲスト
結合: 24年前
投稿: 35
Topic starter  

かなりの初心者です。
カメラ画像をビットマップとして表示し、その画面の上で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
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

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

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


返信引用
なお
 なお
(@なお)
ゲスト
結合: 24年前
投稿: 35
Topic starter  

返信が遅くなって本当にすいません。
CPaintDC にどうやって、描画していいのか分らず、このような形を取っています。
どうすれば、よいですか?教えていただけると、うれしいです。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

CPaintDCはCDCの派生クラスなので

CPaintDC dc(this);

// ..略..

m_tracker(&dc);

これでok


返信引用
なお
 なお
(@なお)
ゲスト
結合: 24年前
投稿: 35
Topic starter  

それでやってみましたが、描画されませんでした……


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

もしかして、矩形を右から左方向(または下から上方向)に
ドラッグしてますか?

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

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


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

自己レス

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

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


返信引用
なお
 なお
(@なお)
ゲスト
結合: 24年前
投稿: 35
Topic starter  

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
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

問題ないと思います…

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

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


返信引用
なお
 なお
(@なお)
ゲスト
結合: 24年前
投稿: 35
Topic starter  

ダメでした.....


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

わかった。たぶん原因は↓コレです。

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

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


返信引用
なお
 なお
(@なお)
ゲスト
結合: 24年前
投稿: 35
Topic starter  

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


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

はい、そうです。そこに書いてください。↓のように

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


返信引用
なお
 なお
(@なお)
ゲスト
結合: 24年前
投稿: 35
Topic starter  

できました!
ありがとうございました!
本当にうれしいです!
感謝感激です☆
長々と本当にありがとうございました!


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました