3

DefWindowProcによって処理されるメッセージとその方法に関するドキュメントはありますか?

最近、WM_SETFONT / WM_GETFONTが処理されていないことに気づきました。コードに間違いがあるかどうか、またはそれが予期される動作であるかどうかわからないため、次のWinMainを試しました。


   WNDCLASSEX wcx =
   {
      sizeof(WNDCLASSEX),
      CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, 
      DefWindowProc,
      0, 0,  // class/wnd extra bytes
      hInstance, 
      0,  
      LoadCursor(0, IDC_ARROW),
      0, 
      0,
      _T("some class"),
      0
   };

   ATOM a = RegisterClassEx(&wcx);
   _ASSERTE(a != 0);

   HWND wnd = CreateWindowEx(0, wcx.lpszClassName, NULL, 
                   WS_POPUP, 0,0,0,0, GetDesktopWindow(), 0, hInstance, 0);
   _ASSERTE(wnd != 0);

   HFONT font = (HFONT) GetStockObject(ANSI_VAR_FONT);
   _ASSERTE(font != 0);

   SendMessage(wnd, WM_SETFONT, (WPARAM) font, 0);
   HFONT font2 = (HFONT) SendMessage(wnd, WM_GETFONT, 0, 0);

   _ASSERTE(font2 == font);  // **FAILS**, font2 is 0
4

1 に答える 1

5

私の知る限り、いいえ。各ウィンドウメッセージは、多くの点の1つで異なる可能性がある、まれでユニークなものです。一部のメッセージは投稿されると予想され、他のメッセージは送信されます。

一部のメッセージはユーザーウィンドウプロシージャへの通知であり、その他のメッセージはDefXXXWindowProcハンドラー(DefWindowProc、DefDlgProc、DefMDIChildProcなど)へのコマンドです。

ダイアログとウィンドウのプロシージャで同じように処理されるものもあれば、異なる方法で処理される必要があるものもあります。

WM_SETTEXTおよびWM_SETREDRAWは、実際にはDefWindowProcがWND構造体の内部データ構造を変更するために使用するコマンドです。

WM_SIZEは、WM_WINDOWPOSCHANGEDに応答して、DefWindowProcによって独自のウィンドウに送信される単なる通知です。

WM_MOUSExxxメッセージは、送信する必要があります。送信しないでください。ウィンドウは、メッセージがGetMessage / PeekMessageで読み取られ、直接処理されて投稿されないモーダル状態になることがよくあります。

多くのメッセージは通知のように見えますが、ウィンドウマネージャーの実装に「密かに」使用されるため、常にDefWindowProcに渡す必要があります。(WM_ACTIVATEとその仲間たち)。

ほとんどのメッセージは、FALSE(またはTRUE)を返すことでダイアログプロシージャで処理できます。意味のある結果を得るにはSetDlgResultを使用する必要があるメッセージもあれば、ダイアログプロシージャがDialogProcからのゼロ以外の結果が対応することを認識しているため、自動的に処理されるメッセージ(WM_CTLCOLOR *)もあります。戻るLRESULT。

一部の(WM_SYSCOMMAND)は、実際にはウィンドウへのメッセージではなく、ウィンドウマネージャータイプの処理(デスクトップのタイルなど)を行うためにDefWindowProcによって処理されるだけです。

これらの違いを分類するための公式ドキュメントには実際の試みはありません。


WM_SET/GETFONTこの問題に具体的に対処するためWM_SETFONTに、は、定義されたメッセージではありますが、DefwindowProcによって処理されないため、明示的にサポートしていないウィンドウクラスによって処理されません。コントロール(EDIT、STATICなど)とダイアログはとをサポートWM_SETFONTWM_GETFONTます。アプリケーションに登録されたクラスでそれをサポートするには、実際のカスタムWindowProcを提供し、そこでメッセージを処理する必要があります。

于 2010-06-04T15:26:46.170 に答える