Picture Controlの再描画

[戻る]
hikaru 2016/05/26(木) 17:23:18
お世話になっております。
Visutal Studio2008上で、ダイアログベースアプリケーションを作成しています。

http://www.g-ishihara.com/mfc_dc_03.htm
や、
http://t-recipe.com/vc/redraw.html
を参考に、Picture Controlの再描画をCSubClassDlg::OnPaint()上に実装しようとしてい
ますが、
CDialog::OnPaint()が呼ばれるとすべて消されてしまいます。

原因と対処法がわかりましたら教えていただければと思います。
どうぞよろしくお願いします。

ITO 2016/05/26(木) 19:49:39
OnPaint()の内容は?
分かりますか?

AR 2016/05/27(金) 09:38:46
 書いてるOnPaint()の内容が不明なのと、どのようにOnPaint()を呼んでるかも不明なの
で外してたらすみません。
 一般には、RedrawWindow系なり、Invalidate系なり再描画をするときに子まで影響を及
ぼすか?背景を塗りつぶすか?という指定ができるので再描画の仕組みを試行錯誤してみ
るのも良いかと思います。
 おそらく、ダイアログのOnPaint()を呼ぶなかで、PictureコントロールのOnPaint()も
呼んでるので消えちゃってるんじゃないかと思ってます。

 このあたりの再描画の流れを把握してないのなら
>Picture Controlの再描画をCSubClassDlg::OnPaint()上に実装しようとしていますが、
 まずはPictureコントロールのOnPaint()に実装すると理解が進むんじゃないかと思います。

仲澤@失業者 2016/05/27(金) 15:07:01
派生元のダイアログの描画は、派生先のOnPaint()が実行された「後で」実行されます。
従って、派生先のOnPaint()で描画された結果は全て「上書き」され、失われます。
つまり、ダイアログの場合、派生先でOnPaint()内で何を書いても無効となります。

別の手段を考えましょう。

さて、どうしてもOnPaint()のタイミングで何かをしたいのであれば、
OnPaint()時に自身にカスタムなメッセージが、既存のコントロールが
反応しないWM_COMMANDなどを「PostMessage()」する方法もあります。
このメッセージは、派生元の再描画が完了後、自身に到達するはずです。

ITO 2016/05/28(土) 09:37:32
うーーん、
どちらにしろ、OnPaint()上に再描画の処理は実装しないとだめですね。
他のウインドウが重なるだけで消えてしまいますね。
スクリーンセーバが働いた後もだめだったかな?

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