MFC中的消息處理函數


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);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM