祝各位元旦快乐...元旦小放了点假,放松一下...继续前行
接着009菜单命令响应函数继续往后看,今天了解菜单命令的路由;
1.程序类对菜单命令的响应顺序
在前面的一篇中,菜单项命令是由CMainFrame类捕获的,这次我们通过建立类向导,选择别的类来实现test函数;
使用MessageBox或AfxMessageBox来提醒:
int MessageBox( LPCTSTR lpszText, LPCTSTRlpszCaption = NULL, UINT nType = MB_OK );
int AfxMessageBox( LPCTSTR lpszText, UINTnType = MB_OK, UINT nIDHelp = 0 );
由于后面两个参数有默认值,给第一个参数的值即可;
如在App,Doc,View类中都添加对Test菜单命令响应的函数;
在CMainFrame类中函数为:
void CMainFrame::OnTest()
{
// TODO: Add your command handler code here
MessageBox("MainFrame Click!");
}
但是由于App和Doc类不是从CWnd中派生的,所以没有MessageBox成员函数,但是可以使用AfxMessageBox;
在App类中:
void CProject004App::OnTest()
{
// TODO: Add your command handler code here
AfxMessageBox("App Click!");
}
在Doc类中:
void CProject004Doc::OnTest()
{
// TODO: Add your command handler code here
AfxMessageBox("Doc Click!");
}
在View类中:
void CProject004View::OnTest()
{
// TODO: Add your command handler code here
MessageBox("View Click!");
}
这时我们运行程序,点击Test;
点击确定之后发现没有别的信息,说明其它的几个响应函数没有起作用;
这时候我们将View类中的OnTest函数删除(右键单击OnTest,delete即可,结果如下图):
//DEL void CProject004View::OnTest()
//DEL {
//DEL // TODO: Add your command handler code here
//DEL MessageBox("View Click!");
//DEL }
运行程序:
再将Doc类中的函数删除并运行:
再将CMainFrame类中的函数删除并运行,最后一个显而易见就是App类了:
由此,我们知道响应Test菜单项命令的顺序依次是:View类,Doc类,Frame类,最后是App类;
2.Windows消息的分类
<1>标准消息
除WM_COMMAND之外,所有以WM_开头的消息都是标准消息。从CWnd派生的类,都可以接收这种消息;
<2>命令消息
来自菜单、加速键或工具栏按钮的消息。以WM_COMMAND形式呈现。从CCmdTarget派生的类,都可以接收这种消息;
<3>通告消息
由控件产生的消息,例如按钮的单击、列表框的选择等都会产生这类消息,目的是为了向其父窗口(通常是对话框)通知时间的发生。这类消息同样是由WM_COMMAND形式呈现。从CCmdTarget派生的类,都可以接收到这类消息。
由MSDN中,CWnd实际上派生与CCmdTarget类,所以由CWnd派生的类,既可以接收标准消息,也可接收命令消息和通过消息。由CCmdTarget派生的类,只能接收命令消息和通过消息。(这一段是按照书上直接手写的,作者总结很好,学习)
3.菜单命令的路由
重新在View类中添加Test菜单项命令响应函数;
我们发现在三个地方有关于菜单项响应函数的信息:
首先在View的头文件中,
protected:
//{{AFX_MSG(CProject004View)
afx_msg void OnTest();
//}}AFX_MSG
出现afx_msg void OnTest();
另外则是在View类的源文件中;
一处是:
BEGIN_MESSAGE_MAP(CProject004View, CView)
//{{AFX_MSG_MAP(CProject004View)
ON_COMMAND(IDM_TEST, OnTest)
//}}AFX_MSG_MAP
将菜单的ID号与命令响应函数关联起来...
另一处则是实现该函数的代码:
void CProject004View::OnTest()
{
// TODO: Add your command handler code here
}
路由过程:
在本次程序中,菜单命令消息路由过程(偷个懒,截个图):
2014,继续努力!
欢迎提点...o(∩_∩)o