鸡啄米正正在上一节中讲的是VS2010的菜单资源,本节浸要讲菜单及CMenu类的运用。

       CMenu类的浸要成员函数

       MFC 为菜单的操作提供了CMenu类,下面鸡啄米就常用的几个成员函数进行简单的先容。

       BOOL LoadMenu(UINT nIDResource);

       加载菜单资源,并将其附加到CMenu对象上。参数nIDResource指定了要加载的菜单资源的ID。如果菜单加载成功则返回TRUE,不然返回FALSE。

       BOOL DeleteMenu(UINT nPosition,UINT nFlags);

       正正在菜单中删除一个菜单项。参数nPosition指定要删除的菜单项。参数nFlags就用来解释nPosition的途理,为MF_BYCOMMAND时说明nPosition表示菜单项的ID,为MF_BYPOSITION时说明nPosition表示菜单项的位置,第一个菜单项的位置为0。如果删除菜单项成功则返回TRUE,不然返回FALSE。

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

        用来正正在指定位置显现一个浮动的弹出式菜单。参数nFlags指定屏幕坐标和鼠标位置的标志,可以是以下取值:

       TPM_CENTERALIGN:菜单正正在水平偏向上相对于参数x指定的坐标值居中显现
       TPM_LEFTALIGN:菜单的左侧与参数x指定的坐标值对齐
       TPM_RIGHTALIGN:菜单的右侧与参数x指定的坐标值对齐
       TPM_BOTTOMALIGN:菜单的底部与参数y指定的坐标值对齐
       TPM_TOPALIGN:菜单项的顶部与参数y指定的坐标值对齐
        TPM_VCENTERALIGN:菜单正正在笔直偏向上相对于参数y指定的坐标值居中显现

        这里先先容这几个比拟常用的,其他可参睹MSDN。参数x指定弹出式菜单的水平偏向的屏幕坐标,参数y指定菜单顶部笔直偏向上的屏幕坐标,参数pWnd指明哪个窗口具有此弹出式菜单,不行为NULL,参数lpRect忽略。

       UINT CheckMenuItem(UINT nIDCheckItem,UINT nCheck);

        正正在弹出菜单中为菜单项增加选中标志或移除选中标志。参数nIDCheckItem指定要选中或消释选中的菜单项。参数nCheck指定菜单项的选中状态和怎样依据nIDCheckItem确定菜单项的位置,可以是MF_CHECKED或MF_UNCHECKED与MF_BYPOSITION或MF_BYCOMMAND的组合,这几个标志的含义如下:

       MF_BYCOMMAND:为默认值。说明参数nIDCheckItem表示菜单项的ID
       MF_BYPOSITION:说明参数nIDCheckItem表示菜单项的位置,第一个菜单项的位置是0
       MF_CHECKED:为菜单项添加选中标志
       MF_UNCHECKED:为菜单项移除选中标志

       该函数返回菜单项之前的状态:MF_CHECKED或MF_UNCHECKED, 如果菜单项不存正正在则返回0xFFFFFFFF。

       UINT EnableMenuItem(UINT nIDEnableItem,UINT nEnable);

       激活、禁用菜单项或使其变灰。参数nIDEnableItem指定要激活、禁用或变灰的菜单项。参数nEnable指定操作的样板,可以是MF_DISABLED、MF_ENABLED或MF_GRAYED与MF_BYCOMMAND或MF_BYPOSITION的组合,这些值的含义如下:

       MF_BYCOMMAND:同CheckMenuItem
       MF_BYPOSITION:同CheckMenuItem
       MF_DISABLED:禁用菜单项,使其不行被选择但不变灰
       MF_ENABLED:激活菜单项,使其可以被选择并由变灰状态恢复
       MF_GRAYED:禁用菜单项,使其不行被选择并变灰

        该函数返回菜单项之前的状态:MF_DISABLED、MF_ENABLED或MF_GRAYED

       CMenu* GetSubMenu(int nPos) const;

       获取弹出菜单的CMenu对象。参数nPos指定弹出菜单正正在菜单中的位置,不行运用ID。返回值是CMenu对象的指针,该CMenu对象的m_hMenu成员为由nPos指定的弹出菜单的句柄,如果不存正正在这样的CMenu对象则返回NULL,然后创建一个临时弹出菜单。

       CMenu类的成员函数先讲这些,如果大家需要用其他的函数可以到MSDN中查看,解释的很了解。

       菜单消歇

        菜单浸要能发送两种消歇:COMMAND消歇和UPDATE_COMMAND_UI消歇。下面分别解说:

       COMMAND消歇:正正在菜单项被点击时发送该消歇。

        UPDATE_COMMAND_UI消歇:用来帮理菜单项的各项状态,包括激活、禁用、变灰、选中、未选中等。正正在下拉菜单每次打开的时候,所有菜单项的此消歇都会被发送出去。如果所属类中为菜单项的该消歇添加了治理函数,则执行相应函数更新菜单状态,如果菜单项没有此消歇治理函数,也没有COMMAND消歇的治理函数,那么它就会变灰。

       菜单的运用实例

        鸡啄米先讲一下本实例要实现的功能,此实例是正正在上一节创建的单文档工程Example34的基础上完成的,上一节中为主菜单栏添加了“Tools”菜单项,并设置它的第一个子菜单项为“Draw”,另外银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站还要为主菜单栏添加“Settings”项,然后为其添加一个子菜单项“Draw Enable”,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站通过“Draw Enable”菜单项的选中状态控制菜单项“Draw”的激活状态,如果“Draw Enable”菜单项选中,则“Draw”菜单项激活,点击它弹出一个MessageBox,不然“Draw”菜单项禁用。程序中曾经正正在Example34View类中自动天生了OnRButtonUp(UINT /* nFlags */, CPoint point)函数,并正正在其中实现了弹出右键菜单的功能,这里鸡啄米用CMenu类的TrackPopupMenu成员函数浸新做一遍。

       帮理:Example34的CMainFrame类中定义的菜单并没有运用常用的CMenu类,而是用的CMFCMenuBar类(自VS2008起提供),但菜单的消歇治理函数的添加是相同的。

        下面是举座步骤:

       1. 打开Example34工程的IDR_MAINFRAME菜单资源,正正在“Help”菜单项前通过“Insert New”操作插入一个菜单项,Caption设为“Settings”,正正在新菜单项的子菜单中再添加一个菜单项,Caption设为“Draw Enable”,ID默以为ID_SETTINGS_DRAWENABLE。

       2. 由于此菜单为CMainFrame所具有,以是银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站正正在CMainFrame类中对菜单进行操作。正正在“MainFrm.h”中为CMainFrame类添加成员变量bool m_bDraw,以标识当前是否可以点击Tools->Draw菜单项,并正正在CMainFrame类的构制函数 中为m_bDraw初始化:m_bDraw = TRUE。

        3. 为菜单项Tools->Draw的COMMAND消歇和UPDATE_COMMAND_UI消歇分别添加治理函数CMainFrame::OnToolsDraw()和OnUpdateToolsDraw(CCmdUI *pCmdUI),这里要帮理,添加治理函数时class list中应选择CMainFrame,修改两个函数的实现为:

