带有多个菜单栏的 Win32 中的 Windows 应用程序?
Posted
技术标签:
【中文标题】带有多个菜单栏的 Win32 中的 Windows 应用程序?【英文标题】:Windows App in Win32 with multiple menu bars? 【发布时间】:2020-06-27 04:02:53 【问题描述】:我正在为可以在多个窗口中工作的窗口设计一个相对繁重的应用程序(每个窗口都可以处于停靠/非停靠模式)。
到目前为止,应用程序的开发都是在Win32框架下完成的,但感觉应用程序的外观无法再现代化超过一定限度。
当子窗口处于停靠模式时,我们在向子窗口添加菜单项时遇到了问题。他们可以拥有菜单项,但是当他们成为停靠模式下的子项时,它们会在带有蓝色 windows-XP 样式框架的情况下看起来很奇怪。
有没有办法移除这个蓝框并关闭、最大化/最小化按钮但在 Win32 API 中保留儿童窗口的菜单栏?
这是我如何使窗口成为子窗口的最少代码:
ShowWindow(hParentWindow, SW_SHOWNORMAL);
SetParent(hChildWindow, hParentWindow);
MoveWindow(hChildWindow, 0, 0, width2, length2, true); //Moving Child window inside the parent
RedrawWindow(hChildWindow, nullptr, nullptr, RDW_INVALIDATE);
ShowWindow(hChildWindow, SW_SHOWNORMAL);
这样我将在子窗口中拥有菜单栏,但它也会有蓝色框架并关闭我不想要的最大化。如果我用以下代码更改子窗口的样式,它将不再有蓝色框架,但它也会失去它的菜单栏:
SetWindowLong(hChildWindow, GWL_STYLE, CHILD_STYLES);
【问题讨论】:
You cannot assign a menu to a child window。无论您在做什么,都与您的描述不符。请出示minimal reproducible example。 我添加了一张子窗口仍然有菜单栏的图片。我无法摆脱的蓝色框架看起来很奇怪。 再次,请显示minimal reproducible example。由于您跳过了它,请使用tour。还要确保阅读How to Ask。 添加了一些可重现的代码。希望它更清楚。WS_CHILD
- 该窗口是一个子窗口。这种风格的窗口不能有菜单栏。并且SetParent
不会修改正在更改其父窗口的窗口样式。如果hWndNewParent
不是NULL
,请在调用SetParent
之前设置WS_CHILD
样式。
【参考方案1】:
您的窗口在未停靠时有一个框架。您必须使用 GetWindowLong() 和 SetWindowLong() 的组合删除框架
例子:
LONG lExStyle = GetWindowLong(hwnd, GWL_EXSTYLE);
LONG lStyle = GetWindowLong(hwnd, GWL_STYLE);
lStyle &= ~(WS_BORDER | WS_CAPTION);
lExStye &= ~(WS_EX_MDICHILD | WS_EX_OVERLAPPEDWINDOW);
SetWindowLong(hwnd, GWL_EXSTYLE, lExStyle);
SetWindowLong(hwnd, GWL_STYLE, lStyle);
标志当然取决于你想要的效果,这种形式的序列也应该在脱离时完成,使用按位 AND 和 OR 来设置/重置标志。
“蓝框”表示 MDI 子窗口,或重叠窗口是子窗口的子窗口。
【讨论】:
太棒了...谢谢,它就像一个魅力??另外,你知道Win32中是否有任何用于停靠/取消停靠的内置按钮? (在我的原始帖子中添加了图片) 不,没有。您必须将“pin”位图添加到您的资源中。要将按钮添加到您的框架中,您必须拥有自己绘制的标题栏。以上是关于带有多个菜单栏的 Win32 中的 Windows 应用程序?的主要内容,如果未能解决你的问题,请参考以下文章