1、在Windows API編程中,直接在消息處理函數中編寫WM_PAINT處理代碼。
2、在MFC中,CFrameWnd的消息處理過程在哪里呢?MFC時如何將消息處理函數和窗口關聯起來的。
在CFrameWnd::CreateEx中,調用PreCreateWindows來注冊窗口。
AfxDefRegisterClass(AFX_WNDFRAMEORVIEW_REG):注冊一個固定的窗口類,這個窗口類中的消息處理過程時一個固定的消息處理過程,
真正將我門的消息處理過程CWnd::WindowProc和我們的窗口進行關聯的代碼在AfxHookWindowCreate(this)函數中。
CFrameWnd::CreateEx中,調用AfxHookWindowCreate(this),將窗口類CFrameWnd::WindowProc的消息處理過程和CFrameWnd窗口進行關聯。
AfxHookWindowCreate(this)
::SetWindowsHookEx(WH_CBT, _AfxCbtFilterHook, NULL, ::GetCurrentThreadId());
這個函數在線程中,埋下一個鈎子,
找到鈎子函數,_AfxCbtFileterHook,在鈎子函數中下一個斷點。
在_AfxCbtFileterHook中,調用SetWindowLongPtr(hWnd, GWLP_WNDPROC, (DWORD_PTR)afxWndProc);
將我們創建的窗口pFrame和afxWndProc窗口處理過程和關聯(afxWndProc是MFC中的一個統一消息處理過程)
AfxWndProc調用AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam);
AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam)調用pWnd->WindowProc(nMsg, wParam, lParam);
3、CFrameWnd是一個窗口,那么這個類中,包含了消息處理函數,這個消息處理函數繼承自CWnd。
4、在CWnd中存在以下的這個函數,該函數就是消息處理函數。
virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam);