当前位置:C++技术网 > 精选软件 > Windows零基础入门:2.25 类风格CS_BYTEALIGNCLIENT

Windows零基础入门:2.25 类风格CS_BYTEALIGNCLIENT

更新时间:2015-09-22 22:19:59浏览次数:1+次

    上午研究了CS_BYTEALIGNCLIENT和CS_BYTEALIGNWINDOW,然后想深入研究一点,然后可以让你了解的更加清晰明了。然而,上午那一站,让我郁闷了一天。是的,我真的收到打击了。就让我打了一天的酱油。
    因为微软的目的,就是要操作系统中屏蔽底层的各种具体细节,以让程序员可以以更加通用的编程方式达到处理各种设备的目的。今天,我想突破这个,然后去结合底层一点的技术知识来突破屏蔽的障碍。这种屏蔽技术对于开发确实很有好处,让程序员不必关注底层的细节了。然后,对于学习来讲,我们就看不到底层如何实现,也不知道底层的很多技术,所以很多时候也对上层开发造成影响。至少在理解上就是一个很大的问题。不了解底层的一些知识背景,就很难理解上层的一些技术。
    本节所提到的两个窗口类风格CS_BYTEALIGNCLIENT和CS_BYTEALIGNWINDOW,如果没有底层技术背景,根本不知道它在说什么。虽然MSDN做了解释,但是你不知道技术背景,只看得懂文字,而不动背后的意义。这才是我想去深入研究,然后解释给大家听。
    不过,这些方面的资料太少了,研究的还是云里雾里,以至于郁闷死了。大家也不做深入全面的研究,网上很多资料都是翻译MSDN中的一段窗口类风格的解释。我想问,这个有意义吗,还发布到网上。对于什么都不知道的人来说,或许,有点用吧。不过知道点的,这个给真正查资料造成了垃圾信息。我也是醉了。
    不管怎么样,我还是根据我的理解,抽象一点解释这两个风格的作用吧。或许在更新图形这一块的时候,可能寻找到突破,到时再专题解释吧。对于入门,我们不应该卡在这里哦。这里也是给入门者一个概要性的了解而已。
    CS_BYTEALIGNCLIENT为Byte Align Client,中文意思就是字节对齐客户区,也就是说,设置了这个窗口类风格的窗口类,创建的窗口将会按照字节对齐窗口的客户区。这个是在水平方向的,也就是x坐标。这个风格影响窗口的宽度和水平的起始位置,其实就是x坐标值。
    CS_BYTEALIGNWINDOW为Byte Align Window,中文意思就是字节对齐窗口,即设置了这个窗口类风格的窗口类创建的窗口,系统会按字节对齐窗口的水平其实位置和窗口的宽度。
    以上两种风格差不多,一个说的是窗口客户区,一个说的是整个窗口,效果差不多。
    那么问题来了,什么是字节对齐?怎么会影响到窗口的起始水平坐标,即x坐标呢?
    我们这里也不纠结底层的东西了。就按照上层技术来理解。有字节对齐,也就有字节不对齐。我们都知道,一个字节有八位。将多个字节排列成一条线,实际上可以构成最小单元是位。就像一把普通的尺,有最小的刻度毫米,也有大一点的厘米。位就像毫米,字节就像厘米。这样展开后,就和尺子一样的排列。这样说,你应该脑子里有个很清楚的画面了吧。

   
    现在假设一种情况,让你去量一个线段,你一般肯定是用尺子的开头0刻度开始量,这样就非常好计算长度。现在,我们让尺子固定,让线段可以自由移动,然后线段移动到不是和0对齐,而是与其中一些毫米刻度对齐,这样让你再去看线段长度,那你肯定看看后面有没有对齐到厘米的。这样也可以反过来数。不过计算机可不能这样智能哦。而假如后面也没有对齐,本来是刚刚好的厘米数,错位后导致前后都不能对齐到厘米刻度,你就要先记下前面多余的毫米数,然后从下一个厘米数开始往后数,数到最后一个厘米刻度,然后再数多出的不足一厘米的毫米数,最后前后相加,得到一个新厘米数,如果超过一厘米,就进位为一厘米,不够就直接是总厘米数了。
    其实上面的处理,就可以对应上位和字节的关系。在计算机处理时,同样如此,如果不进行字节对齐,那么在处理数据时,要对位额外的处理,后面才方便。如果不处理,甚至会报错。毕竟这些硬件很笨的,或者说一些硬件工程师很懒,对于这些问题,就直接抛出一个硬件异常就完事。有些硬件厂商就做的比较好,会对这个非对齐做一些处理,比如先对齐,然后再处理。这样上层的开发者就不必纠结这么多事情了。但是,虽然底层处理这里这个字节对齐问题,让最后处理的数据都是字节对齐的,但是却损失了效率。
    那么这个在显示画面时,就涉及到这个问题。如果你的程序中不做好对齐处理,那么就会交给硬件处理,如果硬件处理起来,那么就导致效率损失,也就降低性能了。这也是微软为什么支持这两个窗口类风格的用意,设置了之后,系统在提交数据给硬件前,会按照字节对齐提交的数据,这样就提高了效率,让显示和绘图更流畅。
    那么以上就是字节对齐的意思了。那么字节对齐为什么会导致窗口水平位置改变以及窗口宽度会改变呢?前面谈了字节对齐的问题,如果你的窗口X轴坐标不是字节对齐的,那么系统就会对窗口的X坐标进行调整,调整到字节对齐,然后又要调整窗口最右边的X坐标,都调整对齐到字节。这样,就可能造成了窗口左边的X坐标变化,可能是往右缩,然后最右边往左缩,这样不仅窗口左边的起始X坐标变大了,同时整个窗口的宽度也变小了。当然如果都往外扩展,也就导致窗口变大。具体的实现是内部做的,我们就不多推测了。我们只要知道这个道理就行了,谈到这里我们就很清楚这个风格是什么意思了。
    而两个风格一个是对齐窗口最外边的边框的坐标,而客户区的则是对齐客户区的边缘的位置,对齐客户区边缘不保证窗口边缘,除非两个风格都设置。
    不过这两个风格表面上是看不出来的。所以,就不用代码验证了。我想这样解释了,总体上大家理解就好了。至于具体的图形方面,要深入的话,在图形相关章节来讲解,一步步来,就容易多了。