C++代码
  1. void CMainFrame::OnToolsDraw()   
  2. {   
  3.     // TODO: Add your command handler code here   
  4.     // 弹出提示框   
  5.     MessageBox(_T("Draw"));   
  6. }   
  7.   
  8. void CMainFrame::OnUpdateToolsDraw(CCmdUI *pCmdUI)   
  9. {   
  10.     // TODO: Add your command update UI handler code here   
  11.     // 依据m_bDraw的值设置是否激活   
  12.     pCmdUI->Enable(m_bDraw);   
  13. }  

        4. 为菜单项Settings->Draw Enable的COMMAND消歇和UPDATE_COMMAND_UI消歇分别添加治理函数CMainFrame::OnSettingsDrawenable()和OnUpdateSettingsDrawenable(CCmdUI *pCmdUI),并将它们的实现修改为:

C++代码
  1. void CMainFrame::OnSettingsDrawenable()   
  2. {   
  3.     // TODO: Add your command handler code here   
  4.     // 绘图使能标识取反   
  5.     m_bDraw = !m_bDraw;   
  6. }   
  7.   
  8.   
  9. void CMainFrame::OnUpdateSettingsDrawenable(CCmdUI *pCmdUI)   
  10. {   
  11.     // TODO: Add your command update UI handler code here   
  12.     // 依据m_bDraw的值设置是否选中   
  13.     pCmdUI->SetCheck(m_bDraw);   
  14. }  

       5. 运行程序,效果图如下:

VS2010菜单运用实例

       6. 接下来银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站要浸新实现右键菜单。大家以后可以仿照VS2010自动天生的代码实现右键菜单,也可以用鸡啄米下面讲到的方法。起首将CExample34View::OnRButtonUp(UINT /* nFlags */, CPoint point)函数内的代码都注释掉,保证原来的弹出方法失效。

       7. 自动天生代码是正正在鼠标弹起时实现的右键菜单,银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站这里改为正正在鼠标按下时就弹出右键菜单。正正在class view类视图中点击CExample34View,然后正正在属性页的messages列表中找到WM_RBUTTONDOWN,添加其消歇照应函数CExample34View::OnRButtonDown(UINT nFlags,CPoint point),修改其实现为:

C++代码
  1. void CExample34View::OnRButtonDown(UINT nFlags, CPoint point)   
  2. {   
  3.     // TODO: Add your message handler code here and/or call default   
  4.     CMenu menu;       // 菜单(包含主菜单栏和子菜单)   
  5.     CMenu *pSubMenu;  // 右键菜单   
  6.   
  7.     // 加载菜单资源到menu对象   
  8.     menu.LoadMenu(IDR_POPUP_EDIT);   
  9.     // 由于右键菜单是弹出式菜单,不包含主菜单栏,以是取子菜单   
  10.     pSubMenu = menu.GetSubMenu(0);   
  11.     // 将坐标值由客户坐标转换为屏幕坐标   
  12.     ClientToScreen(&point);   
  13.     // 弹出右键菜单,菜单左侧与point.x坐标值对齐   
  14.     pSubMenu->TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this);   
  15.   
  16.     CView::OnRButtonDown(nFlags, point);   
  17. }  

       8. 最终的右键菜单效果: 

VS2010右键菜单的实现

       本节实质不少,大家可以慢慢消化。菜单的解说就到这里了。鸡啄米谢谢大家的体贴和支持。

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/212.html
2012年7月30日
作家:鸡啄米 分类:软件开发 浏览: 评论:24