菜单

来源:互联网 发布:b站遇到淘宝广告弹幕 编辑:程序博客网 时间:2024/04/29 08:10

        ”菜单栏、工具栏和状态栏是组成Windows程序图形界面的三个主要元素“,这节我们主要谈谈菜单栏的使用。

实现一个菜单响应函数

        首先,做一个最简单的示例,单击菜单栏上的某一个菜单选项,对其进行响应。

        1.利用资源管理器,在菜单栏上添加Test选项

         

        2.将菜单项设置为”非弹出式“菜单,即将Pop-up属性勾选掉,在windows中菜单分为两种,一种是弹出式菜单,即:顶级菜单,这种类型的菜单不能进行响应命令。另一种是非弹出式菜单,可以响应命令。我们选择弹出式菜单,让该菜单项支持命令响应。

        3.使用Class Wizard添加相应响应处理函数,当然,你也可以手动添加。

        

        4.编写响应函数代码。

void CMainFrame::OnTest(){MessageBox(_T("MainFrame Clicked"));}
按照以上流程操作之后,我们就添加了一个菜单项,单击运行,得到如下结果:

       

以上是最简单的菜单响应,我们应该熟知,接下来,我们将逐步讨论菜单的基本操作。


获取菜单

        要想对菜单操作,我们首先要获取菜单,MFC的CWnd类提供了GetMenu成员函数方便得到菜单栏指针,进一步通过GetSubMenu选项得到子菜单进行操作。

CMenu* GetMenu( ) const;CMenu* GetSubMenu( int nPos ) const;

标记菜单

        标记菜单为菜单选项带有对号的菜单项,我们使用CheckMenuItem函数进行标记,该函数有两个参数。第一个参数取决于第二参数,如果菜单是通过位置标记的即:第二个参数为MF_BYPOSITION,则第一个参数为数字。如果是MF_BYCOMMAND,则第一个参数为ID标识符。

GetMenu()->GetSubMenu(0)->CheckMenuItem(0, MF_BYPOSITION | MF_CHECKED);GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_SAVE_AS, MF_BYCOMMAND | MF_CHECKED);
默认菜单

       在一个应用程序中,有若干个子菜单,每个子菜单最多可以有一个以粗体形式显示的默认菜单项,在MFC中,这个菜单项是通过SetDefaultItem函数进行设置的。

<span style="font-size:18px;">GetMenu()->GetSubMenu(0)->SetDefaultItem(5, true);GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_PRINT, false);</span>
图形标记菜单

       在菜单项前带有图形的菜单项为图形标记菜单,具体请查看SetMenuItemBitmaps函数:

m_bitmap.LoadBitmapW(IDB_BITMAP1);GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(2, MF_BYPOSITION, &m_bitmap, &m_bitmap);
当然,我们使用的位图大小可能不符合windows标准,为了得到菜单项的标准位图大小我们可以使用GetSystemMetrics(SM_CXMENUCHECK)和GetSystemMetrics(SM_CYMENUCHECK)两个函数获得,之后调节成标准大小就可以了。

禁用菜单项

        当windows禁用某个菜单项也就屏蔽了该菜单响应函数,我们使用EnableMenuItem函数:

GetMenu()->GetSubMenu(0)->EnableMenuItem(2, MF_BYPOSITION | MF_DISABLED | MF_GRAYED);
当然,如果你只做了以上操作,是不会起作用的。因为,MFC为菜单提供了一种命令更新机制,如果我们想更改菜单项的状态就首先需要将CMainFrame的成员变量m_bAutoMenuEnable设置为false,这样我们对菜单的更新才会起作用,即:我们不在通过命令更新机制去判断哪个菜单项可用。利用MFC编程时,菜单项的状态依赖于CN_UPDATE_COMMAND_UI消息,我们可以在这个消息的响应函数对其进行状态设置。

void CMainFrame::OnUpdateEditCut(CCmdUI *pCmdUI){pCmdUI->Enable(false);}

MFC命令更新机制:当我们单击某个菜单项时,系统会自动将CCmdUI对象与第一个菜单项相关联,如果存在一个ON_UPDATE_COMMAND_UI宏,那么就使用这样一个宏,去调用相应的消息响应函数去处理,进而改变他们的菜单状态,接着依次将CCmdUI绑定第二、第三个菜单项处理。

快捷菜单

        在windows程序中,一般通过点击右键弹出快捷菜单,这种操作最主要的是实现是TrackPopupMenu函数。首先,我们在资源管理器中创建一个菜单资源。其次,在CView的实现类中添加WM_RBUTTONDOWN消息。最后,处理响应函数。实现代码如下:

CMenu menu;menu.LoadMenuW(IDR_MENU1);        CMenu *pPopup = menu.GetSubMenu(0);        ClientToScreen(&point);        pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this);
以上是静态菜单有关菜单项的操作,接下来我们讨论动态菜单。

添加菜单项

       在菜单末尾添加一个指定菜单项

CMenu menu;menu.CreateMenu();GetMenu()->AppendMenuW(MF_POPUP, (UINT)menu.m_hMenu, _T("Test2"));menu.Detach();
其中,Detach函数将菜单句柄与菜单对象之间的关系断开。

        在菜单中插入一个菜单项

GetMenu()->GetSubMenu(0)->InsertMenuW(ID_FILE_OPEN, MF_BYCOMMAND | MF_STRING | MF_ENABLED, 115, _T("windows程序设计"));
删除菜单项

       MFC提供了DeleteMenu函数,可以删除一个菜单项目

GetMenu()->GetSubMenu(0)->DeleteMenu(2, MF_BYPOSITION);
动态添加菜单项的响应

首先,为新菜单项定义一个ID号

#define IDM_INSERT 121
第二,用AppendMenu函数将新菜单项追加到菜单末尾

GetMenu()->GetSubMenu(0)->AppendMenuW(MF_STRING, IDM_INSERT, _T("新增"));
第三,在头文件中添加相应函数原型

afx_msg void OnInsert();
第四,在消息映射表中,添加消息映射

ON_COMMAND(IDM_INSERT, OnInsert)
最后,实现响应函数

void CMainFrame::OnTest(){MessageBox(_T("MainFrame Clicked"));}
好了,这样我们就动态添加了一个响应菜单项了。

关于菜单的操作我们就讨论到这里了,在本节中,我们主要讨论了两种菜单,包括:静态菜单操作和动态菜单操作,静态菜单操作包括标记菜单、默认菜单、图形菜单及快捷菜单等。动态菜单操作主要是动态地添加、删除菜单项及响应函数。应该说有关菜单的操作并不难,相信通过稍加训练我们就可以很熟练地掌握。

0 0
原创粉丝点击