かなりの初心者です。
カメラ画像をビットマップとして表示し、その画面の上で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);
}
です。どうかお願いします。
> void CRVISIONView::OnPaint()
> {
> CPaintDC dc(this); // 描画用のデバイス コンテキスト
> CDC *pDC = this->GetDC();
ここでGetDCしてるのはなんでですか?
CPaintDCの方に描画すべきではないですか?
返信が遅くなって本当にすいません。
CPaintDC にどうやって、描画していいのか分らず、このような形を取っています。
どうすれば、よいですか?教えていただけると、うれしいです。
CPaintDCはCDCの派生クラスなので
CPaintDC dc(this);
// ..略..
m_tracker(&dc);
これでok
それでやってみましたが、描画されませんでした……
もしかして、矩形を右から左方向(または下から上方向)に
ドラッグしてますか?
そうであれば、矩形座標を正規化しないと正常に描画されないので
TrackRubberBand()の後に、CRect::NormalizeRect()で矩形を正規化
してみてください。
m_tracker.TrackRubberBand( ..略.. );
m_tracker.m_rect.NormalizeRect();
自己レス
> TrackRubberBand()の後に、CRect::NormalizeRect()で矩形を正規化
> してみてください。
Track()の後にも必要ですね。
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();
}
のように変更したけどダメでした。追加の仕方をまちがっていますか?
問題ないと思います…
なんででしょうね。
私の環境で試してみましたが、問題なく描画されております。
OnPaint()の処理をトラッカーの描画だけにしてもダメですか?
ダメでした.....
わかった。たぶん原因は↓コレです。
> CRVISIONView::~CRVISIONView()
> { //初期設定
> m_tracker.m_rect.SetRect(100,100,100,100);
> m_tracker.m_nStyle |= CRectTracker::resizeInside
> |CRectTracker::hatchInside;
> }
デストラクタじゃなくてコンストラクタで初期化しないと
ダメですね。
本当に申し訳ありません。
コンストラクタで初期化って、ドコですればいいんですか。
こんな初歩的なことを聞いて本当にすいません…
関数が定義されているところにかけばいいんでしょうか?
はい、そうです。そこに書いてください。↓のように
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;
}
できました!
ありがとうございました!
本当にうれしいです!
感謝感激です☆
長々と本当にありがとうございました!
もう見て無いかもしれませんけれど、
せめてC++言語の基礎知識はほしいですね。
話を見ているとC++言語とMFCの使い方とWindowsのアプリケーションの組み方を
同時に勉強しているように見えます。
この方法だと、なぜ、コンストラクタに書かないといけないのかとか
そもそもコンストラクタって何とか
そういう部分の知識が無いまま突き進んでしまって
後々苦労すると思います。
まずはMFCを使用しないで、ウインドウも出さないアプリ(コンソールアプリ)を
使った形で純粋にC++言語の勉強からやった方が良いと思いますよ。
C++言語の知識はVC++以外の環境でも役に立ちますしね。