• ベストアンサー

プロシージャー関数で

visual c++を勉強し始めたばかりの超初心者なのですが 教えてください。  プロシージャー関数でVM_PAINT というmsgの場合は テキストを書きだしなさいと書かれているのですが どこにもmsg にVM_PAINTををセットしなさいと いうことが書かれていないにも関わらずちゃんと テキストが表示されます。 windowsからはいろいろなmsgが(ランダム)に 送られてきてたまたまVM_PAINTが送られてきたときに VM_PAINTが実行されるとされるということでしょうか?。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

>UpdateWindow関数が呼び出される時だったのですね >(と 理解しましたが、それでよいでしょうか?。) 違います。 ウィンドウが作成されたときを含めて、ウィンドウ内に無効領域がある場合に、WM_PAINTが発生します。 しかし、WM_PAINTは優先順位が低いので、他に優先順位が高いメッセージがあるうちは処理されません。優先順位の高いメッセージがすべて処理された後で、ようやくWM_PAINTの処理が実行されます。 その間に、別の原因で画面の再描画が必要と判断されたとしても、WM_PAINTは1回しか処理されないように調整されます。 UpdateWindowは、優先順位の高いメッセージがあっても、強制的にWM_PAINTを処理させたいときに使用します。 WM_PAINTを処理する場合は、BeginPaintとEndPaintなどを使って無効領域を処理したことを通知します。そうしないと、処理が終わっても無効領域がある場合には、WindowsがまたWM_PAINTを発生させます。描画処理をせずに、無効領域をなくしてWM_PAINTが発生しないようにするには、ValidateRect等の関数で無効領域をなくします。

ninufastar
質問者

お礼

ありがとうございます。浅学の私ですが良く理解できました。心から御礼申し上げます。ありがとうございました。

その他の回答 (2)

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

ウィンドウプロシージャとかのことを言っているんでしょうけど… >windowsからはいろいろなmsgが(ランダム)に ランダムなんてことはありません。 「さっきはWM_PAINTでコールしたから…そうだなぁ、次はWM_CREATEでコールしてみっか~wwww」 みたいなそのときの気分で動作しているワケではないですから。 >たまたまVM_PAINTが送られてきたときに >VM_PAINTが実行されるとされるということでしょうか?。 たまたま…じゃないんですけどね。 Windowsが、そのウィンドウに対して「描画が必要」と判定したときに必要な情報をセットしてコールします。 アプリが「描画は不要」と判断すれば、無視してもかまわないでしょう。 # そのかわり見た目正常に表示されなくなるかも知れませんが、プログラマが「それでいい」と作ったのなら正しい動作なのです。 まぁ、他のメッセージと違いWM_PAINTは少々手の入ったモノになっている…らしいですが。 # 複数のWM_PAINTを1つにまとめる場合がある。優先順位がちょっと低い。BeginPaint()~EndPaint()でOSが設定した無効領域を解除しないと再度送られてくる…等々。

ninufastar
質問者

補足

ご回答ありがとうございます。 再描画の必要があるときにWM_PAINTメッセージが 送られてくるのは当たり前に理解していたのですが 再描画ではなく一番最初に描画せよというメッセージ が送られてくるタイミングあるいは命令系統が わからなかったのです。 UpdateWindow関数が呼び出される時だったのですね (と 理解しましたが、それでよいでしょうか?。) ありがとうございました。

回答No.1

C, C++にプロシージャ関数という用語はありませんが・・・。

関連するQ&A