MFC框架结构简述
- 現在直接給出MFC程序執行順序,但著重分析其運行機制和功能分析,其流程是“theApp全局對象定義->TestApp構造函數->WinMain函數”。在執行theApp對象的構造函數之前先執行CWinApp基類的構造函數,從而把我們自己創建的類和MFC類相關聯起來了。
- ?文檔應用程序中,都有五個類,部分類名和工程名相關聯。在MFC程序有且僅有一個從應用程序類(CWinApp)派生的類,而且僅有一個該派生類的實例化對象
?每個窗口會有一個稱為窗口過程的回調函數(WndProc),它帶有四個參數,分別為:窗口句柄(Window Handle), 消息ID(Message ID), 和兩個消息參數(wParam, lParam), 當窗口收到消息時系統就會調用此窗口過程來處理消息。(所以叫回調函數)
- ? ? ? ?Windows內核維護著一個全局的系統消息隊列;按照線程的不同,系統消息隊列中的消息會分發到應用程序的UI線程的消息隊列中;
- ? ? ? ?應用程序的每一個UI線程都有自己的消息循環,會不停地從自己的消息隊列取出消息,并發送給Windows窗體對象;
- ? ? ? ?Windows消息也可以分為隊列消息和非隊列消息。在隊列消息中,消息會先保存在消息隊列中,消息循環會從此隊列中取出消息并分發到各窗口處理 如:WM_PAINT,WM_TIMER,WM_CREATE,WM_QUIT,以及鼠標,鍵盤消息等。在非隊列消息中,消息會繞過系統消息隊列和線程消息隊列,直接發送到窗口過程進行處理 如:WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR,WM_WINDOWPOSCHANGED
-
? ? ? ?線程消息隊列中WM_PAINT,WM_TIMER只有在Queue中沒有其他消息的時候才會被處理,WM_PAINT消息還會被合并以提高效率。其他所有消息以先進先出(FIFO)的方式被處理。
??注意:?postMessage發送的消息是隊列消息,它會把消息Post到消息隊列中; SendMessage發送的消息是非隊列消息, 被直接送到窗口過程處理
- 用戶自定義消息?
總結
- 上一篇: 解决:ClassNotFoundExce
- 下一篇: vue 2 使用 Bus.js 实现兄