2011-07-22 50 views
3

我正在通過一些開源項目的代碼,這是我第一次處理一個Win32應用程序(主要是做控制檯的東西)。我看到代碼中的幾個函數是windows程序,因爲它們返回LRESULT CALLBACK。DispatchMessage如何決定使用哪個WndProc?

有沒有程序員必須做的事情,以確保DispatchMessage調用正確的WndProc或DispatchMessage編碼的方式,它可以自己確定正確的WndProc?


編輯:

我猜的是在DispatchMessage方式(常量MSG *)在應用程序不同的WndProc的之間的選擇是基於窗口的句柄元件通過的MSG的對象(HWND)上[希望前面的句子不太令人困惑]例如,如果消息是針對應用程序的編輯窗口(而不是針對其主窗口),則DispatchMessage將爲特定類選擇WndProc成員函數編輯窗口是其中的對象。如果消息是針對主窗口的,那麼它會爲主窗口是對象的類選擇WndProc成員函數(對於我來說,這個類將是Notepad_plus_Window類)。但這只是一個想法。我沒有找到太多支持,所以如果有人能證實這一點,我會很高興。

回答

2

是的你是對的,它使用MSG.hwnd發送消息到正確的窗口。有一件事要注意,它將使用與窗口關聯的WndProc,而不是窗口類。一個窗口是一個窗口類的實例。微軟的「引擎蓋下」

This文章說明了這一點同)在DispatchMessage的相當詳細pseudo-code(這可能是值得考慮看看爲好)

+0

你說:'它將使用與窗口相關的WndProc,不是窗口類「。但是,我們如何將WndProc與窗口相關聯:通過窗口類,即'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)description says: 'Calling' ** SetWindowLongPtr **'使用'** GWLP_WNDPROC **'索引創建用於創建窗口的窗口類的子類... ** SetWindowLongPtr **函數通過更改與特定窗口類關聯的窗口過程來創建窗口子類,導致系統調用新窗口過程而不是先前窗口過程。「這說明一個_WndProc_總是關聯一個_Window Class_。不是嗎? –

相關問題