当前位置:C++技术网 > 精选软件 > windows窗口界面组成结构图解

windows窗口界面组成结构图解

更新时间:2015-12-19 00:27:23浏览次数:1+次

    在研究窗口的标题栏的高度时,意外的发现了一个问题,通过系统函数GetSystemMetrics得到的标题栏高度和自己计算得到的不一致。这也让我对窗口的标题栏的组成产生了疑惑。通过研究后,发现系统获取的标题栏高度比我计算得到的标题栏高度小。原因是我们理解的标题栏是包括窗口边框的,但是这是错误的,通过一个小实验可以知道。我用我计算出来高度来绘图,发现可以完全覆盖我们理解的“标题栏”,然而用系统API获取的高度来绘图,无法将标题栏完全覆盖住,刚好差一个边框的距离。
    经过研究,我才对窗口界面的组成更加了解了。实际上,我们将鼠标放在窗口的四边,都可以调整窗口的大小。这就是因为窗口边框的存在。自然上面的边框也是存在的。而边框的作用,就是为了调整窗口大小而存在的吧,这个是我的理解。
    所以,我们看到的标题栏,将上边框都看在一起,误将上边框当和标题栏一起当做了标题栏。实际上,标题栏是上边框和菜单栏之间的一块区域。

    我们看下面的图就一目了然了:

    windows窗口组成图

    我们可以看到,窗口是由一个外边框包围的,在边框内部才是标题栏、客户区的地盘。而菜单栏、工具栏以及状态栏是占用客户区的位置,也就是在客户区的范围内抢不部分地盘。
    根据Win32提供获取边框的方式来看,只给出了获取边框宽度和高度,据我理解,也就是说,边框的左右两个的宽度是相等的,边框的上下两个的高度也是相等的。然而上下和左右的边框可能不相等。至于具体的规则,还有待研究。不过,一般来讲,我知道左右两个相等,上下两个相等就可以了。
    在《GetWindowDC无法在标题栏输出文字原因分析和酷炫窗口代码实现》一文中,我获取标题栏的高度是通过获取客户区的宽度和窗口的整个的宽度,用窗口整个的宽度减去客户区的宽度再除以2,得到左右边框的宽度。然后假设左右边框和下边框粗细一样,所以就用窗口的高度减去客户区的高度,就得到了上边框和标题栏的总高度。当时我以为得到的就是标题栏的高度。然后从窗口顶部到底部就绘制了一遍。结果工作正常。实际上这个计算过程的假设不太严谨。因为通常情况下,左右边框和上下边框是一样粗细的,但不保证一定是。这里粗略计算,一般情况下,四个边框确实一样。
    我当时错误的将最后得到的高度当做是标题栏的高度,然后用GetSystemMetrics得到的高度比我小。所以才发觉了上边框的存在。这也是今天总结的原因。这也就解释了为什么GetSystemMetrics获取的标题栏比我计算的小,就是因为我将上边框当做是标题栏的一部分了,实际上是错误的。
    在没有特别设置窗口样式时,一般四边边框是相同的粗细。所以,即使是你自己计算,了解这个模型后,你计算得到的标题栏高度,也是会和GetSystemMetrics得到标题栏高度是一样的。