WNDCLASS(WNDCLASSEX)结构介绍

WNDCLASS 结构包含了窗口类的属性信息。 
这个结构在使用RegisterClassEx函数注册窗口类时被WNDCLASSEX结构所取代。如果不需为窗口类设置小图标时,仍然可以使用WNDCLASS和RegisterClass。 

 语法: 

typedef struct { 
    UINT                                                style; 
    WNDPROC                                     lpfnWndProc; 
    int                                                    cbClsExtra; 
    int                                                    cbWndExtra; 
    HINSTANCE                                    hInstance; 
    HICON                                             hIcon; 
    HCURSOR                                       hCursor; 
    HBRUSH                                          hbrBackground; 
    LPCTSTR                                         lpszMenuName; 
    LPCTSTR                                         lpszClassName; 
} WNDCLASS, *pWNDCLASS; 

Windows系统自己定义了一个结构类型,WNDCLASS,一个指针类型*pWNDCLASS//注意p是小写字符;

程序中要需要这个类型的变量就可以声明:WNDCLASS aa;  pWNDCLASS  bb;

此时aa就是WNDCLASS类型的变量,bb就是指向WNDCLASS类型的指针变量;

结构成员: 

style                    描述类风格。该成员可以是“Class Styles”的任意组合。 
CS_VREDRAW    当窗口水平方向的宽度变化时重绘整个窗口

CS_HREDRAW   当窗口水平方向的宽度变化时重绘整个窗口

CS_OWNDC         独占设备描述表

CS_SAVEBITS    保存窗口覆盖区

CS_DBCLKS      允许两次连续按动

CS_BYTEALLGNCLIENT    鼠标用户区域按字节对齐显示

CS_BYTEALLGNWINDOW   鼠标用户窗口按字节对齐显示

CS_NOCLOSE   系统菜单中没有CLOSE菜单项

lpfnWndProc 
    指向窗口过程的指针。必须使用CallWindowProc函数调用窗口过程。 
cbClsExtra 
    表示窗口类结构之后分配的额外的字节数。系统将该值初始化为0. 
cbWndExtra 
    表示窗口实例之后分配的额外的字节数。系统将该值初始化为0.如果使用资源文件里的CLASS指令创建对话框,并用WNDCLASS注册该对话框时,cbWndExtra必须设置成DLGWNDOWEXTRA。 
hInstance 
    包含该类实例的句柄,该实例包含了窗口过程。 
hIcon 
    类图标的句柄。必须为一个图标资源的句柄。如果hIcon为NULL,系统将提供默认图标。 
hCursor 
    鼠标指针的句柄。必须为一个指针资源的句柄。如果hCursor为NULL,应用程序必须在指针移入应用程序窗口时显式设置指针类型。 
hbrBackground 
    背景画刷的句柄。该成员或者是用于绘制背景的物理画刷的句柄,或者是一个颜色值。颜色值必须为如下标准系统颜色值(值1必须加到选定颜色中)。如果颜色值给定后,必须将该值转换成如下HBRUSH类型。 

    COLOR_ACTIVEBORDER 
    COLOR_ACTIVECAPTION 
    COLOR_APPWORKSPACE 
    COLOR_BACKGROUND 
    COLOR_BTNFACE 
    COLOR_BTNSHADOW 
    COLOR_BTNTEXT 
    COLOR_CAPTIONTEXT 
    COLOR_GRAYTEXT 
    COLOR_HIGHLIGHT 
    COLOR_HIGHLIGHTTEXT 
    COLOR_INACTIVEBORDER 
    COLOR_INACTIVECAPTION 
    COLOR_MENU 
    COLOR_MENUTEXT 
    COLOR_SCROLLBAR 
    COLOR_WINDOW 
    COLOR_WINDOWFRAME 
    COLOR_WINDOWTEXT 

 当调用UnregisterClass时,系统自动删除背景画刷。应用程序不应删除这些画刷。 
 当hbrBackground为NULL时,应用程序必须在绘制客户区域时绘制它自己的背景。为了确定背景是否一定要绘制,应用程序或者可以处理 WM_ERASEBKGND消息,或者测试PAINTSTRUCT的fErase成员。PAINTSTRUCT是由BeginPaint函数填充的。 

