VC++深入详解笔记——6.菜单编程

1.       MFC中的顶层菜单默认为弹出菜单(Pop-up),它是不能用来作命令响应的,当取消Pop-up选项后可接受命令响应。

2.       消息的分类:标准消息,命令消息,通告消息。

[标准消息]:除WM_COMMAND之外,所有以WM_开头的消息。从CWnd类派生的类都可以接收到这一消息

[命令消息]:来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK中,通过消息的wParam参数识别。从CCmdTargetCWnd的父类)派生的类都可以接收到这一类消息

[通告消息]:由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。从CCmdTargetCWnd的父类)派生的类都可以接收到这一类消息

总结:凡是从CWnd派生的类,既可以接收标准消息,也要以接收命令消息和通告消息。而对于那些从CCmdTarget派生的类,则只能接收命令消息和通告消息,不能接收标准消息。

3.       MFC中菜单项消息如果利用ClassWizard来对菜单项消息分别在上述四个类中进行响应,则菜单消息传递顺序:View--Doc--CMainFrame--App类。菜单消息一旦在其中一个类中响应则不再在其它类中查找响应函数。

菜单消息与前面介绍的标准消息的实现机制是相类似的,都是在消息响应函数原型(头文件),消息映射宏(源文件)和消息函数实现(源文件)中添加代码。注意:文档类与应用程序类都是由CCmndTarget类派生,所以可以接收菜单命令消息,但不能接收标准消息(只能由CWnd类派生才可以)。

具体消息路由过程:

当点击一个菜单项的时候,最先接受到菜单项消息的是CMainFrame框架类,CMainFrame框架类将会把菜单项消息交给它的子窗口View类,由View类首先进行处理;如果View类检测到没对该菜单项消息做响应,则View类把菜单项消息交由文档类Doc类进行处理;如果Doc类检测到Doc类中也没对该菜单项消息做响应,则Doc类又把该菜单项消息交还给View类,由View类再交还给CMainFrame类处理。如果CMainFrame类查看到CMainFrame类中也没对该消息做响应,则最终交给App类进行处理。

4.       一个菜单栏可以有若干个子菜单,一个子菜单又可以有若干个菜单项等。对菜单栏的子菜单由左至右建立从0开始的索引。对特定子菜单的菜单项由上至下建立了从0开始的索引。访问子菜单和菜单项均可以通过其索引或标识(如果有标识的话)进行。

相关重要函数:

CMenu* GetMenu( ) ;//CWnd::GetMenu得到窗口菜单栏对象指针。

CMenu* GetSubMenu( ) ;//CMenu::GetSubMenu获得指向弹出菜单对象指针

UINT CheckMenuItem( );//CMenu::CheckMenuItem 添加选中标识

BOOL SetDefaultItem();//CMenu::SetDefaultItem 为指定菜单设置缺省菜单项

BOOL SetMenuItemBitmaps( );//CMenu::SetMenuItemBitmaps 设置位图标题菜单。

UINT EnableMenuItem();//CMenu::EnableMenuItem使菜单项有效,无效,或变灰。

BOOL SetMenu( CMenu* pMenu );//CWnd::SetMenu在当前窗口上设置新菜单或移除菜单。

HMENU Detach( );//CMenu::Detach;断开一个菜单资源与相关的类对象句柄关联,可以定义局部对象,在使用完后调用Detach函数,则不会因为局部对象影响使用

说明:

1)在计算子菜单菜单项的索引的时候,分隔栏符也算索引的。

2int GetSystemMetrics()获取系统信息度量。可以用它来获取菜单标题的尺寸(后面还会使用到获取屏目尺寸)从而设置位图标题菜单中位图的大小。

3)在MFCMFC为我们提供了一套命令更新机制,所有菜单项的更新都是由这套机制来完成的。所以要想利用CMenu::EnableMenuItem来自己控制菜单使用或不使用变灰等,必须要在CMainFrame的构造函数中将变量m_bAutoMenuEnable设置为FALSE

EXAMPLE

CMenu menu;//定义为局部对象

menu.LoadMenu(IDR_MAINFRAME);

