3

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

DWM 并不真正允许定制打破沉浸感的非客户区,它唯一允许的就是扩展到客户区,以产生定制的错觉。

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

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

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

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

4

1 回答 1

6

简短的回答

代替:

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

和:

WS_POPUP

并且没有更多时髦的行为。应用程序正确响应。享受蛋糕。

长答案

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

首先,MSDN 的窗口样式定义表并没有真正推出和有用。Windows 的默认行为是经典的标题、关闭、边框包,它被标识为WS_OVERLAPPEDWINDOW占用最简单的表达式 0(一个 32 位值,所有位向下,0x00000000),所以想要快速浏览的人可以设置0 用于CreateWindow*函数中的样式,它将产生一个经典窗口。

你想要的是一个简陋的、肮脏的、空荡荡的窗户。微软得到了你正在寻找的东西——WS_POPUP它将最高位设置为 1,其他一切都是 0。这将放弃所有花哨的自动调整大小、窗口字幕和可爱的最小化、最大化和关闭按钮。

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

仅仅翻转所有位是不够的,您将放弃想要的选项,但也会激活其余选项,导致应用程序表现得有趣,您现在正在经历什么。因此,您要么将其与其他东西相结合,要么使用 Microsoft 很容易定义的东西 - WS_POPUP.

然后再次。享受蛋糕和快乐的编码。

于 2012-12-28T23:46:22.497 回答