浅析菜单实现原理

2022-10-24

在VC编程中, 作为菜单的设计和应用是最基础的, 菜单资源存储在文件中, 在设计时可以利用资源编辑器设计好一个菜单。我们要解决的问题是怎么样知道用户何时选择了菜单, 选的是哪个菜单项。当用户选择了一个有效的菜单项时系统会向应用发送一个WMCOMMAND消息, 在消息的参数中表明来源。在MFC中只需要进行一次映射, 将某一菜单ID映射到一处理函数, 我们以在CView的派生类中处理菜单消息, 对同一ID设置两个消息映射为例, 来说明这两种映射有什么作用。

1 两种映射

ON_COMMAND映射的作用是用户选择该菜单时调用指定的处理函数。ON_COMMAND (IDMCOMMAND0, On Comm and0) 会使菜单被选择时调用OnCommand0成员函数。

ON_UPDATE_COMMAND_UI (IDM_COMMAND1, OnUpdateCommand1) 映射的作用是在菜单被显示时通过调用指定的函数来进行确定其状态。在这个处理函数中可以设置菜单的允许/禁止状态, 其显示字符串是什么, 是否在前面打钩。函数的参数为CCmdUI*pCmdUI, 其中CCmdUI是更新命令的一个类, 可以调用Enable设置允许或禁止状态, SetCheck设置是否在前面打钩, SetText设置文字。

2 举例说明

在CView派生类中有一个变量m_fSe, 并且在视中处理两个菜单的消息, 当IDM_COMMAND0被选时, 对m_fSe进行逻辑非操作, 当IDM_COMMAND1被选中时出现一提示;同时IDM_COMMAND0根据m_fSe决定菜单显示的文字和是否在前面打上检查符号, IDM_COMMAND1根据m_fSe的值决定菜单的允许或禁止状态。

3 菜单操作其他方法

通过代码也可以操纵菜单, MFC中的类CMenu用来处理和菜单有关的功能。在生成一个CMenu对象时需要从资源中装如菜单, 通过调用BOOL CMenu::LoadMenu (UINT nIDResource) 进行装入, 然后就可以对菜单进行动态的修改, 有关函数如下:

CMenu*GetSubMenu (int nPos) 一位置得到子菜单的指针, 因为一个CMenu对象只能表示一个弹出菜单, 如果菜单中的某一项也为弹出菜单, 就需要通过该函数获取指针。

BOOL AppendMenu (UINT nFlags, UINT≠nIDNewItem=0, LPCTST RlpszNewItem=NULL) 在末尾添加一项, nFlag为MF_SEPARATOR表示增加一个分隔条, 这样其他两个参数将会被忽略;为MF_STRING表示添加一个菜单项uIDNewItem为该菜单的I D命令值;为MF_POPUP表示添加一个弹出菜单项, 这时uIDNewItem为另一菜单的句柄HMENU。lpszNewItem为菜单文字说明。

BOOL InsertMenu (UINT nPosition, UINT nFlags, UINT nIDNewItem=0, LPCTSTR lpszNewItem=NULL) 用于在指定位置插入一菜单, 位置由变量nPosition指明。如果nFlags包含MF_BYPOSITION则表明插入在nPosition位置, 如果包含MF_BYCOMMAND表示插入在命令ID为nPosition的菜单处。

注意:视图中是没有菜单的, 在框架窗口中才有, 所以只有用AfxGetApp () ->m_pMainWnd->GetMenu () 才能得到应用的菜单指针。

4 弹出菜单

在程序中实现弹出菜单, 必须先装入一个菜单资源, 得到一个弹出菜单的指针然后调用BOOLTrackPopupMenu (UINT nFlags, int≠x, int≠y, CWnd*pWnd, LPCRECT lpRect=NULL) 弹出菜单, 你需要指定 (x, y) 为菜单弹出的位置, pWnd为接收命令消息的窗口指针。为了处理消息你应该在pWnd指明的窗口中对菜单命令消息进行映射。

CMenu menu;

menu.LoadMenu (IDR_POPUP) ;

CMenu*pM=menu.GetSubMenu (0) ;

CPoint pt;

GetCursorPos (&pt) ;

pM->Track Popup Menu (TPM_LEFTALIGN, pt.x, pt.y, this) ;

还可以通过CMenu::Create Popup Menu () 建立一个弹出菜单, 然后使用TrackPopupMenu弹出菜单。使用CreatePopupMenu创建的菜单也可以将其作为一个弹出项添加另一个菜单中。程序代码如下:

5 结语

菜单是一种基本的资源, 在实际编程中要会灵活应用。

摘要:在自动化设计过程中, 经常要用VC编程, 经常用到菜单, 本文讲述了菜单的实现原理。

关键词:菜单,消息映射

参考文献

[1] Stanley B Lippan.C++ Primer第三版.

[2] Bjarne Stroustrup, The C++Programming Language.

上一篇:如何在数学课堂上培养中学生的推理能力下一篇:统计核算利润和成本,精细管理促挖潜增效