CFormViewで再描画

[戻る]
shishimaru 2002/07/17(水) 18:55:54
はじめまして.
VC++6.0を使ってMFCベース,SDIでアプリを作っています.
ボタンをクリックしてピクチャボックスに絵を表示するようなアプリなんですが,
最大化,最小化ボタンを押すと,
それまでピクチャボックスに表示されていた物が消えてしまいます.

どなたかアドバイスをお願いします.

PATIO 2002/07/18(木) 10:29:11
ピクチャボックスは単に描画位置をリソースで動かしたいから
使っているだけだと思いますけれど、
絵を表示するコードはピクチャボックスのDCを取ってきて
そこに描画しているではないですか?
さらにその描画部分はボタンを押された時のハンドラにしかないと。

ウインドウズの描画の仕組みを理解していない所為です。
ウインドウズで画面の描画を行う場所というのは特定のハンドラ内に
無ければなりません。そうしないとOSが再描画を要請した時に
描画されないからです。
ウインドウの再描画が必要になるタイミング(最小化や最大化、
重なっていた他のウインドウが移動した等々)でOSが各ウインドウに
WM_PAINTメッセージを投げるので各ウインドウはこのメッセージが
来たらいつでもウインドウの再描画が出来るようにコードを書く必要が
あるのです。従って画面の描画にかかわるコードはこのメッセージの
ハンドラ内にコードがあるか、ハンドラ内から呼び出される関数の中に
記述されている必要があります。
ボタンのクリックハンドラで描画をしてもよいのですが、
同じコードがWM_PAINTのハンドラ内からも呼ばれている必要があります。
この辺はウインドウズの基本ですから、よく勉強してくださいね。

shishimaru 2002/07/18(木) 19:25:02
PATIOさん

>ピクチャボックスは単に描画位置をリソースで動かしたいから
>使っているだけだと思いますけれど、
>絵を表示するコードはピクチャボックスのDCを取ってきて
>そこに描画しているではないですか?
>さらにその描画部分はボタンを押された時のハンドラにしかないと。

まさに,そのとおりです.

だいたい書かれている内容で,
仕組みが分かったのですが,
WM_PAINTのハンドラが少しよく分かりません.
実際にどこでそれを行っているのか見つけられませんでした.

PATIO 2002/07/19(金) 10:14:51
クラスウイザードの使い方はマスターされていますか?
ここからハンドラ-の追加が出来ます。

また、クラスビュウからもハンドラの追加が出来ますよ。

WM_PAINTでHELPを検索すれば出てきそうな気もするのですけれど、
見つけられませんでしたか?

CWndクラスのHELPを覗いていても同じような名前のハンドラが説明されていると思いますよ。
ちなみに、Doc-Viewアーキテクチャを使っている場合、描画の実装ハンドラ若干異なります。
これについてはDoc-ViewアーキテクチャのHELPの説明を熟読しましょう。

shishimaru 2002/07/19(金) 13:15:51
[[解決]]
クラスウイザードでハンドラを追加し,
ボタンの描画コードを写したらできました.

どうも,ありがとうございました.

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