正确移除窗框/边框

时间:2012-12-28 22:46:07

标签: winapi visual-c++

我一直致力于自定义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),这样我就可以退出而不必被迫杀死进程。

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

1 个答案:

答案 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

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