C++Windows编程之注册窗口类

我们用Visual Studio创建一个win32项目上会自动生成一个注册窗口类。如下:
//
//  函数: MyRegisterClass()
//
//  目的: 注册窗口类。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;

	wcex.cbSize = sizeof(WNDCLASSEX);

	wcex.style			= CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc	= WndProc;
	wcex.cbClsExtra		= 0;
	wcex.cbWndExtra		= 0;
	wcex.hInstance		= hInstance;
	wcex.hIcon			= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT5));
	wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
	wcex.lpszMenuName	= MAKEINTRESOURCE(IDC_WIN32PROJECT5);
	wcex.lpszClassName	= szWindowClass;
	wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

	return RegisterClassEx(&wcex);
}
这些都是是什么意思呢?
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存储表示该结构大小的字节数,通常以sizeof(WNDCLASSEX)的形式对该域进行设置。
style存储表示窗口类风格的整数,它决定了该窗口的外观和内在特征。Windows以预先给了一些标准的外观,供用户选择。如下:

当窗口的垂直位置或窗口的高度值发生变化时,是窗口能够重新绘制其用户区域的内容

Constant/value

Description

CS_BYTEALIGNCLIENT

0x1000

<wbr></wbr>

在X轴方向上以某边界值对齐窗口的用户区域,该属性影响窗口的宽度和显示位置的水平坐标。

CS_BYTEALIGNWINDOW

0x2000

<wbr></wbr>

在X轴方向上以某个边界值对齐窗口,该属性影响窗口的宽度和显示位置的水平坐标。

CS_CLASSDC

0x0040

为窗口分配一个该类的所有窗口都共享的设备描述表。由于窗口类是进程指定的,一个应用中的多个线程就可能创建属于同一个窗口了的窗口,这些线程也就可以尝试同时使用设备描述表,但此时,系统只允许一个线程成功完成其图形输出。

CS_DBLCLKS

0x0008

用户在属于该窗口类的窗口中双击鼠标时将鼠标双击消息发送到窗口处理函数。打开该函数才支持鼠标双击功能。

CS_DROPSHADOW

0x00020000

Windows XP 中允许窗口的拖拉阴影效果。通过SPI_SETDROPSHADOW打开或关闭该功能。

CS_GLOBALCLASS

0x4000

将窗口类指定为一个应用全局类,所谓的应用全局类就是在exe或dll中定义的窗口类,加载该exe或dll的进程都可以创建属于该窗口类的窗口。

CS_HREDRAW

0x0002

当窗口的水平位置或窗口的宽度值发生变化时,是窗口能够重新绘制其用户区域的内容

CS_NOCLOSE

0x0200

不能使用窗口菜单中的“关闭”功能

CS_OWNDC

0x0020

为该类的每个窗口分配独立的设备描述表。

CS_PARENTDC

0x0080

允许子窗体使用父窗体的设备描述表。

CS_SAVEBITS

0x0800

<wbr></wbr>

当窗口中部分内容被遮挡时,自动保存图像,当被遮挡的区域恢复时,使用自动保存的图形来进行自动恢复。

CS_VREDRAW

0x0001

lpfnWndProc<wbr></wbr>指向窗口处理函数(回调函数)。
处理窗口事件,像单击鼠标会怎样,右击鼠标会怎样,都是由此函数控制的。
存储指向窗口处理函数的指针。
cbClsExtra<wbr></wbr>为窗口类的额外信息做记录,初始化为0
存储指向指定分配给窗口类结构的附加字节数。
cbWndExtra记录窗口实例的额外信息,系统初始为
0。
如果程序使用 WNDCLASSEX 注册一个从资源文件里创建的对话框,则此参数必须设置为 DLGWINDOWEXTRA
hInstance存储包含窗口类的窗口处理函数的实例的句柄。窗口类结构已经把窗口的基本属性包含在其中。由于每个程序都有唯一的实例句柄,因此,窗口类的hInstance属性直接表述了该窗口的性质。即每个程序可以设置各自独立的窗口类。
hIcon存储该类窗口的图标的句柄。
一个Windows程序有两个与其相关的图标,一个是32*32位图的标准图标,称为大图标,另一个是16*16位图的小图标。hIcon存储的是标准图标。该域必须是图标资源的句柄,若为NULL,这系统提供一个默认的图标。
hCursor存贮表示窗口类光标的句柄,该域必须是一个光标资源的句柄。
一般情况下使用一个内置光标。常见内置光标如下表:
光标宏 形状
IDC_ARROW 标准箭头
IDC_CROSS 十字线
IDC_HAND
IDC_WAIT 沙漏
IDC_SIZENS 上下双箭头
IDC_SIZEWE 左右双箭头
IDC_SIZEALL 四个方向箭头
IDC_HELP 箭头和问好
IDC_IBEAM 垂直I字形
IDC_SIZENESW 右下角和左上角算箭头
IDC_SIZENWSE 左上角和右下角算箭头
hbrBackground窗口类的背景刷,为背景刷句柄,也可以为系统颜色值,如果颜色值已给出,则必须转化为以下的HBRUSH的值

·<wbr><wbr></wbr></wbr>COLOR_ACTIVEBORDER

·<wbr><wbr></wbr></wbr>COLOR_ACTIVECAPTION

·<wbr><wbr></wbr></wbr>COLOR_APPWORKSPACE

·<wbr><wbr></wbr></wbr>COLOR_BACKGROUND

·<wbr><wbr></wbr></wbr>COLOR_BTNFACE

·<wbr><wbr></wbr></wbr>COLOR_BTNSHADOW

·<wbr><wbr></wbr></wbr>COLOR_BTNTEXT

·<wbr><wbr></wbr></wbr>COLOR_CAPTIONTEXT

·<wbr><wbr></wbr></wbr>COLOR_GRAYTEXT

·<wbr><wbr></wbr></wbr>COLOR_HIGHLIGHT

·<wbr><wbr></wbr></wbr>COLOR_HIGHLIGHTTEXT

·<wbr><wbr></wbr></wbr>COLOR_INACTIVEBORDER

·<wbr><wbr></wbr></wbr>COLOR_INACTIVECAPTION

·<wbr><wbr></wbr></wbr>COLOR_MENU

·<wbr><wbr></wbr></wbr>COLOR_MENUTEXT

·<wbr><wbr></wbr></wbr>COLOR_SCROLLBAR

·<wbr><wbr></wbr></wbr>COLOR_WINDOW

·<wbr><wbr></wbr></wbr>COLOR_WINDOWFRAME

·<wbr><wbr></wbr></wbr>COLOR_WINDOWTEXT

lpszMenuName存储以空结尾的指定类菜单资源名的字符串指针,类菜单资源名已经在资源文件中进行了定义。
如果使用整数来表示菜单,则需要使用MAKEEINITSOURCE宏。如果该域为NUILL,属于该窗口类的窗口没有默认菜单。
lpszClassName存储以空结尾的字符串的指针,或存储一个原子元素(ATOM)。
ATOM本质上也是一个整数,通常用来做唯一标识。如果该域是一个原子元素,那么它必须是以前调用RegisterClass或RegisterClassEx函数所创建的类原子元素,该原子元素存于lpszClassName的低位字节中,其高位必须为0;如果lpzeClassName是一个字符串,则它指定窗口类的名字。
hIConSm存储该类窗口小图标的句柄。
此章节已结束,请看下一章节: Windows编程之创建窗口

你可能感兴趣的:(windows)