winapi - 正确移除窗框/边框

标签 winapi visual-c++

我一直致力于自定义 GUI 框架,因为我无法处理需要通过标记 (XAML) 开发 UI 的托管废话或 native 代码。我正在尝试创建一个使用该 GUI 框架的应用程序原型(prototype),但我遇到了一个与 WinAPI 中窗口的性质有关的特定于平台的问题。

DWM 并没有真正允许定制非客户区,这会破坏沉浸感,它唯一允许的是扩展到客户区,以给人一种定制的错觉。

所以,最好的做法是重建客户区内的“非客户区”(相对于 WINAPI),这需要我去除标题、最大化、最小化按钮等。所以,我基本上列举了所有我想要的东西,然后将它们放在一起并翻转所有位以停用它们。

~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)

一旦这些样式消失,我就无法使用正常的关机程序(Alt+F4,或右键单击任务栏并转到“关闭”),因为它们不起作用。我必须手动拦截 VK_ESCAPE 和 PostQuitMessage(0),这样我才能退出而不会被迫终止进程。

为什么会这样?我该如何解决这个问题?

最佳答案

简短的回答

替换:

~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)

与:

WS_POPUP

不再有古怪的行为。应用程序正确响应。享用蛋糕吧。

长答案

啊,就像最近 MSDN 上的所有内容一样,蛋糕是个谎言。窗口样式 不仅仅是视觉上的。它们还指定应用程序窗口可用的固有窗口功能。现在,这里有相当多的诡计需要观察。

首先,MSDN 的窗口样式定义表并不是真正有用的。 Windows 的默认行为是经典的标题、关闭、边框包,它被标识为 WS_OVERLAPPEDWINDOW,它占用最简单的表达式 0(一个 32 位值,所有位向下,0x00000000),所以有人希望匆匆忙忙的可以在 CreateWindow* 函数中将样式设置为 0,它会产生一个经典窗口。

你想要的是一个简陋的、肮脏的、空的窗口。 Microsoft 正好有你要找的东西 - WS_POPUP 它将最高位设置为 1,其他所有内容都为 0。这将放弃所有花哨的调整大小自动机、窗口字幕和可爱的最小化、最大化和关闭按钮。

这意味着您将不得不重新实现所有内容。但这就是您想要的,对吧?

仅仅翻转所有位是不够的,您将放弃想要的选项,但也会激活其余选项,从而使应用程序表现得很有趣,就像您现在正在体验的那样。因此,您要么将它与其他内容进行 AND 运算,要么使用 Microsoft 轻松定义的内容 - WS_POPUP

又来了。享受蛋糕和快乐的编码。

关于winapi - 正确移除窗框/边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14076731/

相关文章:

c++ - 控制台程序中的定时器

c# - LRESULT、WPARAM 和 LPARAM 是什么意思?

c++ - typeid 运算符返回的对象的生命周期是多少?

visual-studio - 使用标准 #ifndef MS-VC++ 覆盖 #pragma 一次

c++ - 在错误的对象上调用复制构造函数

c++ - 需要将 MS Visual C++ 移植到 Linux G++

c++ - 防止 Hook dll加载

excel - VBA:在类模块中模拟 AddressOf 运算符的解决方法

c++ - 单独更改我的应用程序的字体平滑而不是全局 Windows 字体平滑设置

c++ - 在 Qt MinGW 编译器中处理 __event