2011-07-22 16 views
3

私はオープンソースプロジェクトのコードをいくつか調べていますが、これはWin32アプリケーションを扱うのは初めてのことです(主にコンソールのものでした)。私はコード内のいくつかの関数がLRESULT CALLBACKを返すので、ウィンドウプロシージャであることがわかります。DispatchMessageはどのWndProcを使用するかをどのように決定しますか?

DispatchMessageが正しいWndProcを呼び出すか、正しいWndProcを単独で決定できる方法でコード化されたDispatchMessageであることを確認するためにプログラマが何かしなければならないことはありますか?


EDIT:

私はDispatchMessageを(定数MSG *)は、アプリケーションでのWndProc年代別の間で選択する方法は、渡されたMSGオブジェクトのウィンドウハンドル部材(HWND)に基づいていることを推測しています[前の文があまりにも混乱しないことを望みます]たとえば、メッセージがメインウィンドウではなくアプリケーションの編集ウィンドウ用であった場合、DispatchMessageは特定のクラスのWndProcメンバ関数を選択します編集ウィンドウはオブジェクトです。メッセージがメインウィンドウのものだった場合、メインウィンドウがオブジェクトであるクラスのWndProcメンバ関数が選択されます(私にとって、このクラスはNotepad_plus_Windowクラスになります)。しかし、これは単なる考えです。私はそれをバックアップすることはほとんど見当たらなかったので、誰かがこれを確認できるならばうれしいだろう。

答えて

2

はい、MSG.hwndを使用して正しいウィンドウにメッセージを送信します。注目すべき1つは、ウインドウクラスにではなくウインドウに関連付けられたWndProcを使用することです。ウィンドウは、ウィンドウクラスのインスタンスです。同様に見てみる価値があるかもしれないマイクロソフトの「フードの下には」DispatchMessageを(のかなり詳細なpseudo-codeでこれを示しているの

This記事))

+0

あなたは言った: 'それはウィンドウに関連付けられたWndProcを使用します、ウインドウクラスではない。しかし、WndProcをwindowクラスに関連づける方法:windowクラス、つまりwc.lpfnWndProc = WndProc; –

+0

はい、しかし、あなたはいつでも、SetWindowLongPtrを呼び出すことによって特定のウィンドウのWndProcを変更することができます。その場合、ウィンドウのWndProcはウィンドウクラスのために与えられたウィンドウとは異なります。 – Vishal

+0

[SetWindowLongPtr](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644898%28v=vs.85%29.aspx)説明: '呼び出し中 '** SetWindowLongPtr **' '** SetWindowLongPtr **'関数は、特定のウィンドウクラスに関連付けられたウィンドウプロシージャを変更することによってウィンドウサブクラスを作成します。これは、 '** GWLP_WNDPROC **'インデックスによってウィンドウを作成するためのウィンドウクラスのサブクラスを生成します。システムは以前のウィンドウプロシージャの代わりに新しいウィンドウプロシージャを呼び出すようになります。これは、1つの_WndProc_が常に1つの_Window Class_を関連付けることを明確にします。それじゃない? –

関連する問題