2012-12-28 74 views
2

我一直在处理自定义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),这样我就可以退出而不会被迫终止进程。

这是为什么呢?我该如何解决这个问题?

回答

5

简短的回答

替换:

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

有了:

WS_POPUP 

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

长的答案

啊,因为一切在MSDN最近,蛋糕是一个谎言。窗口风格不只是视觉。它们还指定了应用程序窗口可用的固有窗口功能。现在,这里有相当多的技巧需要观察。

首先,MSDN对于其窗口样式定义表格来说并不是真的很有用。 Windows的默认行为是典型的标题,关闭边界确定其为占据最简单的表达,0 WS_OVERLAPPEDWINDOW包(32位值,所有比特下来,00000000),所以有人希望通过事急着可以只在CreateWindow*函数中为样式设置0,它会产生一个经典窗口。

你想要的是一个裸露的,肮脏的空窗口。而微软的得到正是你要找的东西 - WS_POPUP这台最高位为1,其他都是0。这将放弃所有花哨的自动调整,窗口字幕和可爱的最小化,最大化和关闭按钮。这意味着你将不得不重新实现一切。但那就是你要去的,对吧?

只需翻转所有位是不够的,你将下降想要的选项,同时也激活导致应用程序行事滑稽的选项,您遇到什么,现在休息。因此,你要么与其他东西或使用微软定义的东西 - WS_POPUP

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

+0

哈哈,它的工作,正确关闭!谢谢!我现在感觉非常愚蠢。 –