lpszMenuName 
    指向\0结束的字符串,该字符串描述菜单的资源名,如同在资源文件里显示的名字一样。若使用一个整数标识菜单,可以使用MAKEINTRESOURCE宏。如果lpszMenuName为NULL,那么该窗口类的窗口将没有默认菜单。 
lpszClassName 
    指 向\0结束的字符串,或者是一个原型(atom)。若该参数是一个原型,它必须是一个有先前调用RegisterClass或者 RegisterClassEx函数产生的类原型。类原型必须作为lpszClassName的低字,高字必须为0.若lpszClassName是一个 字符串,它描述了窗口类名。这个类名可以是任何预定义的控件类名或者是程序员由RegisterClass或者RegisterClassEx注册的名字。 

WNDCLASSEX 属于另外一个窗口结构体,他比WNDCLASS多了一个成员:UINT cbSize(WNDCLASSEX 结构体的大小) 平时使用WNDCLASSEX比较多.

WNDCLASSEX结构体原型如下:

结构信息

   typedef struct tagWNDCLASSEXA {
    UINT        cbSize;           //WNDCLASSEXA 结构体的大小(sizeof(WNDCLASSEX))
    UINT        style;                                                                 //窗口类的样式
    WNDPROC     lpfnWndProc;                                           //窗口处理函数的指针
    int         cbClsExtra;                                    //为窗口类的额外信息做记录,初始化为0。
    int         cbWndExtra;                                 //记录窗口实例的额外信息,系统初始为0
    HINSTANCE   hInstance;                           //本模块的实例句柄
    HICON       hIcon;                                       //窗口类的图标,为图标资源句柄
    HCURSOR     hCursor;                              //窗口类的鼠标样式,为鼠标样式资源的句柄
    HBRUSH      hbrBackground;                    //窗口类的背景刷,为背景刷句柄
    LPCSTR      lpszMenuName;                    //指向菜单的指针
    LPCSTR      lpszClassName;                  //指向类名称的指针
   
    HICON       hIconSm;                             //小图标的句柄,在任务栏显示的图标
} WNDCLASSEXA, *PWNDCLASSEXA, NEAR *NPWNDCLASSEXA, FAR *LPWNDCLASSEXA;

结构体选项详解:

1. cbSize:  WNDCLASSEX 的大小。在调用GetClassInfoEx前必须要先设置它值。我们可以用sizeof(WNDCLASSEX)来获得准确的值。

2:style:表示窗口的类型,取值是系统定义好的一组宏可以用按位或"|"组合使用

例如:aa.style|=CS_VREDRAW|CS_NOCLOSE;注意红色的“或”符号字符要大写;

#define CS_VREDRAW         0x0001      //若移动或改变窗口高度,则刷新整个窗口。
#define CS_HREDRAW         0x0002      //若移动或改变窗口宽度,则刷新整个窗口。
#define CS_DBLCLKS         0x0008      //当用户双击鼠标时向窗口程序发送一个双击的信息,同时光标位于该类的窗口里
#define CS_OWNDC           0x0020      //为同一个窗口类中的每个窗口创建一个唯一的设备上下文
#define CS_CLASSDC         0x0040      //分配一个设备环境并被类中的所有窗体共享。它是可以适用于一个应用程序的若干线程创建的一个相同类的窗体。当多个线程试图同时使用相同的设备环境时,系统只允许 一个线程成功地进行绘图操作
#define CS_PARENTDC        0x0080      //设置子窗口中剪下的矩形区域到父窗口中,以使子窗口可以在父窗口上绘图。指定该风格可以提高应用程序的性能
#define CS_NOCLOSE         0x0200      //窗口中的“关闭”按钮不可见
#define CS_SAVEBITS        0x0800      //把被窗口遮掩的屏幕图像作为位图保存起来。当该窗口被移动时,Windows操作系统使用被保存的位图来重建屏幕图像
#define CS_BYTEALIGNCLIENT 0x1000      //窗口的客户区域以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍
#define CS_BYTEALIGNWINDOW 0x2000      //窗口以“字符边界”对齐,当系统调整窗口的水平位置时,客户区域的左边坐标是8的整数倍
#define CS_GLOBALCLASS     0x4000      //指定此窗体类是一个应用程序全局类。应用程序全局类是由一个在进程中对所有模块有效的exe或dll注册的窗体类
#define CS_IME             0x00010000  //没找到解释
#define CS_DROPSHADOW      0x00020000  //窗口产生阴影效果