SetMenu(&menu);

menu.Detach();// 这里menu对象作为一个局部对象。使用Detach()menu对象中分离窗口菜单句柄,从而当menu对象析构的时候窗口菜单资源不随之销毁。

5.       命令更新机制:

菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获CN_UPDATE_COMMAND_UI消息,MFC就在其中创建一个CCmdUI对象。

在后台操作系统发出WM_INITMENUPOPUP消息,然后由MFC的基类如CFrameWnd接管并创建一个CCmdUI对象和第一个菜单项相关联,调用对象成员函数DoUpdate()(注:这个函数在MSDN中没有找到说明)发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针。此后同一个CCmdUI对象又设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。

更新命令UI处理程序仅应用于弹出式菜单项上的项目,不能应用于永久显示的顶级菜单项目。

说明:

1)可以手工或用ClassWizard来给菜单项添加UPDATE_COMMAND_UI消息响应,利用响应函数中传进来的CCmdUI对象指针可完成设置菜单项可使用,不可使用,变灰,设置标记菜单等操作。

 

6,如果要想让工具栏上的某个图标与菜单项的某个菜单相关联,只需要将图标的ID设置为该菜单项的ID

工具栏图标的索引记数顺序是:从做至右从0开始,分隔符也算索引号。

 

7,利用向项目中添加VCPOPMENU控件:Project->Add to Project->Components and Controls..

系统增加的内容:A,一个菜单资源;B,在派生View类中增加了OnContextMenu()函数

说明:

1CWnd::OnContextMenu Called by the framework when the user has clicked the right mouse button (right clicked) in the window. You can process this message by displaying a context menu using the TrackPopupMenu.

2BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect = NULL );

//CMenu::TrackPopupMenu Displays a floating pop-up menu at the specified location and tracks the selection of items on the pop-up menu. A floating pop-up menu can appear anywhere on the screen.

 

8,利用调用TrackPopupMenu函数,手工添加弹出菜单:

1)用资源管理器添加一个菜单资源

2)在鼠标右键消息响应函数中,加载菜单资源,并获得要显示的子菜单指针,并用该指针调用TrackPopupMenu函数便完成任务(但要注意:鼠标响应函数传进来的坐标是客户区坐标,而TrackPopupMenu函数中使用的是屏幕坐标,在调用TrackPopupMenu前要调用ClientToScreen客户区坐标到屏幕坐标的转换)

事例代码:

CMenu menu;

menu.LoadMenu(IDR_MENU1);

CMenu *pPopup=menu.GetSubMenu(0);

ClientToScreen(&point);

pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y,this);

说明:

CWnd::ClientToScreen(..);//将一个坐标点或一个矩形区域坐标转换成屏幕坐标。

CMenu::TrackPopupMenu(..);//在指定位置以指定的方式显示弹出菜单。

CWnd::ScreenToClient(..);

//Converts the screen coordinates of a given point or rectangle on the display to client coordinates.

 

9,当弹出菜单属于框架窗口的时候(可在TrackPopupMenu函数参数中设置),弹出菜单上的消息,在路由的时候,仍然遵循View-DOC-MainFrame-APP的响应顺序。

 

10,动态菜单编程:

所有的资源对象都有一个数据成员保存了资源的句柄。

CMenu::AppendMenu //Appends a new item to the end of a menu.

CMenu::CreatePopupMenu //Creates an empty pop-up menu and attaches it to a CMenu object.

CMenu::InsertMenu

//Inserts a new menu item at the position specified by nPosition and moves other items down the menu.

CMenu::GetSubMenu //Retrieves a pointer to a pop-up menu.

CWnd::GetMenu //Retrieves a pointer to the menu for this window.

CMenu::DeleteMenu //Deletes an item from the menu.

 

11,手动给动态菜单项添加响应函数:

Resource.h中可以添加资源的ID

在头文件中写消息函数原型

在代码文件中添加消息映射和添加消息响应函数

说明:

可以先创建一个临时的菜单项,设置它的ID和动态菜单项的一致,然后对它用向导进行消息响应,然后删除临时菜单。

