设为首页 加入收藏

TOP

[VC++]010菜单命令的路由
2014-11-23 17:59:41 】 浏览:2911
Tags:010 菜单 命令 路由

祝各位元旦快乐...元旦小放了点假,放松一下...继续前行

接着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

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VC 枚举进程 下一篇VS断点无效的问题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目