【MFC系列-第9天】MFC消息映射机制的原理
關注公號【逆向通信猿】更精彩!!!
第9天 MFC消息映射機制的原理
9.1 對話框常用的回調函數
a)窗口創建時的消息和虛函數包括:WM_CREATE,WM_INITDIALOG,和PreSubclassWindow等;
b)窗口關閉時的消息和虛函數:WM_CLOSE,WM_DESTROY以及OnOK和OnCancel等。
c)有些消息是所有窗口都通用的,例如:WM_CREATE、WM_CLOSE和WM_DESTROY等。
d)有些消息和虛函數是對話框專用的回調函數,例如:WM_INITDIALOG消息以及OnOK、OnCancel等虛函數。
9.2 WM_CREATE和WM_INITDIALOG消息:
a)通過MSDN的說明可以查看到,WM_CREATE和WM_INITDIALOG都是是窗口剛創建時的回調消息;
b)當窗口還未顯示出來之前,對窗口做預先處理的回調函數。
c)WM_CREATE是所有窗口通用的創建時回調消息,用于包括對話框、MDI或者SDI等任何窗口的初始化,對應的消息映射函數是OnCreate。
d)可以在該函數中編寫代碼,在窗口剛創建還未顯示時,修改父窗口屬性或者創建內部子窗口。
e)WM_INITDIALOG對話框是對話框專用消息,最常用來初始化對話框及其內部控件,對應的消息映射函數是OnInitDialog。
f)這個函數內部第一行一般是先執行基類函數CDialog::OnInitDialog,基類函數執行過程會將所有對話框資源模板內的控件都創建完畢因此可以在該函數中,編寫代碼來對子窗口的做初始化設置。
g)PreSubclassWindow比OnCreate函數更早調用。
9.2 系統關閉過程:WM_SYSCOMMAND->WM_CLOSE->OnCancel->WM_DESTROY
a)WM_SYSCOMMAND:是對所有系統菜單中的命令的管理(包括:最大化、最小化、關閉、移動、大小等)
b)WM_CLOSE:是WM_SYSCOMMAND關閉分支消息
c)WM_DESTROY:窗口的句柄還在,以及子窗口都可以使用:窗口已經處于不可見狀態,并且不能取消關閉了
d)任何窗口包括控件、框架和對話框窗口關閉時,必經此消息,甚至一些程序員把這個消息當做析構函數使用了。
9.3 SendMessage和PostMessage
a)消息回調函數的返回值
{//消息回調函數switch (uMsg){case WM_CLOSE://ShowWindow(hwndDlg, SW_MINIMIZE);MessageBox(hwndDlg, _T("關閉"), ("提示"), MB_OK);return TRUE;// TRUE代表系統不用關閉了 FALSE代表系統繼續關閉返回值類型不同:兩個函數的4個參數的意義是一樣的,只有返回值類型不同(其實從數據上看他們一樣是一個32位的數,只是意義不一樣);
b)SendMessage的返回值類型是LRESULT:表示的是消息被處理后的返回值
PostMessage的返回值類型是BOOL:表示的是消息是不是傳遞成功。
c)PostMessage 是異步(不等待)的,SendMessage 是同步(阻塞)的。
PostMessage只把消息放入窗口消息隊列中,不管消息被處理后的結果就返回;而SendMessage等待消息被處理完了之后才返回。
d)如果在同一個線程內,常常使用SendMessage發送消息時,速度快并能得到返回的消息處理結果。在不同線程或者進程之間,一般使用PostMessage發送消息,把消息先放入目標窗口的消息隊列中,然后由目標窗口通過消息循環自行派發處理。
e)SendMessage和PostMessage函數都是消息傳遞函數,兩個函數的格式:
LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);9.4 消息分類:
a)系統消息:范圍是從0到WM_USER
WM_CREATE: ... ... WM_USER 1024b)用戶(自定義)消息:
WM_USER+1以后的所有消息都是用戶可以使用消息
c)Win32工程中直接把用戶消息(例如:UM_TEST),放到消息處理函數的switch分支即可;
d)MFC工程中在類向導中有專門的一個按鈕來創建“用戶自定義消息”,生成的代碼是ON_MESSAGE消息映射種類。
總結
以上是生活随笔為你收集整理的【MFC系列-第9天】MFC消息映射机制的原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雪人骑士天赋打野天赋(雪人骑士天赋打野天
- 下一篇: 【MFC系列-第10天】非模式对话框开发