是否可以更改 MFC MDI 应用程序中主***菜单的位置?

Posted

技术标签:

【中文标题】是否可以更改 MFC MDI 应用程序中主***菜单的位置?【英文标题】:Is it possible to change the location of the main top-level menu in an MFC MDI app? 【发布时间】:2010-09-13 19:59:59 【问题描述】:

我有一个带有自定义框架(即标题/标题栏、边框)的应用。我通过删除 WS_CAPTION 样式自定义框架,并覆盖 OnNcCalcSize 为标题保留自定义大小的区域,应用程序在 OnNcPaint 中绘制该区域。

一个副作用是菜单栏不再显示,这没关系,因为我想自定义主菜单的外观和位置。不幸的是,我不知道该怎么做。我希望“文件”菜单比标准菜单栏离左边缘更远。

可接受的替代方法是完全删除菜单,并使用 OnNcHitTest、OnNcPaint 和 OnNcMouseMove 来管理***菜单的手动编码替换。

【问题讨论】:

【参考方案1】:

我从未见过修改标准菜单外观的方法。您可以删除它(从您的 InitInstance 中删除创建代码),然后编写替换代码。不过,我不会在 OnNcXXX 中这样做,而是制作一个您位于顶部的新自定义控件。或者您可以查看 MFC Next 主题菜单并编写自定义 UI 渲染器。覆盖剩下的几个函数并设置菜单的对齐方式可能就足够了。

【讨论】:

【参考方案2】:

这是一个 MFC MDI 应用程序 - InitInstance 不是创建菜单的位置。我试图摆脱菜单(并且暂时成功),但 MFC 框架似乎正在“把它放回去”——我认为 MDI 模型有子窗口修改菜单,但这样做的代码似乎埋在框架中的某个地方(否则我无法准确找到它在应用程序代码中发生的位置,但我怀疑它发生在 MFC 框架代码中)。如果我知道在哪里,我也许可以覆盖这些方法并进行控制……我想。

编写自定义控件与处理 OnNcMouseMove 和 OnNcLeftButtonDown 的原因是什么,例如?我不希望在任何其他应用程序中都需要该功能(新应用程序可能会用 C# 编码),所以我正在寻找易于实现,而不是代码重用。

【讨论】:

以上是关于是否可以更改 MFC MDI 应用程序中主***菜单的位置?的主要内容,如果未能解决你的问题,请参考以下文章

保存工作区 MFC C++ MDI

如何从 MDI Visual C++ 2008 应用程序更改子窗口的背景

如何更改 MDI Tab 文档菜单中的顺序?

mfc中MDI模式下实现单文档多视图多窗口

MDI 应用程序 MFC 中文档的多个视图

如何让您的 MDI MFC 应用程序在任务栏中显示一个实例?