小细节:窗口的标题栏实际上还包含边框

有些人可能会注意到这样一个细节:窗口风格标志位 WS_CAPTION 被定义为 WS_BORDER 和 WS_DLGFRAME 的并集,如下图所示:

>> 请移步至 topomel.com 以查看图片  <<

因为 WS_CAPTION 标志包含了 WS_BORDER 标志,所以,当你获取标题栏相关的信息的时候,它实际上包含了边框。

有时人们不太明白这一点,一遍又一遍地问我这个问题,我不得不继续尝试以不同的方式解释这里面的原理,直到有一天有一个人问了这样一个问题:

“我注意到,如果我设置窗口为 WS_CAPTION 样式,我会得到一个带有标题栏和边框的窗口。但是,我不想要边框,应该如何做呢?我尝试了各种窗口样式的组合,但没有一个能满足我的需求。”

“如果你看一下定义,WS_CAPTION 样式 包括了 WS_BORDER,所以你不能在没有边框的情况下设置窗口的标题栏。”

“但是,我看到其他控件没有边框。例如,对话框上的静态控件没有边框,因此显然可以删除边框。我该怎么做?”

“它们本身没有边框,但话又说回来,他们也没有标题栏,不是吗?标题栏是包含边框这个元素的。”

“但我想要一个有标题且没有边框的窗口。我需要使用哪些窗口样式才能获得它?我必须以其他方式实现它吗?”

“标题栏意味着有边框。换句话说就是: 没有边框意味着没有标题栏。如果你不喜欢这样,就得研究罗素和怀特黑德的数理逻辑了。”

当然,你可以选择完全不使用系统的样式系统,而绘制自定义的标题栏。你得到的不是一个真正的标题栏,尽管通过足够的工作,你可以让它看起来像一个。或者至少让它在功能上和现有版本的标题栏行为一致,但是这可能在将来版本的 Windows 系统上不再如预期那般工作,因为 Windows 可能会修改内部的实现细节。

总结

对于非客户区的呈现,我还是建议使用系统默认的实现,客户区才是你发挥才华的地方。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《If you ask for a window caption, you also get a border》

小细节:窗口的标题栏实际上还包含边框_第1张图片

 

你可能感兴趣的:(OldNewThing,系统设计,软件开发,windows)