系统类(System Classes)
系统类是由系统注册的窗口类。许多系统类对所有的进程都是可用的,然而有些系统类只能由系统在内部使用。因为系统注册了这些类,进程不能撤销它们。
每个Win32应用程序接收它自己对系统类的拷贝。
下面描述的是所有进程可用的的系统类:
Button ------------------->The class for a button.
ComboBox ----------------->The class for a combo box.
Edit --------------------->The class for an edit control.
ListBox ------------------>The class for a list box.
MDIClient ---------------->The class for an MDI client window.
ScrollBar ---------------->The class for a scroll bar.
Static ------------------->The class for a static control.
下面描述的是只能被系统使用的系统类:
ComboLBox ---------------->The class for the list box contained in a combo box.
DDEMLEvent --------------->Windows NT/2000: The class for DDEML events.
Message ------------------>Windows 2000: The class for a message-only window.
#32768 ------------------->The class for a menu.
#32769 ------------------->The class for the desktop window.
#32770 ------------------->The class for a dialog box.
#32771 ------------------->The class for the task switch window.
#32772 ------------------->Windows NT/2000: The class for icon titles
应用程序全局类(Application Global Classes)
应用程序全局类是由可执行文件或动态链接库注册的窗口类,这个类对于进程中所有模块都是可用的。例如,你的动态链接库(.dll)可以调用RegisterClassEx函数来注册可定制控件的窗口类作为一个应用程序全局类,然后一个载入这个动态链接库的进程可以创建可定制控件的多个实例。
一个进程一旦开始,系统会在调用进程入口函数之前,载入指定的动态链接库到新开始的进程中。这个动态链接库必须在它的初始化过程中注册这个类,必须指定CS_GLOBALCLASS风格。
可以利用UnregisterClass函数移除应用程序全局类,并释放它的存储空间。
应用程序局部类(Application Local Class)
应用程序局部类是任意一个窗口类,这些窗口类是由可执行文件或动态链接库为了专用而注册的。尽管你可以注册任意多的局部类,但典型的是只注册一个。这唯一的窗口类支持应用程序主窗口的窗口过程。
当注册局部类的模块关闭后,系统会撤销局部类。应用程序也可以利用UnregisterClass函数移除局部类,并释放局部类的存储空间。
系统如何定位窗口类
系统为上面这三种类型的窗口类的每一类维护一个结构列表。当程序调用CreateWindow或CreateWindowEx函数创建一个指定类的窗口时,系统会用以下的的过程定位类:
1.在应用程序局部类的列表中搜索一个类,这个类有指定的名字,并且类的实例句柄匹配模块的实例句柄。(有些模块可以用相同的名字在同一进程中注册局部类)
2.如果类的名字不在应用程序局部类列表中,搜索应用程序全局类列表。
3.如果类的名字不在应用程序全局类列表中,搜索系统类列表。
所有被应用程序创建的窗口都经过这个过程,包括被系统代表应用程序创建的窗口,例如,对话框。覆盖系统类而不影响其它应用程序是可能的。应用程序可以注册一个和系统类拥有相同名字的应用程局部类。在应用程序的上下文中替换系统类,不会影响其它应用程序使用系统类。
注册窗口类
一个窗口类定义了一个窗口的属性,例如,窗口的风格,图标,光标,菜单,和窗口过程。注册一个窗口类的第一步是用窗口类信息填充一个WNDCLASSEX数据结构。接下来把这个结构传递给RegisterClassEx函数。
在WNDCLASSEX结构中,指定其风格成员类型为CS_GLOBALCLASS,可以注册一个应用程序全局类。当注册一个应用程序局部类时,不能指定CS_GLOBALCLASS风格。
如果你用ANSI版本的RegisterClassEx,RegisterClassExA函数注册了窗口类,应用程序需要系统通过ANSI字符集把消息的文字参数传递给窗口类创建的窗口。如果你是用Unicode版本的RegisterClassEx,RegisterClassExA函数,应用程序需要系统通过Unicode字符集把消息的文字参数传递给窗口类创建的窗口。IsWindowUnicode函数可以使应用程序查询每个窗口的性质。
注册类的可执行文件或.dll文件是类的所有者。当类被注册时,系统通过把WNDCLASSEX结构的hInstance成员传递给RegisterClassEx函数来决定类的所有权。对于.dll文件,hInstance成员必须是指向.dll的句柄。