再在代码文件中把消息映射放到宏外(注意一定要放到宏外面,因为CLASSWIZARD发现菜单删除了,同时要把其宏对里的消息映射也删除掉的)

 

12CWnd::DrawMenuBar

//Redraws the menu bar. If a menu bar is changed after Windows has created the window, call this function to draw the changed menu bar

 

CWnd::GetParent //get a pointer to a child window’s parent window (if any).

CWnd::Invalidate //注意其参数的作用

 

13,集合类:

CStringArrayCStringArrayCDWordArrayCPtrArrayCStringArrayCUIntArrayCWordArray

其中成员函数:

CArray::GetAt

CArray::Add

 

14,命令消息是到OnCommand函数的时候完成路由的。

由于CWnd::OnCommand 是个虚函数,可以在框架类中重写OnCommand函数,从而可以截获菜单消息使它不再往下(VIEW类)路由。

例:

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)

{

 // TODO: Add your specialized code here and/or call the base class

 int MenuCmdId=LOWORD(wParam);//取命令ID

 CMenu2View *pView=(CMenu2View*)GetActiveView();//获取当前VIEW类指针

 if(MenuCmdId>=IDM_PHONE1 && MenuCmdId<IDM_PHONE1+pView->m_strArray.GetSize())//消息范围判断

 {

 CClientDC dc(pView);

 dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdId-IDM_PHONE1));

 return TRUE;

   //函数返回,避免调用CFrameWnd::OnCommand函数,在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理

 }

 return CFrameWnd::OnCommand(wParam, lParam);

 //调用基类OnCommand函数,在CFrameWnd::OnCommand中截获的消息会交由VIEW类处理

}

 

15LOWORDHIWORD

WORD LOWORD(

 DWORD dwValue // value from which low-order word is retrieved

);

WORD HIWORD(

 DWORD dwValue // value from which high-order word is retrieved

);

 

//The LOWORD macro retrieves the low-order word from the given 32-bit value.

//The HIWORD macro retrieves the high-order word from the given 32-bit value.

 

16CFrameWnd::GetActiveView

CView* GetActiveView( ) const;//获取当前视窗口指针(单文档框架中)

