窗口类风格 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(); |
|