如何在 vc++ 6 中使用 mfc 标记选中的菜单项?
How to mark a menu item checked using mfc in vc++ 6?
我创建了一个带有项目 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);
无效。
告诉我任何可以帮助我的事情。
在资源编辑器中显示您的菜单 right-click 和 select 添加事件处理程序:
接下来,您需要select UPDATE_COMMAND_UI 消息并选择合适的class。然后点击添加和编辑:
然后,您只需根据需要更新菜单项。例如:
void CMainFrame::OnUpdateOptionsLanguageItalian(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( theApp.GetProgramLanguage() == LANGUAGE_ITALIAN ? 1 : 0 );
}
在上面的例子中我使用了SetCheck。如果您查看 class.
,还有其他选择
如果您的菜单位于 CDialog
中,则您不能使用上述机制,因为默认情况下不存在架构。您可以添加很多框架,但这不值得。对于对话对象,您创建一个方法并根据需要手动调用它。在你的方法中你会做:
CMenu *pMenu = GetMenu();
if (pMenu != nullptr)
{
pMenu->CheckMenuItem(ID_VIEW_ASSIGNMENT_HISTORY,
(m_pAssignHistoryDlg != nullptr)
? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED);
}
现在您知道了这两种方法,具体取决于菜单的上下文。
就是说,在您的问题中,您没有提供太多关于菜单的上下文。是弹出菜单吗?它是大型机的一部分吗?你什么时候调用菜单?
希望上述内容(如您问题的评论中所述)就足够了。
我创建了一个带有项目 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);
无效。 告诉我任何可以帮助我的事情。
在资源编辑器中显示您的菜单 right-click 和 select 添加事件处理程序:
接下来,您需要select UPDATE_COMMAND_UI 消息并选择合适的class。然后点击添加和编辑:
然后,您只需根据需要更新菜单项。例如:
void CMainFrame::OnUpdateOptionsLanguageItalian(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck( theApp.GetProgramLanguage() == LANGUAGE_ITALIAN ? 1 : 0 );
}
在上面的例子中我使用了SetCheck。如果您查看 class.
,还有其他选择如果您的菜单位于 CDialog
中,则您不能使用上述机制,因为默认情况下不存在架构。您可以添加很多框架,但这不值得。对于对话对象,您创建一个方法并根据需要手动调用它。在你的方法中你会做:
CMenu *pMenu = GetMenu();
if (pMenu != nullptr)
{
pMenu->CheckMenuItem(ID_VIEW_ASSIGNMENT_HISTORY,
(m_pAssignHistoryDlg != nullptr)
? MF_BYCOMMAND | MF_CHECKED : MF_BYCOMMAND | MF_UNCHECKED);
}
现在您知道了这两种方法,具体取决于菜单的上下文。
就是说,在您的问题中,您没有提供太多关于菜单的上下文。是弹出菜单吗?它是大型机的一部分吗?你什么时候调用菜单?
希望上述内容(如您问题的评论中所述)就足够了。