一、在vc++ 里面通过SendMessage可以向窗口发送自定义消息,过程大致如下:
首先定义自定义消息ID
#define MY_MESSAGEID WM_USER+300
然后在消息映射表添加自定义消息映射
ON_MESSAGE(MY_MESSAGEID,MessageFun)
在头文件类里面声明消息响应函数
afx_msg LRESULT MessageFun(WPARAM wparam,LPARAM lparam);
在实现文件里面实现消息响应函数
LRESULT CtestDlg::MessageFun( WPARAM wparam,LPARAM lparam )
{
MessageBox(_T("ok"));
return 0;
}
在本例中CtestDlg为主窗体所以在其他窗体发送消息以如下的方式发送;
::SendMessage(AfxGetApp()->m_pMainWnd->m_hWnd,MY_MESSAGEID,0,0);
二、发送WM_NOTIFY消息
WM_NOTIFY主要用于自定义控件发生改变时,对父窗体进行通知
1.首先在父窗体定义消息映射表,如下:
#define MY_NOTIFYMESSAGE WM_USER+500
ON_NOTIFY(MY_NOTIFYMESSAGE,IDC_BUTTON1,NotifyMessageFun)
2.在类里面声明消息响应函数
afx_msg void NotifyMessageFun(NMHDR *nmhdr,LRESULT *result);
3.在cpp文件里面实现该消息响应函数
void CtestDlg::NotifyMessageFun( NMHDR *nmhdr,LRESULT *result )
{
MyNMHDR *mynhdr=(MyNMHDR*)nmhdr;
MessageBox(mynhdr->str);
}
4.向父窗体发送消息:
MyNMHDR nhdr;
nhdr.nmhdr.code=MY_NOTIFYMESSAGE;
nhdr.nmhdr.hwndFrom=GetDlgItem(IDC_BUTTON1)->m_hWnd;
nhdr.nmhdr.idFrom=IDC_BUTTON1;
strcpy(nhdr.str,"ok");
::SendMessage(m_hWnd,WM_NOTIFY,0,LPARAM(&nhdr));
上面的MyNMHDR是自定义的结构体,定义如下
typedef struct
{
NMHDR nmhdr;
char str[20];
}MyNMHDR;
如果仅仅是向父窗口发送一个“通知”,那么使用默认的NMHDR结构体就已经够了,NMHDR是系统定义的结构体,定义如下:
typedef struct tagNMHDR
{
HWND hwndFrom;
UINT_PTR idFrom;
UINT code; // NM_ code
} NMHDR;
其中hwndFrom表示子控件的HWND,idFrom表示子控件的id,code表示表示消息ID,对应MY_NOTIFYMESSAGE
若需要同时传递一些附加的信息,就需要对NMHDR结构体进行扩充了。使用WM_NOTIFY发送通知的魅力就在于,用户可以根据自己的需要扩充任何附加信息进去。下面就是自定义的NMHDR结构体:
typedef struct
{
NMHDR nmhdr;
char str[20];
}MyNMHDR;
这个结构体内包含了NMHDR结构体。这里利用到了C/C++的一个著名的特性:C/C++语言不做内存越界检查。因此,对于自定义的结构体,只要把NMHDR放在第一个元素的地方,就可以安全地把该结构体转型为NMHDR。