鸡啄米在上一节中讲的是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 ,此外大家也要主导莱单栏加上 Settings 项,随后为其加上一身高莱单项 Draw Enable ,大家根据 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所有着,因此大家在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,改动2个涵数的完成为:
C++编码 void CMainFrame::OnToolsDraw() { // TODO: Add mand handler code here // 弹出来提醒框 MessageBox(_T( Draw )); } void CMainFrame::OnUpdateToolsDraw(CCmdUI *pCmdUI) { // TODO: Add mand update UI handler code here // 依据m_bDraw的值设定是不是激话 pCmdUI- Enable(m_bDraw); }4. 为莱单项Settings- Draw Enable的COMMAND信息和UPDATE_COMMAND_UI信息各自加上解决涵数CMainFrame::OnSettingsDrawenable()和OnUpdateSettingsDrawenable(CCmdUI *pCmdUI),并将他们的完成改动为:
C++编码 void CMainFrame::OnSettingsDrawenable() { // TODO: Add mand handler code here // 制图使能标志取反 m_bDraw = !m_bDraw; } void CMainFrame::OnUpdateSettingsDrawenable(CCmdUI *pCmdUI) { // TODO: Add mand update UI handler code here // 依据m_bDraw的值设定是不是选定 pCmdUI- SetCheck(m_bDraw); }5. 运作程序,实际效果图以下:
6. 接下去大家要再次完成鼠标右键莱单。大伙儿之后能够模仿VS2010全自动转化成的编码完成鼠标右键莱单,还可以用鸡啄米下边提到的方式。最先将CExample34View::OnRButtonUp(UINT /* nFlags */, CPoint point)涵数内的编码都注解掉,确保原先的弹出来方式无效。
7. 全自动转化成编码是在电脑鼠标弹起时完成的鼠标右键莱单,大家这儿改成在电脑鼠标按住时就弹出来鼠标右键莱单。在class view类主视图中点一下CExample34View,随后在特性页的messages目录中寻找WM_RBUTTONDOWN,加上其信息响应涵数CExample34View::OnRButtonDown(UINT nFlags,CPoint point),改动实际上现为:
C++编码 void CExample34View::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CMenu menu; // 莱单(包括主莱单栏和子莱单) CMenu *pSubMenu; // 鼠标右键莱单 // 载入莱单資源到menu目标 menu.LoadMenu(IDR_POPUP_EDIT); // 由于鼠标右键莱单是弹出来式莱单,不包括主莱单栏,因此取子莱单 pSubMenu = menu.GetSubMenu(0); // 将座标值由顾客座标变换为显示屏座标 ClientToScreen( point); // 弹出来鼠标右键莱单,莱单左边与point.x座标值两端对齐 pSubMenu- TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this); CView::OnRButtonDown(nFlags, point); }8. 最后的鼠标右键莱单实际效果:
这节內容很多,大伙儿能够渐渐地消化吸收。莱单的解读就到这儿了。鸡啄米感谢大伙儿的关心和适用。
VS2010/MFC程序编写新手入门之三十四(莱单:VS2010莱单資源详细说明) (:4)
VS2010/MFC程序编写新手入门之三十三(常见控制:标识控制Tab Control 下) (:25)
VS2010/MFC程序编写新手入门之三十二(常见控制:标识控制Tab Control 上) (:59)
VS2010/MFC程序编写新手入门之三十一(常见控制:树型控制Tree Control 下) (:32)
VS2010/MFC程序编写新手入门之三十(常见控制:树型控制Tree Control 上) (:53)
VS2010/MFC程序编写新手入门之二十九(常见控制:目录主视图控制List Control 下) (:57)
VS2010/MFC程序编写新手入门之二十八(常见控制:目录主视图控制List Control 上) (:5)
VS2010/MFC程序编写新手入门之二十七(常见控制:照片控制Picture Control) (:38)
VS2010/MFC程序编写新手入门之二十六(常见控制:翻转条控制Scroll Bar) (:33)
VS2010/MFC程序编写新手入门之二十五(常见控制:组成框控制Combo Box) (:15)
网页链接(选填)
认证(*)
文章正文(*)(留言板留言最多篇幅:1000)
记牢我,下一次回应时无需再次键入本人信息内容
Copyright © 广州凡科互联网科技有限公司 版权所有 粤ICP备10235580号
全国服务电话:4000-399-000 传真:021-45545458
公司地址:广州市海珠区工业大道北67号凤凰创意园