MFC关于消息响应的宏代码

MFC 消息类型:三种 
1、命令消息(WM_COMMAND)  
所有派生自 CCmdTarget 的类都有资格接受WM_COMMAND。  
2、Window消息(WM_xxx)  
所有派生自 CWnd 的类都有资格接受 WM_xxx。  
3、控件消息(WM_NOTIFY)  
控件向其父窗口通知消息。  


消息处理:
1、WM_xxx 消息处理  
窗口类(自身)处理→基类处理→CWnd∷DefWindowProc()处理;  
其所对应的宏一般为在消息 WM_ 前面加上 ON_。  

2、命令消息处理  
命令消息来自命令用户界面对象(菜单、加速键或工具栏按钮)发出的WM_COMMAND消息;  
㈠、WM_COMMAND消息  
其所包含的类型和对应的宏如下:  
①、ON_COMMAND(ID,pfn)  
标准的命令消息;  

②、ON_COMMAND_EX(ID,pfn)  
多个对象对同一个命令 ID 的处理;  
其函数的原型如下:  
afx_msg BOOL pfn(UINT nID)  
说明:  
当返回 TRUE 时表示已经处理,不用在消息处理链中继续处理该命令;为 FALSE 时表示继续在消息处理链中处理该命令。  
注意:  
其一:在多对象处理中一定要使用该宏;  
其二:pfn(UINT nID)(消息处理函数)返回值将其类型void改成BOOL,而且必须为FALSE;  
其三:多个对象的处理是由高层向低层的过程:即视图类→文档类->主框架窗口类→应用程序类;  

③、ON_COMMAND_RANGE(nID,nLastID,pfn)  
多个命令 ID 提供相同的处理;  
注意:  
其一:确保nID、nLastID的值在 Resource.h 中是连续的。  
其二:一般在函数 pfn(UINT nID) 中加入参数,用来确定那一个按钮点击。  

㈡、CN_UPDATE_COMMAND_UI消息  
当菜单项、工具栏按钮等[命令用户接口对象]要更新其状态时所对应的消息,它所包含的类型和对应的宏如下:  
①、ON_UPDATE_COMMAND_UI(ID,pfn)  
其中函数的原型如下:  
afx_msg void pfn(CCmdUI* pCmdUI)  

②、ON_UPDATE_COMMAND_UI_RANGE(nID,nLastID,pfn)  
该函数可以处理一组[命令用户接口对象]的外观;  
其中函数的原型如下:  
afx_msg void pfn(CCmdUI* pCmdUI)  
重要:  
CCmdUI 中的 m_nID 成员表示不同的 ID,因此可以利用它来进行区别处理。  

3、控件的通知消息 


从控件和子窗口发送到父窗口的WM_COMMAND通知消息(即在发送命令消息中加入控件的通知码)。  
注意:在 Window9x 新控件中不再传送WM_COMMAND通知消息,而是发送 WM_NOTIFY 消息,但为了兼容,旧有的控件还是传送WM_COMMAND消息。  
例如:  
CEdit控件向父窗口发送 EN_CHANGE 通知代码的WM_COMMAND消息。  
注意:框架像传送其它 WM_ 消息一样传送通知消息,但有一个例外,即由 [按钮] 控件发送的 BN_CLICKED 通知消息,被作为命令消息特别处理。  
㈠、WM_COMMAND 其所对应的宏如下:  
①、ON_CONTROL(通知码, nID,fn)  
②、ON_CONTROL_RANGE(通知码, nFirstID,nEndID,fn)  
注意:  
这两个宏的应用和 ON_COMMAND、ON_COMMAND_RANGE相同,所不同的是在宏前面加入[通知码]。  
注意:可以根据不同的控件的[通知码]派生出特定的宏,其所派生的宏一般为在 [通知码] 前面加上 ON_。 


㈡、WM_NOTIFY 其所对应的宏如下:  
①、ON_NOTIFY(通知码, nID,fn)  
其中函数的原型如下:  
afx_msg void fn(NMHDR* pNotifyStruct,LRESULT* result)  
其中结构:  
typedef struct tagNMHDR {   
HWND hwndFrom; //发送通知消息的控件的句柄;  
UINT idFrom; //发送通知消息的控件的 ID;  
UINT code; //通知码;  
} NMHDR;   

②、ON_NOTIFY_EX(通知码, nID,fn)  
表示一个消息在多个对象的成员函数中进行处理。  
其中函数的原型如下:  
afx_msg BOOL fn(UINT nID,NMHDR* pNotifyStruct,LRESULT* result)  
说明:  
它必须返回 BOOL 类型的数值,其意义和 ON_COMMAND_EX 相同。  

③、ON_NOTIFY_RANGE(通知码, nFirstID,nEnd,fn)  
表示多个控件的通知消息在同一个函数中进行处理。  
其中函数的原型如下:  
afx_msg void fn(UINT nID,NMHDR* pNotifyStruct,LRESULT* result)  
说明:  
其意义和ON_COMMAND_RANGE相同。  

4、"反射"消息处理  
父窗口在处理控件窗口的通知消息WM_CTLCOLOR、WM_COMMAND、WM_NOTIFY时,会把该消息转化为反射消息,并转交给控件子窗口处理,只有在控件子窗体不处理该消息时,父窗口才有机会处理。  
注意:在类的属性对话框中的消息页面可查反射消息(前面有"="标志)  
①、WM_CTLCOLOR_REFLECT反射消息  
其所对应的宏如下:  
ON_WM_CTLCOLOR_REFLECT()  
反射消息函数的原型:  
HBRUSH class_name∷CtlColor(CDC* pDC,UINT nCtlColor)  
{  
return NULL;  
}  
该函数用来重置控件的顔色;注意:必须 return CBrush才有效。  


5、自定义的窗口消息  
自定义窗口消息的消息标志都大于WM_USER(至少是WM_USER+100,因为许多控件都使用这一范围的WM_USER消息)  
使用自定义的消息分为二步:  
①、在 Resource.h 中定义消息标记  
#define WM_MYMSG (WM_USER+1000)  

②、在消息映射表中加入消息映射宏  
BEGIN_MESSAGE_MAP()  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值