0

ダイアログ プロシージャでのメッセージ シーケンスが原因と思われる問題が発生しました。グローバル変数が増えるのを避けるために、WM_USER メッセージをダイアログに追加して、コントロールの色を設定しました。メッセージ処理コードは、単純に COLORREF を静的変数に格納しました。INITDIALOG で、(ダイアログ自体に対して) SendMessage(hDlg,WM_User...) を実行し、続いてダイアログ内の静的コントロールの SetDlgItemText を実行しました。WM_CTLCOLORSTATIC メッセージ処理コードは、静的コントロールの色、背景色、およびフォントを設定します。タスクバーからアプリを別のアプリに重ねるまで、すべてが期待どおりに機能しているように見えました. アプリを再構築すると、非表示になっていた静的コントロールの部分が目的の色から黒に変わりました。WM_CTLCOLORSTATIC メッセージによって変更されたフォント サイズも影響を受けないことに注意してください。この情報を再生成する方法はないため、ウィンドウのダイアログ処理でどこかに保存する必要があります。これはもちろん、アプリと Visual Studio の間の相互作用のため、デバッグすることはできません。グローバル変数を設定するだけで色を送信する SendMessage メソッドを置き換えると、問題はなくなりました。

それで、ダイアログに送信されるメッセージと、それらが送信される順序に興味がありますか? MSDN によると、メッセージがウィンドウによって処理されるまで、SendMessage は返されません。だから私はメッセージがこのように見える必要があると思います

WM_INITDIALOG starts

  WM_USER starts             (caused by the SendMessage call)
  WM_USER ends

  WM_CTLCOLORSTATIC starts   (caused by the SetDlgItemText call)
  WM_CTLCOLORSTATIC ends

WM_INITDIALOG ends

一方、静的コントロールは、WM_CTLCOLORSTATIC メッセージの前後に WM_SETTEXT メッセージを処理しています。WM_COMMAND/EN_CHANGE などの他のメッセージも生成および処理されると思います。

その場合、問題の原因や、SendMessages を削除することでどのように修正されたのかわかりません。

4

1 に答える 1

1

Windowsの何かがWM_USERメッセージも送信していたことが判明し、WM_APPに変更すると問題が解決しました。誰かがそれに返信したい場合に備えて、メッセージの順序についてまだ興味があります

廃止された WM_USERを参照してください。WM_APP を使用してください

于 2011-07-25T14:13:10.300 に答える