一、在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;