MFC中添加的菜单项为啥始终是灰色的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中添加的菜单项为啥始终是灰色的相关的知识,希望对你有一定的参考价值。

我新建一个类,在BEGIN_NESSAGE_MAP中添加了ON_COMMAND消息,菜单项的ID也没有问题,加了响应函数,编译通过,可是运行的时候菜单项总是灰色的,请问还需要什么东西。
消息处理函数好像就是用BEGIN_NESSAGE_MAP来指定的吧,我已经指定好了。
那个BEGIN_NESSAGE_MAP好像在MainFrm里指定就不是灰色的,但我想放在别的类里面要怎么做呢,说清楚点,谢谢

建立了一个函数:
void CISODATADlg::UpMenu()

if (m_bImportData)

(CButton*)GetDlgItem(IDC_BUTTON_DEL)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_BUTTON_EDIT)->EnableWindow(TRUE);
(CButton*)GetDlgItem(IDC_BUTTON_ISODATA)->EnableWindow(TRUE);
GetMenu()->CheckMenuItem(ID_SETTING,MF_BYCOMMAND   |   MF_CHECKED);
GetMenu()->EnableMenuItem(1,MF_ENABLED|MF_BYPOSITION);
GetMenu()->CheckMenuItem(ID_FILE_SAVE,MF_BYCOMMAND   |   MF_CHECKED);
GetMenu()->EnableMenuItem(2,MF_ENABLED|MF_BYPOSITION);


else

GetMenu()->CheckMenuItem(1,MF_BYCOMMAND   |   MF_CHECKED);
GetMenu()->EnableMenuItem(1,MF_GRAYED|MF_BYPOSITION);
GetMenu()->CheckMenuItem(2,MF_BYCOMMAND   |   MF_CHECKED);
GetMenu()->EnableMenuItem(2,MF_GRAYED|MF_BYPOSITION);
(CButton*)GetDlgItem(IDC_BUTTON_DEL)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_BUTTON_EDIT)->EnableWindow(FALSE);
(CButton*)GetDlgItem(IDC_BUTTON_ISODATA)->EnableWindow(FALSE);



在OnInitDialog()中插入了UpMenu();
在打开文件后,按钮和菜单可以使用,但是在OnOpenFile中调用UpMenu()的,这时候菜单还是灰色的,必须点一下才变亮。

参考技术A 添加相应的消息处理函数,就不是灰色的了

最好不要手动添加,用类向导多方便呀,“Ctrl+W”唤出类向导对话框进行消息关联
参考技术B 应该是新建的额类没有获得菜单消息,菜单的消息响应应该放在主框架里面

// Generated message map functions
protected:
//AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnMenu1();/、定义菜单
//AFX_MSG
DECLARE_MESSAGE_MAP()

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(IDC_MENU1, OnMenu1)//映射菜单
//AFX_MSG_MAP
END_MESSAGE_MAP()

void CMainFrame::OnMenu1()

// TODO: Add your command handler code here
//菜单功能
CA a;//定义其他类的对象
a.rade();//其他类的函数实现
本回答被提问者采纳

如何标记在 vc++ 6 中使用 mfc 检查的菜单项?

【中文标题】如何标记在 vc++ 6 中使用 mfc 检查的菜单项?【英文标题】:How to mark a menu item checked using mfc in vc++ 6? 【发布时间】:2017-09-21 13:50:30 【问题描述】:

我创建了一个带有项目 U 的菜单样式,用于在代码下划线:

void CPersonalEditorView::OnStylesU()
    CHARFORMAT cf; 
    cf.cbSize = sizeof(cf);
    cf.dwMask = CFM_UNDERLINE;
    cf.dwEffects   = CFE_UNDERLINE;
    GetRichEditCtrl().SetSelectionCharFormat(cf);

我想在单击“U”菜单项时标记一个检查。 我试过了:

CMenu *pMenu = GetMenu();
if (pMenu != NULL)
   
    pMenu->CheckMenuItem(ID_STYLES_U, MF_CHECKED | MF_BYCOMMAND);

没用 和:

CWnd* pParent = GetParent();
CMenu* pMenu  = pParent->GetMenu();
pMenu->CheckMenuItem(ID_STYLES_U, MF_CHECKED);

没有工作,并且:

CMenu popupMenu;
popupMenu.LoadMenu(IDR_PERSONTYPE);
popupMenu.CheckMenuItem(ID_STYLES_U,MF_CHECKED);

没用。 告诉我任何可以帮助我的事情。

【问题讨论】:

请阅读有关 On_UPDATE-COMMAND_UI 处理程序的文档! 【参考方案1】:

在资源编辑器中显示您的菜单并右键单击并选择添加事件处理程序

接下来,您需要选择UPDATE_COMMAND_UI 消息并选择适当的类。然后点击添加和编辑

然后,您只需根据需要更新菜单项。例如:

void CMainFrame::OnUpdateOptionsLanguageItalian(CCmdUI* pCmdUI) 

    pCmdUI->SetCheck( theApp.GetProgramLanguage() == LANGUAGE_ITALIAN ? 1 : 0 );

在上面的示例中,我使用的是SetCheck。如果您查看课程,还有其他选择。

如果您的菜单在CDialog 内,则不能使用上述机制,因为默认情况下该架构不存在。您可以添加很多框架,但这不值得。对于对话框对象,您创建一个方法并按需手动调用它。在你的方法中,你会这样做:

CMenu *pMenu = GetMenu();

if (pMenu != nullptr)

    pMenu->CheckMenuItem(ID_VIEW_ASSIGNMENT_HISTORY,
        (m_pAssignHistoryDlg != nullptr)
        ? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED);

所以现在您知道这两种方法了,具体取决于您的菜单上下文。

也就是说,在您的问题中,您没有提供太多有关菜单的上下文。是弹出菜单吗?它是大型机的一部分吗?你什么时候调用菜单?

希望以上内容(如对您问题的评论中所示)就足够了。

【讨论】:

以上是关于MFC中添加的菜单项为啥始终是灰色的的主要内容,如果未能解决你的问题,请参考以下文章

如何将消息映射添加到 MFC 中的动态菜单项

mfc 多文档中怎样动态添加菜单项?

VC/MFC怎样给菜单项添加勾啊

MFC 菜单项复选框行为

vs2013怎么用mfc添加菜单项消息响应函数

为啥单击 SwiftUI 中的列表项后列表视图项变为灰色?