关注公号【逆向通信猿】更精彩!!!
第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 1024
b)用户(自定义)消息:
WM_USER+1
以后的所有消息都是用户可以使用消息
c)Win32工程中直接把用户消息(例如:UM_TEST
),放到消息处理函数的switch分支即可;
d)MFC工程中在类向导中有专门的一个按钮来创建“用户自定义消息”,生成的代码是ON_MESSAGE
消息映射种类。