• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:InvalidateRect Windowsアプリ)

InvalidateRect Windowsアプリ

このQ&Aのポイント
  • WindowsアプリケーションでのInvalidateRectの動作について質問です。
  • 他のcppファイルでInvalidateRectを使用したところ、WM_PAINTにメッセージが送られない状況です。
  • hParentを用いてInvalidateRectを呼び出していますが、描画処理が行われません。どのように対処すべきでしょうか。

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

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

ひょっとして、InvalidateRectの代わりにUpdateWindowを使いましたか? UpdateWindowは、無効領域がある場合に描画をするので、InvalidateRectと一緒に使用しなければなりません。

panic_snow
質問者

お礼

回答ありがとうございます。 >ひょっとして、InvalidateRectの代わりにUpdateWindowを使いましたか? ご指摘していただいたとおりです。   InvalidateRect(hParent, NULL, FALSE);   UpdateWindow(hParent); のようにしたらWM_PAINTにメッセージを送ることができました。 ありがとうございました!

その他の回答 (1)

回答No.1

InvalidateRectは、Windowsに対して対象のウィンドウに無効領域があることを知らせます。 しかし、Windowsはすぐに描画をするわけではありません。 処理に優先順位をつけ、優先順位の高い処理から行います。画面の更新は、Windowsの処理の中ではかなり優先順位の低い部類に入ります。そのため、重い処理をすると、画面が更新されなくなったりすのです。 そもそもWindowsの場合、1つのメッセージを処理している間は、基本的に別のメッセージを処理できません。メッセージを処理して、WndProcからWindowsへ制御を移さないと、次のメッセージの処理は走りません。なので、無限ループのように長時間Windowsに制御を戻さないようなことをすると、画面の更新どころかボタンクリックなどの処理もされなくなります。 というわけで、InvalidateRectを実行しても、すぐに画面が更新されるわけではありません。 すぐに更新したい場合は、UpdateWinodwを呼び出します。

panic_snow
質問者

補足

早速の回答ありがとうございます。 m-take0220さんの回答を引用させていただきます。 >InvalidateRectを実行しても、すぐに画面が更新されるわけではあり >ません。すぐに更新したい場合は、UpdateWinodwを呼び出します。 早速、UpdateWindow(hParent); として使ってみましたがダメでした。 >無限ループのように長時間Windowsに制御を戻さないようなことをす >ると、画面の更新どころかボタンクリックなどの処理もされなくなりま >す。 InvalidateRect使用時でもUpdateWindow使用時でもどちらも重いような感じで、確かにボタンクリックなどもできなくなっていました。 通常InvalidateRectは、WM_TIMERの中で使うことが一般的かと思われます。しかし、私の場合、WM_COMMANDで、WPARAM wParam(コマンドメッセージ?) にIDM_MOVIE(メニュー[動画]が選択)が来たときに、処理が書いてある他ファイルの関数を呼び出し、そこで InvalidateRectしようとしているので、おかしなことになっているのかもしれないです。 プロジェクトのイメージとしては、   (1)メニュー[動画]が選択されたときは、     InvalidateRectなどを使い、描画する モード   (2)メニュー[計算]が選択されたときは、     描画は一切せずに、何らかの計算結果を出力する モード のように、2つの機能を有したものを1つのプロジェクトで作ろうと思ってます。 この2つのモードをうまく機能させたいのですが、どのように書くのが良いでしょうか? もしかしたら私の方法が根本的におかしいのかもしsれないので、何かアドバイスあればお願いします。

関連するQ&A