MFC多文档视图,屏蔽系统自带的 自定义MDI子框架代码后,菜单栏会出现多个小图标,怎么解决?

feixinjiying 2015-07-19 10:33:03
在CxxxClientApp中的InitInstance()里,屏蔽以下代码
// CMultiDocTemplate* pDocTemplate;
// pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME,
// RUNTIME_CLASS(CMSMPClientDoc),
// RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架
// RUNTIME_CLASS(CMSMPClientView));
// if (!pDocTemplate)
// return FALSE;
// AddDocTemplate(pDocTemplate);
运行点击菜单项,会出现这样情况
...全文
243 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2015-07-19
  • 打赏
  • 举报
回复
引用 2 楼 feixinjiying 的回复:
不注释掉就会有一个空文档
你要想启动的时候不产生空白文档,应该这么做:
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
在你的CWinApp派生类中把默认的命令响应函数OnFileNew换成你自己的函数,或者直接注释掉,因为默认你的DOC-VIEW框架会在程序启动时发出一个WM_COMMNAD消息,这个消息的ID就是ID_FILE_NEW,而默认的CWinApp::OnFileNew的作用就是产生空白文档
feixinjiying 2015-07-19
  • 打赏
  • 举报
回复
不注释掉就会有一个空文档
阿源是少年 2015-07-19
  • 打赏
  • 举报
回复
多文档还是单文档也好,都必须要注册一个文档模版,你为什么要注释掉啊?这样引起了问题也是没什么探究意义
feixinjiying 2015-07-19
  • 打赏
  • 举报
回复
引用 14 楼 schlafenhamster 的回复:
菜单是在 // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; 装入的。 去除 BOOL CMainFrame::OnCreateClient 。
问题已解决,多谢,辛苦!!
schlafenhamster 2015-07-19
  • 打赏
  • 举报
回复
菜单是在 // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; 装入的。 去除 BOOL CMainFrame::OnCreateClient 。
feixinjiying 2015-07-19
  • 打赏
  • 举报
回复
引用 11 楼 pcradio 的回复:
重编你的工程,我从来没有遇到过这种问题
全部清理,重新编译也没用,跟这个没关系
阿源是少年 2015-07-19
  • 打赏
  • 举报
回复
重编你的工程,我从来没有遇到过这种问题
feixinjiying 2015-07-19
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
菜单资源 有没有问题 ?
主菜单,我在这里重载了 BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) { // TODO: 在此添加专用代码和/或调用基类 CMenu *pMenu = new CMenu; pMenu->LoadMenu(IDR_MAINFRAME); SetMenu(pMenu); return CMDIFrameWnd::CreateClient(lpcs, pMenu); //return CMDIFrameWnd::OnCreateClient(lpcs, pContext); }
schlafenhamster 2015-07-19
  • 打赏
  • 举报
回复
菜单资源 有没有问题 ?
feixinjiying 2015-07-19
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_DIBDISTYPE, RUNTIME_CLASS(CDIBDisplayDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CDIBDisplayView)); AddDocTemplate(pDocTemplate); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 启动时不自动打开一个空文档 cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE;
这个刚也试了,同样空文档没了,但是会出现点击不同菜单项,出现多个图标
schlafenhamster 2015-07-19
  • 打赏
  • 举报
回复
CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate( IDR_DIBDISTYPE, RUNTIME_CLASS(CDIBDisplayDoc), RUNTIME_CLASS(CChildFrame), // custom MDI child frame RUNTIME_CLASS(CDIBDisplayView)); AddDocTemplate(pDocTemplate); // create main MDI Frame window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; // Parse command line for standard shell commands, DDE, file open CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // 启动时不自动打开一个空文档 cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing; // Dispatch commands specified on the command line if (!ProcessShellCommand(cmdInfo)) return FALSE;
feixinjiying 2015-07-19
  • 打赏
  • 举报
回复
引用 5 楼 pcradio 的回复:
那段代码不能注释的。 不好意思ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)注释不行,要把OnFileNew换成你自己的函数就可以了 你自己在WinApp里定义一个函数
afx_msg void OnMyFileNew();
ON_COMMAND(ID_FILE_NEW, OnMyFileNew)
这样一定可以!
空文档是没有了,但是又出现了上面的情况!
阿源是少年 2015-07-19
  • 打赏
  • 举报
回复
注释不行的原因是CWinApp还做了ID_FILE_NEW的拦截
阿源是少年 2015-07-19
  • 打赏
  • 举报
回复
那段代码不能注释的。 不好意思ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)注释不行,要把OnFileNew换成你自己的函数就可以了 你自己在WinApp里定义一个函数
afx_msg void OnMyFileNew();
ON_COMMAND(ID_FILE_NEW, OnMyFileNew)
这样一定可以!
feixinjiying 2015-07-19
  • 打赏
  • 举报
回复
引用 3 楼 pcradio 的回复:
[quote=引用 2 楼 feixinjiying 的回复:] 不注释掉就会有一个空文档
你要想启动的时候不产生空白文档,应该这么做:
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
在你的CWinApp派生类中把默认的命令响应函数OnFileNew换成你自己的函数,或者直接注释掉,因为默认你的DOC-VIEW框架会在程序启动时发出一个WM_COMMNAD消息,这个消息的ID就是ID_FILE_NEW,而默认的CWinApp::OnFileNew的作用就是产生空白文档[/quote] 注释了,还是会产生空文档 CMultiDocTemplate* pDocTemplate; pDocTemplate = new CMultiDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CMSMPClientDoc), RUNTIME_CLASS(CChildFrame), // 自定义 MDI 子框架 RUNTIME_CLASS(CMSMPClientView)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); 只要有这段代码,就会有空文档创建

15,976

社区成员

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

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