MDI 修改了主框架菜单,打开子框架之后,菜单被刷新

yyb520a 2017-11-30 07:18:47
问题情境:
做一个中英切换的功能。
问题描述:
1.在InitInstance()函数中已使用自己创建的菜单:IDR_JSGTYPE
pVideoDocTemplate = new CMultiDocTemplate(IDR_JSGTYPE,
RUNTIME_CLASS(CJSGDoc),
RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
RUNTIME_CLASS(CJSGView));
if (!pVideoDocTemplate)
return FALSE;
AddDocTemplate(pVideoDocTemplate);
pMeasureDocTemplate = new CMultiDocTemplate(IDR_JSGTYPE,
RUNTIME_CLASS(CMeasureDoc),
RUNTIME_CLASS(CMeasureFrm), // 自定义 MDI 子框架
RUNTIME_CLASS(CMeasureView));
if (!pMeasureDocTemplate)
return FALSE;
AddDocTemplate(pMeasureDocTemplate);

this->CleanState();// 创建主 MDI 框架窗口
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame || !pMainFrame->LoadFrame(IDR_JSGTYPE))
{
delete pMainFrame;
return FALSE;
}
m_pMainWnd = pMainFrame;

2.在MainFrm.cpp的Creat函数中根据所选语言更改菜单文本
....
m_wndMenuBar.Create(this);
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
...
CMenu *cMenu = CMenu::FromHandle(m_wndMenuBar.GetHMenu());
CMenu *subMenu = cMenu->GetSubMenu(0);//获取菜单中的第一个菜单
...
DrawMenuBar();
3.启动程序主框架能正确显示菜单文本,但是打开子框架之后,菜单又恢复到原来的样子了,貌似被刷新了,有人知道这什么原因吗?
...全文
349 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyb520a 2017-12-04
  • 打赏
  • 举报
回复
引用 8 楼 wangningyu 的回复:
[quote=引用 7 楼 cvbtvbwu 的回复:] [quote=引用 6 楼 yyb520a 的回复:] [quote=引用 5 楼 cvbtvbwu 的回复:] 关于中英文,我是这样做的,选择语言之前,直接刷新菜单的文字,如下: m_wndMenuBar.SetButtonText(0, GetTranslationString(_T("4"))); m_wndMenuBar.SetButtonText(1, GetTranslationString(_T("5"))); 而那些弹出的菜单,我是通过重载virtual BOOL OnShowPopupMenu(CMFCPopupMenu* pMenuPopup);来设置文字

BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
{
	if ((pMenuPopup != NULL) && !CMFCToolBar::IsCustomizeMode()) 
	{ 
		CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar();
		 
		CMFCToolBarMenuButton* pParentButton = pMenuPopup->GetParentButton();
	
		if(pParentButton != NULL)
		{
			if(pParentButton->m_strText == GetTranslationString(_T("4")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("8")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("5")))
			{
				pMenuBar->SetButtonText(0, pGetTranslationString(_T("13")));
				pMenuBar->SetButtonText(1, GetTranslationString(_T("14")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("6")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("22")));
			}
		}
	}

	return __super::OnShowPopupMenu(pMenuPopup);
}
GetTranslationString()你这个函数是自定义的吗?返回值是什么?[/quote] 自定义的,根据语言类型返回字符串[/quote] 多语言还是要按资源文件做,把RC拷贝出来做DLL [/quote]嗯,还是老老实实做DLL来的实在.
yyb520a 2017-12-04
  • 打赏
  • 举报
回复
引用 9 楼 tajon1226 的回复:
我就好人做到底吧。 Ctrl + Shift + X 打开ClassWizard, 类名找到CMainFrame, 在虚函数里添加OnUpdateFrameTitle 增加一行代码bAddToTitle = FALSE; 告诉框架,我不需要根据文档名来更改我的主框架标题! void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle) { // TODO: 在此添加专用代码和/或调用基类 bAddToTitle = FALSE; CMDIFrameWndEx::OnUpdateFrameTitle(bAddToTitle); } 其实不一定要用MFC自带的MDI框架的,自己弄一个还容易理解一些。
谢谢你的解答和建议,但是我试过了,菜单文本还是被刷新了
走好每一步 2017-12-04
  • 打赏
  • 举报
回复
说白了,就是MFC自以为是的认为文档打开的菜单栏和主框架栏不一样,所以搞了2套菜单。 微软这封框架的是真够烂的。
走好每一步 2017-12-04
  • 打赏
  • 举报
回复
引用 9 楼 tajon1226 的回复:
我就好人做到底吧。 Ctrl + Shift + X 打开ClassWizard, 类名找到CMainFrame, 在虚函数里添加OnUpdateFrameTitle 增加一行代码bAddToTitle = FALSE; 告诉框架,我不需要根据文档名来更改我的主框架标题! void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle) { // TODO: 在此添加专用代码和/或调用基类 bAddToTitle = FALSE; CMDIFrameWndEx::OnUpdateFrameTitle(bAddToTitle); } 其实不一定要用MFC自带的MDI框架的,自己弄一个还容易理解一些。
我这边看错了,你是说刷新菜单,我看成刷程序的title了。 那个一样的,是childFrame的加载的菜单重新刷了一遍,所以你改的失败了。 这个我改了,方式就是ini做的,比DLL方式有弹性多了。
走好每一步 2017-12-03
  • 打赏
  • 举报
回复
我就好人做到底吧。 Ctrl + Shift + X 打开ClassWizard, 类名找到CMainFrame, 在虚函数里添加OnUpdateFrameTitle 增加一行代码bAddToTitle = FALSE; 告诉框架,我不需要根据文档名来更改我的主框架标题! void CMainFrame::OnUpdateFrameTitle(BOOL bAddToTitle) { // TODO: 在此添加专用代码和/或调用基类 bAddToTitle = FALSE; CMDIFrameWndEx::OnUpdateFrameTitle(bAddToTitle); } 其实不一定要用MFC自带的MDI框架的,自己弄一个还容易理解一些。
汪宁宇 2017-12-02
  • 打赏
  • 举报
回复
引用 7 楼 cvbtvbwu 的回复:
[quote=引用 6 楼 yyb520a 的回复:] [quote=引用 5 楼 cvbtvbwu 的回复:] 关于中英文,我是这样做的,选择语言之前,直接刷新菜单的文字,如下: m_wndMenuBar.SetButtonText(0, GetTranslationString(_T("4"))); m_wndMenuBar.SetButtonText(1, GetTranslationString(_T("5"))); 而那些弹出的菜单,我是通过重载virtual BOOL OnShowPopupMenu(CMFCPopupMenu* pMenuPopup);来设置文字

BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
{
	if ((pMenuPopup != NULL) && !CMFCToolBar::IsCustomizeMode()) 
	{ 
		CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar();
		 
		CMFCToolBarMenuButton* pParentButton = pMenuPopup->GetParentButton();
	
		if(pParentButton != NULL)
		{
			if(pParentButton->m_strText == GetTranslationString(_T("4")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("8")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("5")))
			{
				pMenuBar->SetButtonText(0, pGetTranslationString(_T("13")));
				pMenuBar->SetButtonText(1, GetTranslationString(_T("14")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("6")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("22")));
			}
		}
	}

	return __super::OnShowPopupMenu(pMenuPopup);
}
GetTranslationString()你这个函数是自定义的吗?返回值是什么?[/quote] 自定义的,根据语言类型返回字符串[/quote] 多语言还是要按资源文件做,把RC拷贝出来做DLL
叶恭介叶恭介 2017-12-02
  • 打赏
  • 举报
回复
引用 6 楼 yyb520a 的回复:
[quote=引用 5 楼 cvbtvbwu 的回复:] 关于中英文,我是这样做的,选择语言之前,直接刷新菜单的文字,如下: m_wndMenuBar.SetButtonText(0, GetTranslationString(_T("4"))); m_wndMenuBar.SetButtonText(1, GetTranslationString(_T("5"))); 而那些弹出的菜单,我是通过重载virtual BOOL OnShowPopupMenu(CMFCPopupMenu* pMenuPopup);来设置文字

BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
{
	if ((pMenuPopup != NULL) && !CMFCToolBar::IsCustomizeMode()) 
	{ 
		CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar();
		 
		CMFCToolBarMenuButton* pParentButton = pMenuPopup->GetParentButton();
	
		if(pParentButton != NULL)
		{
			if(pParentButton->m_strText == GetTranslationString(_T("4")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("8")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("5")))
			{
				pMenuBar->SetButtonText(0, pGetTranslationString(_T("13")));
				pMenuBar->SetButtonText(1, GetTranslationString(_T("14")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("6")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("22")));
			}
		}
	}

	return __super::OnShowPopupMenu(pMenuPopup);
}
GetTranslationString()你这个函数是自定义的吗?返回值是什么?[/quote] 自定义的,根据语言类型返回字符串
叶恭介叶恭介 2017-12-01
  • 打赏
  • 举报
回复
关于中英文,我是这样做的,选择语言之前,直接刷新菜单的文字,如下: m_wndMenuBar.SetButtonText(0, GetTranslationString(_T("4"))); m_wndMenuBar.SetButtonText(1, GetTranslationString(_T("5"))); 而那些弹出的菜单,我是通过重载virtual BOOL OnShowPopupMenu(CMFCPopupMenu* pMenuPopup);来设置文字

BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
{
	if ((pMenuPopup != NULL) && !CMFCToolBar::IsCustomizeMode()) 
	{ 
		CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar();
		 
		CMFCToolBarMenuButton* pParentButton = pMenuPopup->GetParentButton();
	
		if(pParentButton != NULL)
		{
			if(pParentButton->m_strText == GetTranslationString(_T("4")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("8")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("5")))
			{
				pMenuBar->SetButtonText(0, pGetTranslationString(_T("13")));
				pMenuBar->SetButtonText(1, GetTranslationString(_T("14")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("6")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("22")));
			}
		}
	}

	return __super::OnShowPopupMenu(pMenuPopup);
}
叶恭介叶恭介 2017-12-01
  • 打赏
  • 举报
回复
CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CTouchPanelDoc), RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架 RUNTIME_CLASS(CTouchPanelView)); 有两个菜单的,一个主菜单,一个子窗口菜单。
yyb520a 2017-12-01
  • 打赏
  • 举报
