一、窗口结构体WNCLASS
这个结构体存储的是一些关于窗口类信息的结构,
成员如下:
typedef struct tagWNDCLASSA {
UINT style;//窗口类型
WNDPROC lpfnWndProc;//窗口处理函数(回调函数)
int cbClsExtra;//窗口扩展(一般为0)
int cbWndExtra;//窗口实例扩展(一般为0)
HINSTANCE hInstance;//实例句柄
HICON hIcon;//窗口的最小化图标
HCURSOR hCursor;//窗口鼠标光标
HBRUSH hbrBackground;//窗口背景颜色
LPCSTR lpszMenuName;//窗口菜单
LPCSTR lpszClassName;//窗口类名
} WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;
类风格 | 含义 |
CS_VREDRAW | 移动或者调整窗口的高度(垂直方向)时,重绘整个窗口 |
CS_HREDRAW | 移动或者调整窗口的宽度(水平方向)时,重绘整个窗口 |
CS_DBLCLKS | 当用户光标在窗口内双击时,允许发送双击消息给窗口过程 |
CS_OWNDC | 给予每个窗口实例分配一个唯一的 DC(注意,尽管这样是很方便,但它必须慎重使用,因为每个 DC 大约要占 800 个字节的内存) |
CS_CLASSDC | 该窗口类的所有窗口实例都共享一个窗口类 DC |
CS_PARENTDC | 1. 将子窗口的裁剪区域设置到父窗口的 DC 中去,这样子窗口便可以在父窗口上绘制自身。(注意,这是子窗口还是从系统缓存中获取 DC,而不是使用父窗口的 DC。) 2. 指定该风格可以提高系统性能 |
CS_NOCLOSE | 禁止系统菜单的关闭选项 |
CS_SAVEBITS | 1. 以位图形式保存被该窗口遮挡的屏幕部分,这样当给窗口移动以后,系统便可以用该保存的位图恢复屏幕移动的相应部分,从而系统不用向被该窗口遮挡的窗口发送 WM_PAINT 消息 2. 该特性对于菜单类型的窗口比较合适,因为它通常是简短的显示一下之后便消失 3. 设置该特性将增加显示该窗口的时间,因为它通常要先分配保存位图的内存 |
CS_BYTEALIGNCLIENT | 在字节边界上(在 x 方向上)定位窗口的用户区域的位置 |
CS_BYTEALIGNWINDOW | 在字节边界上(在 x 方向上)定位窗口的位置 |
CS_GLOBALCLASS | 1. 当调用 CreateWindow 或 CreateWindowEx 函数来创建窗口时允许它的 hInstance 参数和注册窗口类时传递给 RegisterClass 的 hInstance 参数不同 2. 如果不指定该风格,则这两个 hInstance 必须相同 |
下面是我自己在程序中对窗口类信息结构体的填充,可以当做参考:
// WNDCCASS :窗口类,用来处理窗口的某一类信息
WNDCLASS wc;
wc.style = CS_HREDRAW | CS_VREDRAW;
// 回调函数
wc.lpfnWndProc = (WNDPROC)d3d::WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
// 函数传进来的窗口的句柄
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(0, IDI_APPLICATION);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.lpszMenuName = 0;
wc.lpszClassName = "DX9App";
二、对相关窗口进行注册
我们使用RegidsterClass函数对我们刚才填充的窗口结构进行注
// 将窗口的信息填充完成之后,使用该函数,对窗口进行注册
if (!RegisterClass(&wc))
{
::MessageBox(0, "RegisterClass() - FAILED", 0, 0);
return false;
}
三、注册完成之后,我们就要开始利用现有的属性进行窗口的创建,使用函数:CreateWindow
函数原型:
HWND CreateWindow(
LPCTSTR lpClassName,//窗口类的名称
LPCTSTR lpWindowName,//窗口的标题
DWORD dwStyle,//窗口风格
int x,//初始x坐标
int y,//初