欢迎进入广州凡科互联网科技有限公司网站
全国服务热线
4000-399-000
VS2010/MFC程序编写新手入门之三十五(莱单:莱单
时间: 2021-02-14 04:57 浏览次数:
鸡啄米在上一节中讲的是VS2010的莱单資源,这节关键讲莱单及CMenu类的应用。 CMenu类的关键组员涵数 MFC为莱单的实际操作出示了CMenu类,下边鸡啄米就常见的好多个组员涵数开展简易

  鸡啄米在上一节中讲的是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. 运作程序,实际效果图以下:

VS2010菜单应用实例

  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右键菜单的实现

 这节內容很多,大伙儿能够渐渐地消化吸收。莱单的解读就到这儿了。鸡啄米感谢大伙儿的关心和适用。

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)


1楼. 广州市婚纱礼服照 非常好,多谢共享。 2012/7/31 8:47:36 回应该留言板留言 2楼. 墨西哥电力工程展 回来看一下了。 2012/7/31 8:48:14 回应该留言板留言 3楼. 吴克难的blog 写的很详尽,学习培训了。 2012/7/31 8:53:47 回应该留言板留言 4楼. 笑百头 学习培训力,太谢谢了,鸡啄米 于 :32 回应无需谢,常看来看啊 2012/7/31 14:24:12 回应该留言板留言 5楼. 宣传语全集
涵数很难学了,共享了。
2012/8/1 10:39:13 回应该留言板留言 6楼. 宁波市看痔疮哪个医院门诊好 如今的blog都不如以往那般强盛了,不知道最终是否会被新浪微博、轻度博及其新的事情所替代,要来时尚博主们也在担心,是不是要坚持不懈升级。鸡啄米 于 :38 回应坚持不懈,没讲过的秦风 于 :58 回应适用小编! 2012/8/2 10:16:17 回应该留言板留言 7楼. Shuang 时尚博主您好,在进行这一贴子的训炼时碰到了一点不便,寻求帮助:
不上解在其中为“莱单项Tools- Draw的COMMAND信息和UPDATE_COMMAND_UI信息各自加上解决涵数CMainFrame::OnToolsDraw()和OnUpdateToolsDraw(CCmdUI *pCmdUI)”的实际实际操作是啥样。。打了开Class Wizard,将Class name选为CMainFrame,随后在Commands Tab里边检索ID_TOOLS_DRAW,随后双击鼠标Message中的COMMAND,按OK获得了哪个涵数。但是在运作程序时并沒有见到一切实际效果,调节时都不会进到哪个涵数,不知道道为何。。Shuang 于 :35 回应您好,难题早已处理了,上边的方式是恰当的,可是我的莱单的Popup不正确的设变成True,假如是False则一切圆满~鸡啄米 于 :17 回应可以自身处理难题,坚信能学得大量 2013/1/16 19:44:29 回应该留言板留言 8楼. WT 在哪儿里动态性加上子莱单呢? 2013/1/25 9:29:02 回应该留言板留言 9楼. 跳跳 鼠标右键弹出来的莱单如何打钩呢? 2013/2/6 11:38:36 回应该留言板留言 10楼. 老百姓 那带标志的莱单如何弄呢 2013/3/3 20:36:56 回应该留言板留言 11楼. 我也就是我 vs2010便捷莱单在哪添呢 2013/4/5 13:44:19 回应该留言板留言 12楼. MFC小菜 鸡啄米高手好。最先谢谢你的这一系列产品实例教程,给了我众多协助。下边就是我的一点小疑虑。自己创建了莱单栏而且加上信息解决涵数之后,发了现OnupdateXXX这一信息涵数里边的哪个主要参数句柄pCmdUI是CCmdUI类的,而且我在MSDN上获知CCmdUI是一个独立的类,并沒有承继一切关联。因此我一刚开始尝试用GetDlgItm这一常见方法读取控制句柄的情况下就错误了(由于我粗略地的查了一下,CMenu类是以Cwnd类承继回来的,因此我也想自然的启用了一下GetDlgItm这一涵数)。发了现好像操纵莱单只有根据这一pCmdUI来开展。不知道道客观事实不是是那样。还期待高手能给解释下。简单点来说,便是这一莱单不是不是像这些按键啊这类的有一个独立的自变量能够操纵,纯碎仅仅一个信息的媒介。而不象按键这些能够例如自变量- Create,自变量- ShowWindow那样。 2013/9/4 14:31:28 回应该留言板留言 13楼. 如花 我还记得以前用cmenu类 vs2010早已把这一变为cmenebar 2013/12/12 23:24:58 回应该留言板留言 14楼. CS 小编能独立讲下根据会话框下怎样开展莱单实际操作么。 2014/7/15 15:43:07 回应该留言板留言 15楼. 初学者小Y 感谢鸡啄米的共享~学习培训了 2014/10/17 13:23:58 回应该留言板留言 16楼. 小飞 小编,您好!我照你上边的流程2、3、4编译程序运作后,有一个出错:
visual studio 2008\projects\example34\example34\example34.cpp(156) : error C2065: “m_bDraw”: 未申明的标志符
我觉得就是我是流程2“在“MainFrm.h”中为CMainFrame类加上组员自变量bool m_bDraw”沒有加上好,由于显示信息的是另外一个.cpp文档Example34.cpp中引入了“m_bDraw”未申明的标识符,,可是不知道道如何改动?
我还在MainFrm.h”中是按以下文件格式加上的CMainFrame类加上组员自变量bool m_bDraw:
class CMainFrame : public CFrameWnd
{
(.....省去)
public:
bool m_bDraw;
};
小飞 于 :37 回应我早已寻找难题了,由于粗心大意加上解决涵数时class list沒有选定CMainFrame,选成Example34View了。 physu 于 :37 回应因为我是出現了这一难题,假如在设定解决涵数时在class list沒有选定CMainFrame,则默认设置挑选CAboutDlg类,随后解决涵数会出現在Example34.cpp中,那样运作时候出错m_bDraw未申明。恰当的应当是在MainFrm.cpp抽出现解决涵数,那样也不会出错了。供大伙儿参照 2014/10/18 16:52:27 回应该留言板留言 17楼. dog 在“MainFrm.h”中为CMainFrame类加上组员自变量bool m_bDraw,以标志当今是不是能够点一下Tools- Draw莱单项 这一组员自变量是要加上在哪儿儿? 2015/7/7 13:10:37 回应该留言板留言 18楼. luoyan78750 为何我的vs2012不可以全自动转化成OnRButtonUp(UINT /* nFlags */, CPoint point)涵数呢?menu.LoadMenu(IDR_POPUP_EDIT)括弧中的IDR_POPUP_EDIT是哪儿来的哇。。wegen 于 :47 回应这应当是系统软件自身有的控制模块 2015/7/24 14:39:22 回应该留言板留言 19楼. cainiao 十分谢谢时尚博主 2015/11/6 17:20:03 回应该留言板留言 20楼. Robin 应当填的是資源主视图中Menu下的,IDR_...。我的是IDR_MAINFRAME. 2016/2/26 10:38:42 回应该留言板留言 21楼. Will 如何一直些沒有用的可有可无。。。 2018/5/27 22:20:30 回应该留言板留言 22楼. Will 如何一直些不起作用的可有可无。。。。
2018/5/27 22:21:15 回应该留言板留言 23楼. 电脑鼠标鼠标右键弹出来两个莱单 我用的是VS 2017,在完成鼠标右键莱单时,会弹出来两个莱单:一个是依照时尚博主编码做的;另外一个是深灰色的,还显示信息有便捷键。我觉得问的是,为何会出现两个莱单出現?小火狐浏览器 于 :49 回应因为我是那样,没搞清楚如何件事情 哥哥 你处理了嘛 2018/6/1 23:00:14 回应该留言板留言 24楼. 不要吃辣椒 pSubMenu- TrackPopupMenu(TPM_LEFTALIGN, point.x, point.y, this); 改成
pSubMenu- TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
能够处理造成2个莱单的难题 2019/3/22 16:40:31 回应该留言板留言

网页链接(选填)

认证(*)

文章正文(*)(留言板留言最多篇幅:1000)

记牢我,下一次回应时无需再次键入本人信息内容

下一篇:没有了


Copyright © 广州凡科互联网科技有限公司 版权所有 粤ICP备10235580号
全国服务电话:4000-399-000   传真:021-45545458
公司地址:广州市海珠区工业大道北67号凤凰创意园