我一直致力于自定义GUI框架,因为我无法处理托管垃圾或本机代码,这需要通过标记(XAML)开发UI。我正在尝试创建一个使用该GUI框架的应用程序的原型,但我在WinAPI中有一个特定于平台的问题,具有Windows的性质。
DWM并不真正允许自定义非客户区域,这打破了沉浸感,它唯一允许的是扩展到客户区域以便给出定制的假象。
因此,最好的行动方案是重建非客户区域"在客户区内(相对于WINAPI),这需要我去除标题,最大化,最小化按钮等。所以,我基本上列举了我想要的所有东西并将它们一起进行OR-ed并翻转所有位以便停用他们。
~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)
一旦这些风格消失,我就无法使用正常的关机程序(Alt + F4,或右键单击任务栏并进入"关闭")因为它们无法正常工作。我不得不手动拦截VK_ESCAPE和PostQuitMessage(0),这样我就可以退出而不必被迫杀死进程。
为什么会这样?我该如何解决这个问题?
答案 0 :(得分:6)
替换:
~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)
使用:
WS_POPUP
没有更时髦的行为。应用程序正确响应。享受蛋糕。
啊,就像最近在MSDN上的所有内容一样,蛋糕是个谎言。 Window styles 并不仅仅是视觉效果。它们还指定了应用程序窗口可用的固有窗口功能。现在,这里有相当多的诡计。
首先,MSDN对其窗口样式定义表并不是真正有用的。 Windows的默认行为是经典标题,close,border包,它被标识为占用最简单表达式的WS_OVERLAPPEDWINDOW
,0(32位值,所有位向下,0x00000000),所以有人希望赶时间通过事物可以为CreateWindow*
函数中的样式设置0,它将产生一个经典窗口。
你想要的是一个裸骨,肮脏和空洞的窗户。微软完全得到了你想要的东西 - WS_POPUP
将最高位设置为1,其他一切都为0.这将删除所有花哨的大小调整自动机,窗口字幕和可爱的最小化,最大化和关闭按钮
这意味着你将不得不重新实现一切。但这就是你想要的,对吧?
只是翻转所有位是不够的,你会删除想要的选项,但也激活其余的选项,导致应用程序表现得很有趣,你现在正在经历什么。因此,您可以将其与其他内容联系起来,也可以使用Microsoft提供的内容 - WS_POPUP
。
再一次。享受蛋糕和快乐的编码。