再描画がされない

[戻る]
takasi 2004/11/02(火) 13:20:13
開発環境はWinXPでVC.net2002を使用しています。
FormViewで画像を表示するプログラムを開発しています。

void CsampleView::OnFileNewFrame()
{
CClientDC myPictDCban(&m_pict);
    CDC workDC;
    CBitmap myBMP;
    myBMP.LoadBitmap(IDB_BAN);
    workDCban.CreateCompatibleDC(&myPictDC);
    CBitmap* banBMP = workDCban.SelectObject(&myBMP);
    myPictDCban.BitBlt(0,0,386,386,&workDCban,0,0,SRCCOPY);
}
と書いたのですが再描画が行われませんどうすればよいでしょうか?

たく [E-Mail] 2004/11/02(火) 15:17:54
.Netはよく知りませんが、
CsampleView::OnDraw
で描画すればよいのではないでしょうか?
普通はそうします。

Takahashi 2004/11/02(火) 16:00:14
ちょっと状況は違うんですけど、
以前、同じ様な現象がでたことがありました
そのときは UpdateWindow したら表示された様な記憶が・・・

#ちなみに私の場合はピクチャーボックスに描画しようとしてたときです
#違ったらごめんなさい

Takahashi 2004/11/02(火) 16:06:35
あ、すいません多分駄目かもです WM_PAINT 送信するって書いてるし・・・

たくさんの仰るとおり描画を OnDraw に書いてOnFileNewFrame()で

Invalidate()
UpdateWindow()

すれば大丈夫かな(自信なしです)

#早とちり・・・すいませんでした(^_^;

PATIO 2004/11/04(木) 11:03:43
MFCでしかもDoc-Viewアーキテクチャを使用しているのでしたら
描画するロジックはOnDrawの中に記述するのが本当だと思います。
どうしても他の所でも呼びたいのであれば、描画部分のみを別関数にして
CDC等は引数で引き渡すようにし、OnDrawからも呼び出すようにしないと
OSから再描画が行われた時点で描画していた内容は消えてしまうと思います。

ビュークラスを使用する場合、描画のときに最終的に呼ばれるのは、OnDraw関数です。
で、OnDrawを直接呼んでも、Windowsに無効化された領域がなければ、
実際には描画が行われないのでOnDrawを直接呼んでも駄目です。

私は、基本的にOnDraw内に描画ロジックを集中させて、
InvalidateやInvalidateRect等で画面を無効化して再描画させています。
無効化すれば、OSから再描画が促されます。

この辺の組み方はWindowsの描画の仕組みをきちんと理解していないと
多分、わからないと思うのでその辺の勉強をされる事をお勧めします。

因みにOSがウインドウの再表示を行うときはビュークラスを使っていれば、
最終的にはOnDrawが呼ばれますので、ここに描画ロジックが集中していないと
他のウインドウを上に乗せてから外し、ウインドウの再描画をさせると
OnDraw以外のところで描画した結果はなかった事にされてしまいます。

PATIO 2004/11/04(木) 11:05:11
誤字訂正

誤)
で、OnDrawを直接呼んでも、Windowsに無効化された領域がなければ、

正)
で、OnDrawを直接呼んでも、ウインドウに無効化された領域がなければ、

takasi 2004/11/05(金) 10:53:22
[[解決]]
皆さんアドバイスありがとうございました。おかげで解決しました。
これからはもう少し自分で勉強してから質問を行いたいと思います。

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