源文件是单独参与编译的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Xtreme Toolkit Pro v15破解版 安装说明:执行setup.exe进行软件的安装,安装的过程中要求输入Serial Number,运行keygen.exe,选择Products中Xtreme ToolKitPro,将License Key复制到安装对话框Serial Number中,完成软件的安装之后即可正常使用。 原文出自【风信网】,转载请保留原文链接:http://www.ithov.com/soft/116063.shtml Xtreme Toolkit Pro 为Windows开发人员提供了一个尖端技术的组件集来为你的应用程序提供一个专业的,现代化的外观。Xtreme Suite Pro组合了8种我们最受欢迎的组件, Xtreme CommandBar,Xtreme Docking Pane,Xtreme Property Grid,Xtreme Report Control,Xtreme Calendar,Xtreme Task Panel,Xtreme ShortcutBar和 Xtreme Controls。 产品特点 Xtreme Suite Professional Edition 中包含了下面列出的各种产品。点击相应的链接可以观看该产品的功能漫游。观看结束后可以返回本页,查看 Xtreme Toolkit Pro 的其他功能。 Xtreme Calendar控件能为 Windows开发者提供完善的类似于Outlook 2003 Calendar的风格。 Xtreme Command Bars 提供非常漂亮的Office风格的命令条和One Note样式的Tab 。 Xtreme Controls为Windows图形用户软件工程师提供众多的有关MFC的控件产品 。 Xtreme Docking Pane浮动面板为Windows开发者提供了完善的Visual Studio.NET风格的浮动面板。 Xtreme Property Grid属性网格为Windows开发者提供了完善的Visual Studio.NET风格的属性网格。 Xtreme Report Control为windows开发者提供一个完善的类似于Outlook 2003报表的风格。 Xtreme ShortcutBar为Windows开发者提供了完善的Office 2003快捷工具栏导航菜单,该菜单类似于Microsoft? Outlook 2003的导航菜单。 Xtreme TaskPanel为Windows开发者提供了一个非常熟悉的任务栏,与Windows资源管理器类似。 运行环境 Visual Basic 6.0 Visual Basic .NET 2002 Visual Basic .NET 2003 Visual Basic .NET 2005 Visual C# .NET 2002 Visual C# .NET 2003 Visual C# .NET 2005
### 回答1: 《VC深入详解第3版PDF》是一本介绍Visual C++编程的书籍,该书主要针对具有一定编程基础的开发者,讲解了VC编程的高级应用和技巧。 该书分为10章,从Windows程序设计基础、MFC应用程序框架、视图类、文档类、数据库编程、多线程编程、网络编程、COM组件开发、ActiveX控件开发以及VC程序调试与优化等方面进行了深入系统的讲解,全面介绍了VC编程的相关知识和技术,对开发者有很大的帮助。 在该书中,作者通过丰富的实例和详细的代码讲解,让读者深入了解VC编程的常见问题和解决方法。同时,书中还介绍了一些重要的编程工具和技巧,如调试工具的使用、Windows消息机制、数据类型转换等,这些内容可以帮助读者从更高的角度理解VC编程,并更好地掌握其技术特点。 总之,《VC深入详解第3版PDF》是一本对VC编程进行深入研究和学习的优秀书籍,同时也适用于希望提高Windows程序设计和开发的程序员。该书具备丰富的内容和深入的讲解,对VC编程感兴趣的开发者将有所裨益。 ### 回答2: VC 深入详解 第3版 PDF 是一本介绍 Microsoft Visual C++(VC++)程序设计语言的详尽指南。本书在深入介绍 C++ 语言和编程基本概念的基础上,重点讲解了 VC++ 的程序设计和开发理念、各种功能和应用方法。本书内容全面,包括 VC++ 编译器、Windows 应用程序开发、图形用户界面设计、多线程编程、应用程序框架、数据库编程、网络编程等多个方面,对新手和资深程序员都有较高的指导作用。 本书第三版相对于前两版更新换代,其主要变化在于增加和更新了一些章节,完善了一些概念和应用。例如,本版增加了针对 Windows 8、Windows 10、Visual Studio 2013 和 2015 等新技术和工具的章节,更新了若干图形界面设计和控件使用的方法,增加了多线程、数据库和网络编程等方面的实例等等。同时,本书也对一些旧版章节进行了深入拓展和重制,以提高其可读性和可操作性。 值得注意的是,本书虽然以 VC++ 为主轴,但其对 C++ 语言本身也有广泛的涉猎,对于学习 C++ 编程的初学者也具有较好的指导作用。此外,本书的内容偏向实战操作,有大量具有代表性的应用实例供读者参考和尝试,这对于帮助读者掌握 VC++ 编程技术和提高实战操作能力都是有益的。 总之,《VC 深入详解 第3版 PDF》是一本帮助程序员深入理解 VC++ 编程技术和应用的权威性指南,具有较高的指导作用和实际价值。 ### 回答3: 《VC深入详解》是一本介绍Microsoft Visual C++编程语言和开发工具的书籍,此书分为入门篇和深入篇两部分,全书共分22章,对VC语言的基础知识、面向对象编程、MFC程序框架、窗口、对话框、菜单、工具栏、绘图、多媒体等方面进行了详尽的讲解和实践操作。第3版更新了最新版本的VC++ 2013和MFC,对原有的内容进行了更新和完善。 此书的深入详解部分具有较强的实践性和实用性, chapters中包括了Windows应用程序设计、高级算法、网络编程、多线程编程、数据库编程、动态链接库、ActiveX控件与COM、ATL和.NET等内容。并且此书结合了理论和实践,每个章节都有完整的实例程序,并且结合具体应用场景进行分析,让读者不仅能够掌握基本知识,还能够提升对VC编程的实际应用能力。 总体评价而言,《VC深入详解》是一本较为全面和权威的VC编程实战教程,适合于具有C/C++编程基础者进行深入学习,对于从事Windows软件开发的程序员和学生都具有很高的参考价值。在VC++编程学习中,这本书是一份必备工具书,对于提高编程能力有很大的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值