当前位置:C++技术网 > 资讯 > 窗口类结构体成员详细说明

窗口类结构体成员详细说明

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

    一个类结构中至少要三个成员赋值:类名、窗口过程地址和实例句柄。必须初始化所有未使用的成员为NULL或者0。
    WNDCLASSEX结构包含窗口类的信息。WNDCLASSEX结构类似于WNDCLASS结构。有两种差异。WNDCLASSEX包括了cbSize 成员,它指定的结构体大小;hIconSm 成员,是一个与窗口类相关的小图标的句柄。所以,尽量使用WNDCLASSEX作为类结构体。

typedef struct {
  UINT      cbSize;//结构体大小,扩展的
  UINT      style;//窗口类风格
  WNDPROC   lpfnWndProc;//窗口过程函数指针
  int       cbClsExtra;//类额外字节
  int       cbWndExtra;//窗口额外字节
  HINSTANCE hInstance;//程序实例
  HICON     hIcon;//窗口图标
  HCURSOR   hCursor;//光标
  HBRUSH    hbrBackground;//背景
  LPCTSTR   lpszMenuName;//菜单或者子窗口
  LPCTSTR   lpszClassName;//类名
  HICON     hIconSm;//窗口小图标,扩展的
} WNDCLASSEX, *PWNDCLASSEX;
     这个结构体就是之前提到的窗口类的最原始的模板了。现在就一睹真容啦。这个结构体包含了窗口风格需要的所有东西。当然,有人还会疑惑,就是,注册窗口类时传了一大堆的参数,最后创建窗口时还有传入窗口大小位置等信息,为什么不都放在这里呢?其实这个很简单就理解了。这是一个类型模板,具体的窗口还要基于这个结构体来衍生类型的,既然是类型,当然不能含有决定窗口具体的信息的,只能决定窗口的风格,就是窗口的样式。而创建窗口时大小和位置则是具体的窗口的状态,不算是样式。怎么说都是不能将所有信息都放在窗口类的。
    下面介绍每个成员的作用:
cbSize成员:
    这是一个无符号整型成员,用于记录结构体的大小。以字节为单位。用这个成员可以方便获取结构体大小,同时,在扩展函数(函数名后有Ex,个人叫法)中使用,在扩展函数如GetClassInfoEx使用前,先设置好这个值,使用sizeof(WNDCLASSEX)。
Style成员:
    指定基于此类创建的窗口的窗口类风格。此风格与窗口创建时指定的窗口风格不是一个东西,初学者很容易分不清楚。类作为窗口的一个模板来创建窗口,是一个通用的样本,因此,此成员指定的风格也会作用于创建的窗口,只不过,这个风格属于基于这个窗口类所创建的所有窗口所共有的,因此也算是通用的风格。而创建窗口时指定的窗口风格,则是与那一个具体的窗口相关,只影响创建的那个窗口,因此是具体的而不是通用的。当然,窗口的最终的风格是窗口类风格加上窗口风格。
窗口类风格是一个无符号整型,因此是数值。但是为了方便,则提供了预先定义好的宏,就很方便记忆和区分。如果直接给数值也是可以的。

CS_BYTEALIGNCLIENT 在一个字节边界上以X轴方向排列窗口客户区。这种风格影响窗口宽度和水平放置。 CS_BYTEALIGNWINDOW 在一个字节边界上以X轴方向排列窗口。这种风格影响窗口宽度和水平放置。

CS_CLASSDC 分配一个基于这个类创建的所有窗口共享的设备描述表,也就是常说的DC。因为窗口类是特定进程的,所以支持多线程程序创建基于同一个类的窗口。线程也可以同时使用这个DC。但是每次系统只允许一个线程完成绘制操作。

CS_DBLCLKS 当光标在基于这个类的窗口中时用户双击了窗口则发送一个双击消息给窗口过程。

CS_DROPSHADOW XP:允许下拉阴影影响窗口。可以通过SPI_SETDROPSHADOW关闭活打开这个效果。 主要用于小而短暂存活的窗口,比如菜单使自己突出Z轴位置,显示在最上层。

CS_GLOBALCLASS 指定这个窗口类为应用全局类。

CS_HREDRAW 如果移动或者改变大小时改变了客户区的宽度,则水平重画整个窗口。

CS_NOCLOSE 使窗口的关闭按钮失效。

CS_OWNDC 分配一个唯一的DC给此类的每个窗口使用。

CS_PARENTDC 把子窗口的一个剪切矩形区域设置到父窗口上,使子窗口可以在父窗口上绘图。 拥有此风格的窗口从系统缓存的DC中接受一个常规的DC。但是并不会把父窗口的DC或者DC设置给子窗口。指定此风格可以加强应用的表现能力。

CS_SAVEBITS 保存此类窗口被遮盖的的屏幕映像的一部分成为一张位图。当窗口被移走,系统将使用这个位图来恢复屏幕映像,包括被遮盖的其他窗口。因此,如果内存中的这个位图没有被丢弃,或者其他屏幕动作没有使这个存储的映像无效时,系统不发送WM_PAINT消息给被遮盖的窗口。 此风格对于小窗口(菜单或者对话框)很有用。这些小窗口只是简单的显示,移除后就被其他窗口替代。 此风格增加了显示时间,因为系统第一次必须分配存储位图的内存空间。

CS_VREDRAW 如果移动或者改变大小时改变了客户区的高度,则垂直重画整个窗口。

lpfnWndProc成员
    此成员是窗口过程函数地址。每个窗口类只有一个窗口过程。因此,同一个类创建的多个窗口都是共用这个窗口过程。不过,窗口过程可以在窗口创建后设置,不过还是只有一个窗口过程起作用。直接用函数名给此成员赋值。赋值后要定义此窗口过程。

LRESULT CALLBACK WindowProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
     这是标准的窗口过程声明。LRESULT 是返回值类型,其实就是一个long型,CALLBACK 就是一个函数调用约定,在此不多说。函数名WindowProc可以自行替换,只要在窗口类结构体中的函数名和这个名字一致即可。操作系统调用此函数时将参数传进来,供函数使用。通常我们使用的函数都是去调用系统的API函数,或者间接调用系统的API函数,间接就是调用封装了API函数的函数。或者调用自己写的函数等等,这是我们通常的思维。现在是提供函数给系统来调用,与平常调用系统API函数刚好相反,因此我们叫这种函数为回调函数。CALLBACK 就是回调函数的标志。参数中hwnd是指示发生消息的窗口的句柄,句柄就是一个窗口的标志,它不是指针,只是一个引用。可以通过这个句柄引用到窗口,从而对窗口进行操作。uMsg参数是携带消息标志,指示是什么消息。如WM_SIZE表示是窗口调整大小时发生的消息。wParam和lParam 是两个附加参数,根据消息的不同,携带的信息也不同。