正确移除窗框/边框

Fra*_*nce 3 winapi visual-c++

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

DWM并不真正允许自定义非客户区域,这会破坏沉浸感,它唯一允许的是扩展到客户区域以便给出定制的假象.

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

~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)
Run Code Online (Sandbox Code Playgroud)

一旦这些样式消失,我就无法使用正常的关机程序(Alt + F4,或右键单击任务栏并进入"关闭"),因为它们不起作用.我不得不手动拦截VK_ESCAPE和PostQuitMessage(0),所以我可以退出而不必被迫杀死进程.

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

小智 6

简短的回答

更换:

~(WS_CAPTION | WS_SYSMENU | WS_HSCROLL | WS_VSCROLL | WS_MINIMIZE | WS_MAXIMIZE | WS_THICKFRAME)
Run Code Online (Sandbox Code Playgroud)

附:

WS_POPUP
Run Code Online (Sandbox Code Playgroud)

没有更时髦的行为.应用程序正确响应.享受蛋糕.

答案很长

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

首先,MSDN并不是真正适用于其窗口样式定义表.Windows的默认行为是经典标题,close,border包,它被识别为WS_OVERLAPPEDWINDOW占用最简单的表达式0(32位值,所有位都向下,0x00000000),所以有人希望通过事物来匆匆忙忙0表示CreateWindow*函数中的样式,它将产生一个经典窗口.

你想要的是一个裸骨,肮脏和空洞的窗户.而微软正是你正在寻找的东西 - WS_POPUP它将最高位设置为1,其他一切都是0.这将放弃所有花哨的大小调整自动机,窗口字幕和可爱的最小化,最大化和关闭按钮.

这意味着你将不得不重新实现一切.但这就是你想要的,对吧?

只是翻转所有的位是不够的,你会删除想要的选项,但也激活其余的选项,导致应用程序表现得很有趣,你现在正在经历什么.因此,您要么将其与其他东西联系起来,要么使用微软容易定义的东西 - WS_POPUP.

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