您的位置:首页 > 职场人生

【笔试/面试】MFC(六)—— 菜单

2016-04-16 20:29 246 查看
(1)菜单是属于框架窗口(CMainFrame)的

对菜单消息的响应

MainFrame 类、App 类、Doc 类、View 类均可对菜单消息进行捕获和响应:

顺序如下:

View

Doc

MainFrame

App

消息的分类

(1)标准消息

除 WM_COMMAND 外,所以以WM_开头的消息。从CWnd 派生的类,都可以接收到这类消息。

(2)命令消息(OnCommand)

菜单项、加速键或工具栏上的按钮,这类消息都以 WM_COMMAND 呈现。在 MFC 中,通过菜单项的标识(ID)来区分不同的命令消息。

从 CCmdTarget 派生的类,都可接收到这类消息。

(3)通告消息(OnNotify)

由控件产生的消息,例如,按钮的单击,列表框的选择等均可产生此类消息,为的是像其父窗口(通常为对话框)通知事件的发生。这类消息也是以 CM_COMMAND 形式呈现。

从 CCmdTarget 派生的类,都可以接受到这类消息。

菜单编程

(1)创建标记菜单(左侧有对号)

在 CMainFrame 类的 OnCreate 函数处:

GetMenu()->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);
GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW, MF_BYCOMMAND | MF_CHECKED);


(2)创建缺省菜单(粗体)

GetMenu()->GetSubMenu()->SetDefaultItem(1, true);
GetMenu()->GetSubMenu()->SetDefaultItem(ID\_FILE_OPEN, false);


(3)屏蔽某一菜单项

GetMenu()->GetSubMenu()->EnableMenuItem(ID_FILE_OPEN, MF_BYCOMMAND | MF_DISABLED | MF_GRAYED);


这样设置之后,好像没什么卵用,此时需要在 CMainFrame 构造函数处,手动的添加
m_bAutoMenuEnable = false;
,对菜单项的屏蔽操作才会一如预期(这会涉及 MFC 独特的菜单更新机制)。m_bAutoMenuEnable 变量继承自 CFrameWnd。

(4)移走菜单

SetMenu(NULL);


(5)加载 Menu

SetMenu(NULL);
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
menu.Detach();
// 将句柄和 C++ 对象断开
// 因为是局部对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: