MDI 如何重绘*菜单栏? 郁闷了N天...

时间:2021-01-09 10:53:42
MFC 向导创建 MDI 两个资源IDR_MAINFRAME和IDR_EYETYPE

显示窗口时的是IDR_EYETYPE,当关闭所有子窗口才显示IDR_MAINFRAME菜单

但如何得到IDR_EYETYPE的句柄或对象?

((CChildFrame*)this->GetActiveFrame())->GetMenu();
CMenu::FromHandle(::GetMenu(GetSafeHwnd()));
等等。。结果都得不到。全是指向个CTempMenu东西,貌似只能改变IDR_MAINFRAME菜单

我的目的是重绘MDI*菜单。。比如背景什么的。。

谢谢

11 个解决方案

#1


就用AfxGetMainWnd()->GetMenu()就可以了啊。

#2


AfxGetMainWnd()-> GetMenu()我也试过

还是得不到啊,这也只能得到IDR_MAINFRAME

#3


*菜单重绘不好搞,一般的办法是把菜单放到CReBar上来实现菜单栏背景重绘,网上例子也较多

#4


那你就公用一个菜单资源吧

#5



公用一个菜单资源也是不行的,改变类型什么的也只改的了主菜单

现在正在看CDocTemplate,CMultiDocTemplate类还有runtime_class宏。。。我想这里面应该就是关键了

CReBar可以吗?是先销毁原有菜单然后再自己创建?SDI的好改,直接就能得到菜单,网上我也只找到SDI的例子。。

To: Y__Y 现在你有例子吗?我实在没找到。有就给我个例子好吗?qzlbeyond@163.com 谢谢
 

#6


网上只有SDI的,在MDI里完全无效

#7


http://www.codeproject.com/KB/menus/menubarxp.aspx

#8


感谢Y__Y提供的例子,可我想重绘的是*菜单的菜单条,不是Pop-up Menu。

并且网上大多是单文档的例子,单文档GetMenu就可以的到并重绘。MDI却有两个Menu, 当关闭子窗口时,主窗口的菜单才显示。
而GetMenu都只能得到主窗口的菜单。

MDI:

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_EYETYPE,                        //打开MDI有子窗口时显示的菜单IDR_EYETYPE
RUNTIME_CLASS(CEyeDoc),
RUNTIME_CLASS(CChildFrame),         // custom MDI child frame
RUNTIME_CLASS(CEyeView));
AddDocTemplate(pDocTemplate);

// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;   
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))  //关闭所有子窗口显示的菜单IDR_MAINFRAME
return FALSE;
m_pMainWnd = pMainFrame;

深入浅出里面大致讲了以上内容。
CMultiDocTemplate public: CDocTemplate
...
CFrameWnd* CDocTemplate::CreateNewFrame(CDocument *pDoc, CFrameWnd *pOther)
{
   ...
   pFrame->LoadFrame(m_nIDResource,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context)
   ...
   return pFrame;
}

难道我需要重写个继承CMultiDocTemplate 类才行吗?

#9


补充一下,我想重绘MDI*菜单的菜单条

#10


UP

#11


..........

#1


就用AfxGetMainWnd()->GetMenu()就可以了啊。

#2


AfxGetMainWnd()-> GetMenu()我也试过

还是得不到啊,这也只能得到IDR_MAINFRAME

#3


*菜单重绘不好搞,一般的办法是把菜单放到CReBar上来实现菜单栏背景重绘,网上例子也较多

#4


那你就公用一个菜单资源吧

#5



公用一个菜单资源也是不行的,改变类型什么的也只改的了主菜单

现在正在看CDocTemplate,CMultiDocTemplate类还有runtime_class宏。。。我想这里面应该就是关键了

CReBar可以吗?是先销毁原有菜单然后再自己创建?SDI的好改,直接就能得到菜单,网上我也只找到SDI的例子。。

To: Y__Y 现在你有例子吗?我实在没找到。有就给我个例子好吗?qzlbeyond@163.com 谢谢
 

#6


网上只有SDI的,在MDI里完全无效

#7


http://www.codeproject.com/KB/menus/menubarxp.aspx

#8


感谢Y__Y提供的例子,可我想重绘的是*菜单的菜单条,不是Pop-up Menu。

并且网上大多是单文档的例子,单文档GetMenu就可以的到并重绘。MDI却有两个Menu, 当关闭子窗口时,主窗口的菜单才显示。
而GetMenu都只能得到主窗口的菜单。

MDI:

CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_EYETYPE,                        //打开MDI有子窗口时显示的菜单IDR_EYETYPE
RUNTIME_CLASS(CEyeDoc),
RUNTIME_CLASS(CChildFrame),         // custom MDI child frame
RUNTIME_CLASS(CEyeView));
AddDocTemplate(pDocTemplate);

// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;   
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))  //关闭所有子窗口显示的菜单IDR_MAINFRAME
return FALSE;
m_pMainWnd = pMainFrame;

深入浅出里面大致讲了以上内容。
CMultiDocTemplate public: CDocTemplate
...
CFrameWnd* CDocTemplate::CreateNewFrame(CDocument *pDoc, CFrameWnd *pOther)
{
   ...
   pFrame->LoadFrame(m_nIDResource,WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context)
   ...
   return pFrame;
}

难道我需要重写个继承CMultiDocTemplate 类才行吗?

#9


补充一下,我想重绘MDI*菜单的菜单条

#10


UP

#11


..........