VC消息映射
- 博客分类:
- 技术杂绘
VC消息映射
2010年08月14日
视类增加一个消息相应函数后,在源文件中都会增加三处代码。 1 消息相应函数原型。
在CDrawView中会有这样的代码:
// Generated message map functions
protected:
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
在DECLARE_MESSAGE_MAP()宏上有两个AFX_MSG注释宏,在这两个注释宏之间有一个函数原型OnLButtonDown,因为她位于两个注释宏之间,所以是以灰色显示,还函数声明的前部有一个afx_msg限定符,这也是一个宏。该宏表明这个函数是一个消息响应函数的声明。
AFX_MSG(CLASSNAME):
ClassWizard and AppWizard insert specially formatted comment delimiters in your source code files to mark the places in your files that ClassWizard can write to. AFX_MSG is used to mark the beginning and end of ClassWizard entries in your header file (.H) related to message maps
2 ON_WM_LBUTTONDOWN()消息映射宏
在CDrawView类的源文件中,有如下代码:
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_LBUTTONDOWN()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
在 上述代码中,BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP() 这两个宏之间定义了CDrawView类的消息映射表,其中有一个ON_WM_LBUTTONDOWN()这消息映射宏,这个宏的作用就是吧鼠标左键按下消息WM_LBUTTONDOWN与一个消息相应函数关联起来。通过这种机制,一旦有消息产生,程序就会调用相应的消息相应函数来进行处理。
3 消息响应函数的定义
在CDrawView的源文件中,可以看到OnLButtonDown函数的定义。
MFC消息映射机制的具体实现方法是:
在每个能接收和处理消息的类中,定义一个消息和消息函数静态对照表,即消息映射表。在消息映射表中,消息和对应的消息处理指针是成对出现的。某个类能处理的所有消息及其对应的消息处理函数的地址都列在这个类所对应的静态表中。当有消息需要处理时,程序只要搜索该消息静态表,查看表中是否含有该消息,就可知道该类能否处理该消息,如果能处理该消息,则同样依照静态表能很容易找到并调用对应的消息处理函数。
MFC消息映射的具体实现过程。MFC在后台维护了一个窗口句柄和对应的C++对象的对照表,以一个实例CDrawView类为例,与它的对象相关的有一个窗口,窗口当然有它的窗口句柄,该句柄与CDrawView对象的一个指针存在这意义对应关系,在窗口句柄与C++对招标中就维护了这种对应关系。当收到某一消息时,消息的第一个参数就指明该消息与那个窗口句柄相关,通过对照表,就可以找到与之相关的C++对象指针。然后把这个指针传递给应用程序框架窗口类的基类,后者会调用一个名为WindowProc的函数。 其具体代码如下:
LRESULT CWnd::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// OnWndMsg does most of the work, except for DefWindowProc call
LRESULT lResult = 0;
if (!OnWndMsg(message, wParam, lParam, &lResult))
lResult = DefWindowProc(message, wParam, lParam);
return lResult;
}
根据WindowProc函数的定义,我们发现它是一个虚函数。同时,也发现,CWnd::WindowProc函数内部调用了一个OnWndMsg的函数,真正的消息路由,也就是消息映射就是由此函数完成的。CWnd::OnWndMsgvirtual BOOL OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult );
Return Value
Nonzero if message was handled; otherwise 0.
Parameters
message
Specifies the message to be sent.
wParam
Specifies additional message-dependent information.
lParam
Specifies additional message-dependent information.
pResult
The return value of WindowProc. Depends on the message; may be NULL.
//CWnd::WindowProc
virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );//
nWndMsg部分代码如下:BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
LRESULT lResult = 0;
// special case for commands
if (message == WM_COMMAND)
{
if (OnCommand(wParam, lParam))
{
lResult = 1;
goto LReturnTrue;
}
return FALSE;
}
// special case for notifies
if (message == WM_NOTIFY)
{
NMHDR* pNMHDR = (NMHDR*)lParam;
if (pNMHDR->hwndFrom != NULL && OnNotify(wParam, lParam, &lResult))
goto LReturnTrue;
return FALSE;
}
OnWndMsg函数的处理过程是:
判断消息是否有消息响应函数。
判断的方法是在相应窗口类中查找所需的消息响应函数。因为传递给WindowProc函数的是窗口子类指针,所以OnWndMsg会到相应的子类头文件中查找,看看DECLARE_MESSAGE_MAP()宏之上,两个AFX_MSG注释宏之间是否有相应的消息响应函数原型的声明;再到子类的源文件中,看看BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间是否有相应的消息映射宏。
如果通过上述步骤,找到了消息相应函数,那么接着就会调用改响应函数,对消息进行处理。如果在子类中没有找到消息响应函数,那么就交由基类进行处理。
通过以上步骤,MFC就实现了具体的消息映射,从而完成了对消息的相应。
发表评论
-
评论 (
2012-01-20 12:01 663评论 ( 2011年10月04日 ... -
北京海淀区2011-2012学年度高三年级第一学期期末练习英语
2012-01-20 12:00 952北京海淀区2011-2012学年度高三年级第一学期期末练习英语 ... -
MFC消息处理和消息映射的概念
2012-01-19 16:49 1073MFC消息处理和消息映射的概念 2011年08月25日 ... -
Windows SDK编程(Delphi版) 之 消息处理
2012-01-19 16:49 508Windows SDK编程(Delphi版) ... -
在.net中基于Windows消息的IPC实现
2012-01-19 16:49 574在.net中基于Windows消息的IPC实现 2011年0 ... -
Delphi7 windows 消息处理机制
2012-01-19 16:49 1058Delphi7 windows 消息处理机 ... -
Linux集群的安装与并行计算
2012-01-17 06:33 623Linux集群的安装与并行 ... -
笔记本ThinkPad E425 1198-3LC
2012-01-17 06:33 1359笔记本ThinkPad E425 1198-3LC 2012 ... -
ITV常见故障错误代码(中兴平台)
2012-01-17 06:33 1232ITV常见故障错误代码(中 ... -
strerror和erron参数函数的试用(经典)
2012-01-17 06:33 777strerror和erron参数函数的试用(经典) 2011 ... -
nc.exe高级技巧应用汇总
2012-01-17 06:33 581nc.exe高级技巧应用汇总 2012年01月06日 文 ... -
今夜,笑到无眠……
2012-01-16 05:14 589今夜,笑到无眠…… 2009年08月18日 这个,这个, ... -
快乐女生””
2012-01-16 05:14 687快乐女生”” 2009年07 ... -
华人在美国开美甲店
2012-01-16 05:14 5261华人在美国开美甲店 2011年02月03日 标签:美甲店 ... -
雯琦恋の外国词曲比中国少
2012-01-16 05:14 683雯琦恋の外国词曲比中国少 2010年08月04日 最 ... -
明星真实QQ号码
2012-01-16 05:14 2330明星真实QQ号码 2012年01月04日 点击号码直接进 ...
相关推荐
VC消息映射与处理\基本键盘操作——判断按键消息
VC 消息映射与处理\创建和使用自定义消息
VC消息映射与处理\创建和使用键盘插入符
VC消息映射与处理\创建和使用鼠标提示框
VC 消息映射 消息机制
vc 内存映射文件.doc
MFC讲解消息映射的小例子,通过菜单选项讲解VC的消息映射原理
主要是通过一个基类来定义一个公用接口,派生类动态实现此接口,派生类对象用基类的构造函数来记录,消息传送时,可以是每个派生类对象分开,通过一个messageoperate来管理消息的传送,这样消息映射机制更加灵活。...
开发项目需要制作,radio控件及消息映射动态添加和删除
[VC]使用内存映射技术对文件进行倒序,主要是参考《Windows核心编程》的第17章
将文件内容映射到内存中的某个地址区域,然后可以直接操作内存来读写文 件,操作系统来负责处理数据的缓存,缓冲,写入和调入以及内存的分配和释放。 这样文件的输入和输出由操作系统来处理,可以提高应用程序的性能...
本程序可以实现VC下自动映射网络驱动器或者说是网络盘,给出来供大家参考。
VC++中使用内存映射编程方面的资料,希望对大家有用; 彻底共享,决不要分!
VC TCP端口映射源码.. ........................................
由于同一个命令,在不同的视图(或文档)可能有不同的解释,在这种情况下,必须多次为这个命令添加消息映射,为了不发生混乱,必须弄清楚命令消息响应顺序。下面将通过一个实例来说明命令消息的响应顺序。 更多内容...
vc内存映射文件在进程中的应用与研究毕业论文.doc
visual c++ vc使用内存映射文件mapping file处理大文件
VC6.0参考大全 VC6.0参考大全 VC6.0参考大全 VC6.0参考大全
VC++消息映射与处理\在视图窗口实现捕捉鼠标
我刚开始的时候,对vc的映射模式很模糊,看了这个例子后,就懂了,