再描画がされない – プログラミング – Home

通知
すべてクリア

[解決済] 再描画がされない


takasi
 takasi
(@takasi)
ゲスト
結合: 20年前
投稿: 5
Topic starter  

開発環境は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);
}
と書いたのですが再描画が行われませんどうすればよいでしょうか?


引用未解決
トピックタグ
たく
 たく
(@たく)
ゲスト
結合: 21年前
投稿: 29
 

.Netはよく知りませんが、
CsampleView::OnDraw
で描画すればよいのではないでしょうか?
普通はそうします。


返信引用
Takahashi
 Takahashi
(@Takahashi)
ゲスト
結合: 21年前
投稿: 45
 

ちょっと状況は違うんですけど、
以前、同じ様な現象がでたことがありました
そのときは UpdateWindow したら表示された様な記憶が・・・

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


返信引用
Takahashi
 Takahashi
(@Takahashi)
ゲスト
結合: 21年前
投稿: 45
 

あ、すいません多分駄目かもです WM_PAINT 送信するって書いてるし・・・

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

Invalidate()
UpdateWindow()

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

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


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

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

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

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

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

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


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

誤字訂正

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

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


返信引用
takasi
 takasi
(@takasi)
ゲスト
結合: 20年前
投稿: 5
Topic starter  

皆さんアドバイスありがとうございました。おかげで解決しました。
これからはもう少し自分で勉強してから質問を行いたいと思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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