vc++ 自定义消息和WM_NOTIFY消息实现

来源:互联网 发布:数据库基础是啥 编辑:程序博客网 时间:2024/04/29 22:25

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



 
原创粉丝点击