回复
UP! 求解决方案..
走好每一步 2017-12-01
  • 打赏
  • 举报
回复
多文档是这样的! 它的title根据每个文档不同来刷新,这个设计非常不直观,也非常讨人嫌! MFC多文档我觉得是封的比较烂的框架
yyb520a 2017-12-01
  • 打赏
  • 举报
回复
引用 5 楼 cvbtvbwu 的回复:
关于中英文,我是这样做的,选择语言之前,直接刷新菜单的文字,如下: m_wndMenuBar.SetButtonText(0, GetTranslationString(_T("4"))); m_wndMenuBar.SetButtonText(1, GetTranslationString(_T("5"))); 而那些弹出的菜单,我是通过重载virtual BOOL OnShowPopupMenu(CMFCPopupMenu* pMenuPopup);来设置文字

BOOL CMainFrame::OnShowPopupMenu(CMFCPopupMenu* pMenuPopup)
{
	if ((pMenuPopup != NULL) && !CMFCToolBar::IsCustomizeMode()) 
	{ 
		CMFCPopupMenuBar* pMenuBar = pMenuPopup->GetMenuBar();
		 
		CMFCToolBarMenuButton* pParentButton = pMenuPopup->GetParentButton();
	
		if(pParentButton != NULL)
		{
			if(pParentButton->m_strText == GetTranslationString(_T("4")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("8")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("5")))
			{
				pMenuBar->SetButtonText(0, pGetTranslationString(_T("13")));
				pMenuBar->SetButtonText(1, GetTranslationString(_T("14")));
			}
			else if(pParentButton->m_strText == GetTranslationString(_T("6")))
			{
				pMenuBar->SetButtonText(0, GetTranslationString(_T("22")));
			}
		}
	}

	return __super::OnShowPopupMenu(pMenuPopup);
}
GetTranslationString()你这个函数是自定义的吗?返回值是什么?
望蓝天 2017-11-30
  • 打赏
  • 举报
回复
感觉当打开视图时会调用动态添加的文档视图类,你也在InitInstance()里设置好了菜单资源。但是看你有两个自定的MDI子框架,不知道会不会是这个问题?帮顶!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