如何在CDialog中让EnableMenuItem有效...

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在CDialog中让EnableMenuItem有效...相关的知识,希望对你有一定的参考价值。

在视图工程下此方法可以使指定的菜单项变灰:
CMainFrame::m_bAutomenuEnable=FALSE;
pM->EnableMenuItem(1,MF_GRAYED);

问题是我的工程是窗口:
工程里根本就没有派生于CMainFrame的类!!
我在CDialog中右键消息里建了一个菜单:
CMenu popup;
popup.LoadMenu(IDR_LIST);
CMenu* pM = popup.GetSubMenu(0);

pM->EnableMenuItem(1,MF_GRAYED);
无法使指定的菜单项变灰。。。郁闷~~

CMainFrame 可从 CWnd 取得。
任何窗口类都来源于CWnd. 而 CDialog 来源于CWnd. 所以 可以直接调用 CWnd 的函数:
CMainFrame *pM=(CMainFrame*)AfxGetMainWnd();
至于 EnableMenuItem 函数参数,你要查一下。
这里,我只给你解决你的难点--- pM 的获取问题。追问

给不存在的值赋值你不觉得会报错吗,,,我没去试。

追答

给不存在的值赋值 -- 只能给变量赋值。
==============
MFC 程序 CDialog 来源于CWnd.
用:
CMainFrame *pM=(CMainFrame*)AfxGetMainWnd();
获取 pM。
有了pM,你才能调它的成员函数:
pM->EnableMenuItem

参考技术A Dear fso0qpty52,
学习MFC过程,遇到函数运用不懂的,推荐你去CSDN之类的论坛可以找到很多解答,可以首先去Microsoft官方帮助查看函数的使用方法。看完之后就会知道如何解决。如下链接:
http://technet.microsoft.com/zh-cn/h62wh3y1(v=vs.100)

改成pM->EnableMenuItem(1,MF_GRAYED | MF_BYPOSITION); 即可。
默认按标识 MF_BYCOMMAND属性,
可以改成pM->EnableMenuItem(ID_CUT,MF_GRAYED); ID_CUT是你资源标识。

望提点的建议对你有帮助!追问

我知道是资源标识,没有用的这样,不信你百度:EnableMenuItem无效

追答

我在vs2010上面调试通过之后,才给出回答的。那需要知道你的工具开发环境,还有你具体的代码。可能是其他原因导致的。

参考技术B 应该是你菜单的子item的id设置错了
EnableMenuItem的第一个参数是item的id而不是item在菜单中的位置 你是不是弄错了追问

那ID是我乱写的。。。问题和ID没关系

如何在 Visual Studio 2013 中使用 CDialog 类启用按钮的属性页

【中文标题】如何在 Visual Studio 2013 中使用 CDialog 类启用按钮的属性页【英文标题】:How to Enable a Button's Property Pages in Visual Studio 2013 with CDialog Class 【发布时间】:2015-03-06 16:05:19 【问题描述】:

在 Visual Studio 2008 中,可以从 CDialog 框的资源视图中双击一个按钮,然后直接转到将帮助我编辑其操作的代码。但是,在 2013 年,当我双击一个按钮时,会弹出一个“添加类向导”窗口。我只想编辑我的按钮的作用。我怎样才能做到这一点?在按钮的属性窗口中,“属性页面”按钮(扳手)被禁用,当我单击“控制事件”按钮(闪电)时,没有任何选择。 提前致谢!

【问题讨论】:

【参考方案1】:

如果您要严格查找属性,请右键单击鼠标并选择“属性”。此外,您可以在按钮上单击鼠标右键,然后从弹出菜单中选择“Add Event Handler...”。这应该会显示一个 Event Handler Wizard 对话框,允许您选择控件支持的任意数量的事件。但是请注意,如果您的资源存储在仅资源的 dll 中,则这种方法可能会出现问题。

【讨论】:

以上是关于如何在CDialog中让EnableMenuItem有效...的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 2013 中使用 CDialog 类启用按钮的属性页

如何在 CWinThread 派生类中正确创建 CDialog 框

如何制作CDialog?

如何制作CDialog?

如何将 CDialog::SetDefId 与非按钮控件一起使用?

如何使用 std::async 显示 Cdialog