• ベストアンサー

処理中に動的に変化する変数をウィンドウプロージャで表示させるには?

Win32APIを使っています。 タイトルの通りウィンドウプロージャ以外(実際はダイアログプロージャ)である処理をしているとします。そこで変化する変数(時間など)をウィンドウに表示させ、かつ無効リージョンが発生しても大丈夫なようにしたいのですが、 現在は 処理を実行中に(ダイアログプロージャ内で)変数aが変わった瞬間、グローバル変数flag=TRUEにし、次に SendMessage(hwnd,WM_PAINT,0,0); を実行し、 ウィンドウプロージャでは case :WM_PAINT if(flag) "aを表示する命令"; という感じにしています。しかしこれでは表示してくれません。 どこか変なことしてますか? また別の方法はありますか? 必要であればソース見せます。 よろしくお願いします。

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> どこか変なことしてますか? ふたつ~みっつほどおかしなところがあります。 まず、WM_PAINT は自分で発行してはいけません。 ふたつめに、ダイアログプロシジャ内で SendMessage をしても、親のウィンドウは止まっているので、応答しません。 # ダイアログがモードレスならOK みっつめは、ウィンドウプロシジャにある「a を表示する~」の a がどこにあるか? # 多分、これもグローバルな変数なんでしょうが もし私なら、以下のようにします。 ・通知用のメッセージを決めておき、ダイアログからは、それを送る ・WM_PAINT では、通知された値を表示するだけにする ソースの雰囲気はこんな感じ。 /* 送り側 */ #define WM_SEND_MY_VALUE (WM_USER + 適当な値)   ... PostMessage(親, WM_SEND_MY_VALUE, 送る値, 0L); /* 受け側 */ static USHORT 取っておく変数;   ... case WM_SEND_MY_VALUE:   取っておく変数 = sParam;   InvalidateRect(このウィンドウ);   break;   ... case WM_PAINT:   ~ /* 取っておく変数の中身を使って表示 */

jimihenn
質問者

お礼

ありがとうございました。 目からウロコです。

その他の回答 (1)

  • driverII
  • ベストアンサー率27% (248/913)
回答No.1

ソースを見ないと正確には言えないと思いますが、 ダイアログであればラベル(スタティックテキスト)を用意しておいて、 SetWindowTextで、"aを表示" で、RedrawWindowかなんかで表示するのが一般的では(^^

jimihenn
質問者

お礼

ありがとうございました。 非常に参考になりました。

関連するQ&A