3.   lpfnWndProc:  指向窗口处理函数(回调函数)。处理窗口事件,像单击鼠标会怎样,右击鼠标会怎样,都是由此函数控制的。

4.   cbClsExtra:  为窗口类的额外信息做记录,初始化为0。
5.   cbWndExtra: 记录窗口实例的额外信息,系统初始为0.如果程序使用WNDCLASSEX注册一个从资源文件里创建的对话框,则此参数必须设置为DLGWINDOWEXTRA
6.   hInstance:本模块的事例句柄。
7.   hIcon  窗口类的图标,为资源句柄,如果设置为NULL,系统将为窗口提供一个默认的图标。
8.   hCursor 窗口类的鼠标样式,为鼠标样式资源的句柄,如果设置为NULL,系统提供一个默认的鼠标样式。

9. hbrBackground 窗口类的背景刷,为背景刷句柄,也可以为系统颜色值,如果颜色值已给出,则必须转化为以下的HBRUSH的值

#define COLOR_SCROLLBAR         0
#define COLOR_BACKGROUND        1
#define COLOR_ACTIVECAPTION     2
#define COLOR_INACTIVECAPTION   3
#define COLOR_MENU              4
#define COLOR_WINDOW            5
#define COLOR_WINDOWFRAME       6
#define COLOR_MENUTEXT          7
#define COLOR_WINDOWTEXT        8
#define COLOR_CAPTIONTEXT       9
#define COLOR_ACTIVEBORDER      10
#define COLOR_INACTIVEBORDER    11
#define COLOR_APPWORKSPACE      12
#define COLOR_HIGHLIGHT         13
#define COLOR_HIGHLIGHTTEXT     14
#define COLOR_BTNFACE           15
#define COLOR_BTNSHADOW         16
#define COLOR_GRAYTEXT          17
#define COLOR_BTNTEXT           18
#define COLOR_INACTIVECAPTIONTEXT 19
#define COLOR_BTNHIGHLIGHT      20
 
#if(WINVER >= 0x0400)
#define COLOR_3DDKSHADOW        21
#define COLOR_3DLIGHT           22
#define COLOR_INFOTEXT          23
#define COLOR_INFOBK            24
#endif /* WINVER >= 0x0400 */
 
#if(WINVER >= 0x0500)
#define COLOR_HOTLIGHT          26
#define COLOR_GRADIENTACTIVECAPTION 27
#define COLOR_GRADIENTINACTIVECAPTION 28
#if(WINVER >= 0x0501)
#define COLOR_MENUHILIGHT       29
#define COLOR_MENUBAR           30
#endif /* WINVER >= 0x0501 */
#endif /* WINVER >= 0x0500 */
 
#if(WINVER >= 0x0400)
#define COLOR_DESKTOP           COLOR_BACKGROUND
#define COLOR_3DFACE            COLOR_BTNFACE
#define COLOR_3DSHADOW          COLOR_BTNSHADOW
#define COLOR_3DHIGHLIGHT       COLOR_BTNHIGHLIGHT
#define COLOR_3DHILIGHT         COLOR_BTNHIGHLIGHT
#define COLOR_BTNHILIGHT        COLOR_BTNHIGHLIGHT
#endif /* WINVER >= 0x0400 */

10. lpszMenuName  指向一个以NULL结尾的字符串,同目录资源的名字一样。如果使用整型id表示菜单,可以用MAKEINTRESOURCE定义一个宏。如果它的值为NULL,那么该类创建的窗口将都没有默认的菜单。
11. lpszClassName  指向窗口类的指针,LPSTR类型。
12. hIconSm  小图标的句柄,在任务栏显示的图标,可以和上面的那个一样。
 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值