MFC框架

 

  • 如今直接給出MFC程序執行順序,但着重分析其運行機制和功能分析,其流程是「theApp全局對象定義->TestApp構造函數->WinMain函數」。在執行theApp對象的構造函數以前先執行CWinApp基類的構造函數,從而把咱們本身建立的類和MFC類相關聯起來了。

 

 

 

  •  文檔應用程序中,都有五個類,部分類名和工程名相關聯。在MFC程序有且僅有一個從應用程序類(CWinApp)派生的類,並且僅有一個該派生類的實例化對象

 每一個窗口會有一個稱爲窗口過程的回調函數(WndProc),它帶有四個參數,分別爲:窗口句柄(Window Handle), 消息ID(Message ID), 和兩個消息參數(wParam, lParam), 當窗口收到消息時系統就會調用此窗口過程來處理消息。(因此叫回調函數)html

 

  •        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發送的消息是非隊列消息, 被直接送到窗口過程處理函數

  1. PostMessage:把消息放到指定窗口所在的線程消息隊列中後當即返回。 PostThreadMessage:把消息放到指定線程的消息隊列中後當即返回。 
  2. SendMessage:直接把消息送到窗口過程處理, 處理完了才返回。
  3. PeekMessage會當即返回 能夠保留消息
  4. GetMessage在有消息時返回 會刪除消息
  5. TranslateMessage: 把一個virtual-key消息轉化成字符消息(character message),並放到當前線程的消息隊列中,消息循環下一次取出處理。
  6. TranslateAccelerator: 將快捷鍵對應到相應的菜單命令。它會把WM_KEYDOWN 或 WM_SYSKEYDOWN轉化成快捷鍵表中相應的WM_COMMAND 或WM_SYSCOMMAND消息, 而後把轉化後的 WM_COMMAND或WM_SYSCOMMAND直接發送到窗口過程處理, 處理完後纔會返回。
  • 用戶自定義消息 
  1. 首先須要聲明消息 #define WM_MESSAGE 0x200
  2. 聲明消息響應函數  在文件中的說明
  3. 實現消息響應函數
  4. 消息映射到消息處理函數

          

本文參考自下面幾篇文章post

https://blog.csdn.net/huangguangzhi88/article/details/85368700spa

https://blog.csdn.net/csdn_222/article/details/79404507.net

http://www.javashuo.com/article/p-tahcdjuz-kk.html線程

相關文章
相關標籤/搜索