hur.cn - 华软网

 热门搜索

关于 MFC 消息机制的若干问题

  作者:未知    来源:网络    更新时间:2011/1/12
我的问题主要是针对以下被引用帖子的。

1 文中提到 ON_COMMAND_RANGE 参数 nID 和 nlastID 在 Resource.h 中必需接连。请问这意味着什么?是否是 nID 和 nlastID 如果在 Resource.h 中是接连的,那他们之间的 ID 就是接连的?另有,写程序的时候如何确认 nID 和 nlastID 在 Resource.h 中是接连的?

2 似乎 Window 消息和 控件消息 也包括了 命令消息?这三者的关系究竟是怎样的?

3 通知码是什么?为什么要定义通知码?

4 在 ON_COMMAND_EX 中提到的 多对象措置惩罚 是什么?

我对 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相同。


---华软 网友回答---
nID 和 nlastID 在 Resource.h 中必需接连

这个是指他们的值接连的,是否是放一起没关系,如果不是接连能够手动修改,别和其余地方重了就行,另外要注意修改:_APS_NEXT_CONTROL_VALUE的值,这个要比当前所用的所有id都要大就行

你多看看书啊,书看完了陌生再慢慢问吧,别看一个就问,后面应该有详细叙述的
---华软网友回复---
引用 1 楼 varding 的回复:
nID 和 nlastID 在 Resource.h 中必需接连

这个是指他们的值接连的,是否是放一起没关系,如果不是接连能够手动修改,别和其余地方重了就行,另外要注意修改:_APS_NEXT_CONTROL_VALUE的值,这个要比当前所用的所有id都要大就行

你多看看书啊,书看完了陌生再慢慢问吧,别看一个就问,后面应该有详细叙述的

谢谢,这是他人的帖子,不是书上的。我有一只眼睛过了800度了,不敢看书了。
---华软网友回复---
  class="deleted_message"> 该回复于2011-01-13 14:33:27被版主删除
---华软网友回复---
1、你理解的是正确的,如何确认那打开Resource.h看一下就是了
2、windows消息是对所有系统里用到的消息的总称,控件消息是一个控件所包括的全数消息,命令消息专指command消息,其消息宏是WM_COMMAND
3、这里的通知码其实就是消息参数,这里的通知码用于区分不同的消息
4、每一个对象都能够定义自己的消息,多个对象通过一个宏来实现映照自然要区分不同的对象

我觉得我这么回答你不一定会满意
不过你说的800度的近视不敢看书
我在想看电脑不伤眼睛?
那你能够找些电子版的书来看
---华软网友回复---
能够看看MFC深入浅出~      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。