当前位置:C++技术网 > 资讯 > 如何注册窗口类和系统如何分配窗口类

如何注册窗口类和系统如何分配窗口类

更新时间:2015-06-25 17:50:17浏览次数:1+次

    之前了解了窗口类型、窗口类类型、窗口类和C++类的区别,那这些窗口类如何使用呢?当然是要向系统注册,系统分配后才可以使用。所谓的注册就是将你定义的窗口类记录到系统中,然后程序的其他地方就可以使用了,如果共享,那么其他程序也可以使用。这是应用全局类的用法。如果不是,那么一般都是程序自己使用,其他程序没法使用。
    下面就介绍注册窗口类和系统如何分配窗口类的基础知识。

    注册窗口类
    注册全局类时style使用CS_GLOBALCLASS风格。
    如果注册窗口类时使用ASNI版本,则应用需要系统传递ASNI版本的文本参数。Unicode版本,则需要Unicode版本的参数。 IsWindowUnicode函数可以查询窗口的字符版本类型。使用RegisterClass函数来注册窗口类。谁注册窗口类谁就是窗口类的拥有者。系统是通过传给注册函数的窗口类结构体的实例句柄来决定窗口类的拥有者。如果是dll,实例句柄必须是dll的句柄。进程必须销毁所有的那些使用了未加载的dll中的窗口类的窗口,并且调用UnregisterClass 。

    系统如何分配窗口类
    系统为每种类型的窗口类保留了一个结构列表。当程序调用 CreateWindow 或者 CreateWindowEx 函数时指定窗口类名称,系统用以下的过程分配类空间。
    1.通过实例句柄或模块句柄匹配,用指定的类名搜索程序局部窗口类列表。(几个模块在相同的进程中可以使用相同的名字去注册局部类,作用域为模块,互不干扰)
    2.如果名字不在局部类列表中,搜索应用全局窗口类。一个进程全局的,对于各模块都可见的。
    3.如果不在应用全局类中,搜索系统窗口类。系统类的则是操作系统的范围的,各个进程都可见。在《Window窗口类和C++类的区别和联系分析》中说的是系统窗口类。
    所有的窗口创建时都使用这个过程,包括系统创建窗口的应用行为,比如对话框。可以重写系统类而不影响其他应用。即应用可以用系统类相同的名字注册应用局部类。这个只是代替系统类在应用的上文环境,不阻止其他应用使用系统类。因为搜索的顺序是局部优先,你注册的就是应用程序局部的,自然系统就先用你注册的局部的类来创建窗口了,这样只影响自己,而不会更改系统的窗口类,因为不会影响其他的程序创建窗口。
    稍后再详细讲解窗口类结构体成员,为了提高质量,不急着一次性都写出来。请理解。如果对本文还有不清楚的,请提出来。