当前位置:C++技术网 > 精选软件 > Windows零基础入门:3.7 窗口类风格之窗口类额外内存和窗口额外内存

Windows零基础入门:3.7 窗口类风格之窗口类额外内存和窗口额外内存

更新时间:2015-10-12 13:45:05浏览次数:1+次

    本节课就对此做一个概念上的学习和理解,不过同样很重要。如果不理解,你就没法使用,即使告诉你代码,你也看不懂。有了本节课的背景,在使用代码时,将会理解的更加深入。本节课介绍了窗口类额外内存和窗口额外内存的基础背景知识,详细分析了一下,促进理解。具体的使用,将在修改窗口类中讲述。

    额外的东西并不是多余哦,有时候用处特别大,来了解一下吧。

Windows零基础入门:3.7 窗口类风格之窗口类额外内存和窗口额外内存

    窗口类成员cbClsExtra表示的是窗口类的额外内存大小,以字节为单位。也就是说,这个成员用来指定这个窗口类需要额外为窗口类分配多少内存空间。cbClsExtra的cb表示的是count of byte,即字节数。Cls表示的是Class,即窗口类的意思。Extra英文单词是额外的意思,表示需要系统分配的额外的内存空间。
    窗口类注册的时候,系统会为这个窗口类分配一个窗口类结构体大小的存储空间,用于记录这个窗口类的信息。在创建窗口时可以查询。注册窗口类的信息是需要内存去存储的哦,这个在前面的章节讲过了。
    而有时候需要一个额外的内存空间,给这个窗口类创建的所有窗口共享使用。一般情况下,都是不需要的。但是如果想对一个窗口类创建的窗口计数,如何实现?你可能会想到全局变量。但是有时候全局变量似乎不妥。如果是不在同一个进程的多个窗口呢,如何用全局变量?是不是要传参呢?跨进程传参就涉及到进程间通信了。如此一来,就变得复杂了。
    而窗口类在一个窗口类创建的所有窗口间提供了一个通信机制,或者叫做共享式通信,这样是通过内存共享的形式来实现的。或者你还不清楚进程间通信的概念,但是窗口类的额外内存,确实提供了这个可能。
    窗口类有三种,系统窗口类、应用全局类和应用局部类。要说窗口类实现的跨进程通信,那么也就是前面两种了。因为应用局部类,是一个进程模块内部的,所以谈不上跨进程。但是应用全局的可以让多一个子进程等实现共享通信。不过具体的我没有暂时试验过,理论上是可行的。这里只是大概讲讲窗口类额外内存的用途。纯粹从理论上的解释,至于可以实现什么功能,你来定了。技术的本质就是共享一块内存,所有共享使用的参与者都是由这个窗口类创建的窗口,其他窗口不能使用。而多个共享一个资源,就可能引起冲突,多个线程的窗口一起来使用就有同时使用的可能,所以,在使用这个资源前就要相互排斥使用,计算机术语叫做互斥使用。我用了你就不能用,等我用完了你才可以用,这就是互斥的意思。
    只不过,这些用途,我们一般情况下用不着,技术深入了,就会用得上。这是Windows核心编程的范围了。我们初级入门就不探讨这些。只是作为一个了解,要知道这个东西并不是没用,只是暂时用不上。所以我们一般都是将cbClsExtra的值设置为0,表示不需要额外的空间。
    另外一个成员就是cbWndExtra,英文全称为count of Window's Extra memory。就是窗口的额外内存,以字节为单位。和cbClsExtra差不多的意思。不过cbWndExtra指定的额外内存是与具体的某个窗口相关,是这个窗口独有的。这两个的关系,和之前讲过的CS_CLASSDC和CS_OWNDC差不多的意思。
    cbWndExtra指定的内存是与单个窗口相关,只有这个窗口可以使用,其他窗口无法使用。这里可以存储这个窗口相关的全局的数据。比如一个窗口中的多个操作,比如鼠标左键单击+1,右键单击+3,都加到一个值,实现累加。当然你可以使用静态的变量存储或者全局变量存储,当然也可以使用窗口额外的内存来存储咯。不过全局变量也是一种额外的内存,被你使用了,只不过不是与你的窗口相关而已,多个窗口都可以使用。
    一般情况你也用不着这个成员指定的额外的内存。所以设置为0表示不需要额外分配内存。
    对于cbClsExtra和cbWndExtra,他们的使用方法,比较麻烦,需要牵扯到修改窗口类的问题,所以就放在修改窗口类里讲解具体的使用。