在VC中,窗口的主要通信方式就是通过消息了,是MFC中很重要的一部分,花了一段时间终于把这个搞懂了,下面就说说想窗口发送消息的方法:
1.首先需要确定和定义消息类型,如系统消息、用户自定义消息等。如果是自定义消息就得自己定义消息ID了,其实就是一个的用 来唯一标示Msg的整型数,在头文件中加入,如下:
#define WM_MYMSG WM_USER+1;
当然这个ID是不能随便定义的,需要在一定的范围,具体的说明如下:
0 through WM_USER–1 Messages reserved for use by the system.
WM_USER through 0x7FFF Integer messages for use by private window classes.
WM_APP through 0xBFFF Messages available for use by applications.
0xC000 through 0xFFFF String messages for use by applications.
Greater than 0xFFFF Reserved by the system.
如上所述,其实范围就是0x0400~0x7FFF这段了,呵呵。
2. 消息ID确定了,就需要确认消息的响应函数,格式如下:
afx_msg LRESULT OnMsgFunc(WPARAM iParam1,LPARAM iParam2) ;
在头文件中定义,并在cpp中实现之。
3.添加消息映射
在cpp中找到消息映射代码段,出入消息映射ON_MESSAGE
BEGIN_MESSAGE_MAP(CTRAirPortProjDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_LBUTTONDOWN()
ON_WM_ERASEBKGND()
ON_MESSAGE(WM_MYMSG,&CTRAirPortProjDlg::OnMyMsg)
END_MESSAGE_MAP()
到处为止,我们已经为一个窗口添加了消息ID和处理函数了,那么怎么想窗口发送消息呢?有2个函数可以:
1.SendMessage
函数原型:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
参数:
hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶
层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
Msg:指定被发送的消息ID。
wParam:指定附加的消息指定信息。
IParam:指定附加的消息指定信息。
返回值:返回值指定消息处理的结果,依赖于所发送的消息。
例如:SendMessage(this->m_hWnd,WM_MYMSG,0,0);
2.PostMessage
函数原型:B00L PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
与SendMessage是类似的,主要区别是:
PostMessage消息发出后不等消息函数处理完就执行它的下一语句 (异步)
SendMessage消息发出后阻塞等消息函数处理完执行它的下一语句 (同步)