窗口类风格
CS_DBLCLKS 鼠标指针在窗口内时,用户双击鼠标,向响应的窗口类的Windows Procedure发送双击消息
CS_CLASSDC 同一窗口类的所有窗口共享一个设备环境
CS_GLOBALCLASS 允许所有应用程序创建此类的窗口,不用考虑传递给CreateWindowEx()函数的hInstance参数的值。
CS_HREDRAW 如果客户区宽度改变或者移动窗口,重绘整个窗口
CS_VREDRAW 如果客户区高度改变或者移动窗口,重绘整个窗口
CS_NOCLOSE 禁用系统菜单中的关闭命令项
CS_OWNDC 为此类窗口中的每个窗口分配一个唯一的设备环境(上下文)
CS_PARENTDC 设置父窗口中的子窗口的剪贴区域,以便在父窗口上绘制子窗口
CS_SAVEBIT 将被窗口覆盖的屏幕图像部分作为位图保存,这种风格类型对于小的窗口很有用(例如菜单或者对话框),这类窗口在屏幕上只是暂时显示,其他的屏幕操作执行之前,它就会消失。
应用程序创建窗口之前必须先定义和注册一个相应的窗口类,
老的是WNDCLASS,扩展的是WNDCLASSEX
WNDCLASSEX增加两项内容,1是保存结构大小的变量,2是小图标的句柄
typedef struct _WNDCLASSEX{
UINT cbSize ; //WNDCLASSEX结构的大小
UINT style ; //窗口风格类型
WNDPROC lpfnWndProc; //Windows Procedure地址
int cbClsExtra ; //类的扩展信息
int cbWndExtra ; //窗口的扩展信息
HANDLE hInstance ; //应用程序实例句柄
HICON hIcon ; //应用程序大图标的句柄
HCURSOR hCursor; //鼠标指针句柄
HBRUSH hbrBackground; //窗口背景色
LPCTSTR lpszMenuName; //主菜单名
LPCTSTR lpszClassName; //窗口类名
HICON hIconSm; //应用程序小图标句柄
}WNDCLASSEX
1. 创建窗口类
WNDCLASSEX windowClass;
2. 窗口属性设置
windowClass.cbSize=sizeof(WNDCLASSEX);
窗口风格类型数据成员用来描述窗口的一般特性
windowClass.style=CS_VREDRAW|CS_HREDRAW
把Windows Procedure的地址赋给lpfnWndProc,
wndowClass.lpfnWndProc=WndProc;
结构成员cbClsExtra和cbWndExtra应被设置为0。cbClsExtra用来指定分配给窗口类结构的扩展字节的大小,cbWndExtra指定了分配给窗口实例的扩展字节的大小。
hInstance用于保存当前应用实例的句柄,可以从WinMain()中得到。
3. 图标和鼠标指针的加载
应用程序的图标和鼠标指针也需要在窗口类结构中定义。用户可以自定义这些资源,也可以使用windows系统提供的内建资源
可以为一个窗口类创建两个图标:一个大的一个小的。小图标用于系统菜单或者当应用程序最小化时在任务栏中的显示。大图标用于在文件、文件夹中和桌面上表示窗口。
用LoadIcon()加载图标。
HICON LoadIcon(HINSTANCE hInst,LPCSTR lpszName);
参数lpszName指定图标资源
参数hInst指定包含此图标资源的模块的句柄
函数返回指向此图标的一个句柄。
如果使用windows提供的内建图标资源,只需将参数hInst赋值为NULL,然后lpszName赋值为系统内建图标资源的图标宏。
例如:系统默认的应用程序图标宏是IDI_APPLICATION
windClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
小图标同样
windClass.hIconSm = LoadIcon(NULL,IDI_WINLOGO);
IDI_APPLICATION 默认应用程序图标
IDI_ASTERISK 星状图标
IDI_ERROR 手型图标
IDI_EXCLAMATION 惊叹号图标
IDI_HAND 手型图标
IDI_INFORMATION 星状图标
IDI_QUESTION 问号图标
IDI_WARNING 惊叹号图标
IDI_WINLOGO Windows标志图标
用LoadCursor()加载鼠标指针资源。
HCURSOR LoadCursor(HINSTANCE hInst, LPCSTR lpszName)
参数hInst指定包含资源的模块的句柄
参数lpszName指定资源
返回指向指针的句柄。
如果使用windows提供的内建指针资源,将参数hInst设置为NULL,lpszName设置为内建宏。
例如:默认的箭头指针宏是IDC_ARROW
windowClass.hCursor = LoadCursor(NULL,IDC_ARROW);
IDC_APPSTARTING 带小沙漏的标准箭头指针
IDC_ARROW 标准箭头指针
IDC_CROSS 十字指针
IDC_HELP 带问号的箭头指针
IDC_IBEAM 工字梁指针
IDC_NO 禁止符号指针
IDC_SIZEALL 四向箭头指针
IDC_SIZENS 南北双向箭头指针
IDC_SIZEWE 东西双向箭头指针
IDC_SIZEWNSE 西北-东南双向箭头指针
IDC_SIZENESW 东北-西南双向箭头指针
IDC_UPARROW 垂直向上箭头指针
IDC_WAIT 沙漏指针
4. 完整窗口类示例
WNDCLASSEX windowClass;
windowClass.cbSize = sizeof(WNDCLASSEX); //设置窗口类数据结构大小
windowClass.style = CS_HREDRAW|CS_VREDRAW //设置窗口类风格(重绘类型)
windowClass.lpfnWndProc = (WNDPROC)WndProc; //函数指针(窗口消息过程)
windowClass.cbClsExtra = 0;
windowClass.cbWndExtra = 0;
windowClass.hInstance = hInstance; //应用程序实例
windowClass.hIcon = NULL; //无图标
windowClass.hCursor = LoadCursor(NULL,IDC_ARROW); //鼠标
windowClass.hbrBackgroudn = NULL; //无背景刷
windowClass.lpszMenuName = NULL; //无菜单
windowClass.lpszClassName = “MyClass”; //窗口类名
windowClass.hIconSm = NULL; //无小图标
RegisterClassEx(&windowClass) ; //注册窗口类
5. 窗口的创建
窗口创建函数:
CreateWindow()
CreateWindowEx()
HWND CreateWindowEx(
DWORD dwExStyle, //窗口的扩展风格类型
LPCTSTR lpClassName, //指向已注册的窗口类名字的指针
LPCTSTR lpWindowName, //指向窗口名字的指针
DWORD dwStyle, //窗口风格类型
int x, //窗口的水平位置
int y, //窗口的垂直位置
int nWidth, //窗口宽度
int nHeight, //窗口高度
HWND hWndParent, //父窗口句柄
HMENU hInstance, //菜单或者子窗口标识的句柄
LPVOID lpParam); //窗口创建数据的指针
lpClassName 窗口类名字 此处应为” MyClass”
lpWindowName应用程序窗口顶部的标题栏文本
dwSytle:
WS_BORDER 细线边界
WS_CAPTION 有标题栏(包括WS_BORDER风格)
WS_CHILD 是子窗口,不能和WS_POPUP一同使用
WS_HSCROLL 有水平滚动条
WS_ICONIC 初始状态是最小化的窗口,等效于WS_MINIMIZE
WS_MAXIMIZE 初始化状态是最大化的窗口
WS_MAXIMIZEBOX 具有最大化按钮,不能与WS_EX_CONTEXTHELP组合使用,必须同时指定WS_SYSMENU风格
WS_MINIMIZE 初始化是最小化的窗口,与WS_ICONIC等效
WS_MINIMIZEBOX 具有最小化按钮,不能与WS_EX_CONTEXTHELP组合使用,必须同时指定WS_SYSMENU风格
WS_OVERLAPPED 重叠窗口,重叠窗口具有标题栏和边界,与WS_TILED等效
WS_OVERLAPPENDWINDOW
重叠窗口,同时具有:WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX,与WS_TILEDWINDOW等效
WS_POPUP 弹出式菜单窗口,不能和WS_CHILD一起使用
WS_POPUPWINDOW 同时具有WS_BORDER,WS_POPUP,WS_SYSMENU的弹出式菜单窗口,WS_POPUPWINDOW和WS_CAPTION必须一起使用使窗口菜单可见
WS_SIZEBOX 具有胶条边界,与WS_THICKFRAME风格等效
WS_SYSMENU 标题栏上有菜单的窗口,WS_CAPTION必须同时指定
WS_VISIBLE 初始化状态为可见
WS_VSCROLL 具有垂直滚动条
6. 创建窗口实例
hwnd = CreateWindowEx(
NULL, //无扩展风格
“MyClass”, //窗口类名
“MY_Window”, //窗口标题
WS_OVERLAPPEDWINDOW //窗口风格
|WS_CLIPSIBLINGS,
0,0,200,200, //窗口位置大小
NULL, //无父窗口
NULL, //无菜单
hInstance, //应用程序实例
NULL); //无扩展窗口创建参数
窗口创建后不是立即可见,可以加入WS_VISIBLE风格使窗口创建初始状态为可见
没有加入WS_VISIBLE需调用ShowWindow()显示窗口
ShowWindow(hwnd,nCmdShow);
nCmdShow来自程序入口函数WinMain().
要强制刷洗窗口中的内容,向Windows Procedure发送WM_PAINT消息需要调用
UpdateWindow();