c++ - 如何在 MFC 应用程序中添加文档菜单?
问题描述
当您右键单击 Visual Studio 中的任何选项卡时,将出现一个菜单,其中包含一些选项,例如(保存、关闭除此之外的所有选项、复制完整路径、打开包含文件夹......)。如何在 MFC(doc/view) 选项卡式应用程序中添加类似的菜单?提前致谢。
解决方案
你应该有不止一个菜单。IDR_MAINFRAME
通常在没有打开文档时使用,这不是您想要的。
资源编辑器应该显示另一个主菜单(不是弹出菜单),其 ID 类似于IDR_MyAppTYPE
. 此菜单 ID 应该已经在您的CWinAppEx
班级中:
BOOL CMyApp::InitInstance()
{
...
pDocTemplate = new CMultiDocTemplate(IDR_MyAppTYPE, ...);
...
}
这是您的文档菜单。
使用资源编辑器编辑此菜单。添加命令"Close all but this"
和菜单命令的 id 将类似于ID_WINDOW_CLOSEALL_BUT_THIS
您必须在CView
派生类中处理此命令。例子:
BEGIN_MESSAGE_MAP(CMyView, CView)
ON_COMMAND(ID_WINDOW_CLOSEALL_BUT_THIS, OnCloseAllButThis)
...
END_MESSAGE_MAP()
void CMyView::OnCloseAllButThis()
{
POSITION p1 = AfxGetApp()->GetFirstDocTemplatePosition();
while(p1)
{
CDocTemplate *doctempl = AfxGetApp()->GetNextDocTemplate(p1);
POSITION p2 = doctempl->GetFirstDocPosition();
while(p2)
{
CDocument* doc = doctempl->GetNextDoc(p2);
POSITION p3 = doc->GetFirstViewPosition();
while(p3)
{
CView* view = doc->GetNextView(p3);
if(view && view->GetParentFrame() && view != this)
view->GetParentFrame()->SendMessage(WM_CLOSE);
}
}
}
}
推荐阅读
- c# - 如果我在 Unity (OAuth 2.0) 中有 android 应用程序,redirect_uri 是什么?
- javascript - 如何保存来自文本框(html/java)的用户输入以供以后显示使用
- android - 通过新项目更改 Firebase 包名称不起作用
- laravel - 如何使用 VueJS Axios 发布突变 Laravel GraphQL
- javascript - Gulp- javascript 文件的版本控制
- python - build Hierarchical comment tree?
- php - 如何从 td 标签中获取价值并在 codeigniter 的 foreach 中使用它
- python - 以pythonic方式实现递归
- docker - 如何配置 docker 以允许从其他计算机连接到容器?
- python - Python 去聚合