在Windows操作系统中,创建一个窗口是应用程序开发的基础,特别是在使用C语言与Win32 API交互时。本文将详细介绍如何使用`WNDCLASSEX`结构体来创建一个基本的窗口,并提供一个简明示例。 首先,我们来理解`WNDCLASSEX`这个结构体,它是一个用于描述窗口类的复杂类型,包含以下字段: 1. `cbSize`: 结构体的大小,通常由0x14初始化,表示接下来的成员的偏移量。 2. `style`: 窗口类的标志位,如`CS_DBLCLKS`表示双击事件会直接调用窗口过程,`CS_CLASSDC`表示共享类的设备上下文,`CS_GLOBALCLASS`用于全局窗口类等。 3. `lpfnWndProc`: 窗口过程函数的指针,这是应用程序对系统消息响应的核心部分。 4. `cbClsExtra` 和 `cbWndExtra`: 可选的额外无类型数据,用于存储类和窗口级别的额外信息。 5. `hInstance`: 应用程序实例句柄,用于关联窗口类和应用程序的资源。 6. `hIcon`: 窗口的小图标,如果为NULL,系统会使用默认图标。 7. `hCursor`: 鼠标光标,可以自定义鼠标形状。 8. `hbrBackground`: 背景刷子,用于填充窗口的背景颜色或效果。 9. `lpszMenuName` 和 `lpszClassName`: 分别是菜单名称和窗口类名称,用于标识窗口的行为和外观。 10. `hIconSm`: 小图标,适用于小图标托盘和任务栏。 `style`字段中的标志枚举允许开发者指定窗口的特定行为和特性。例如,`CS_OWNDC`表明窗口需要自己的设备上下文,而`CS_HREDRAW`和`CS_VREDRAW`控制窗口的红绿刷新属性。 创建窗口通常通过`CreateWindowEx()`函数进行,该函数需要以下参数:窗口类的实例(通过`WNDCLASSEX`创建),应用程序的实例句柄,窗口的类名,窗口的样式,尺寸,位置,父窗口(可能为NULL),窗口的初始显示模式,以及窗口的额外参数。 一个简单的创建窗口的示例代码片段如下: ```c WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW, // 设置窗口的刷新属性 (WNDPROC)MyWindowProc, // 窗口过程函数指针 0, 0, 0, 0, 0, // 不用额外的类和窗口额外信息 hInstance, // 应用程序实例句柄 LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION)), // 加载窗口图标 LoadCursor(NULL, IDC_ARROW), // 加载默认鼠标光标 (HBRUSH)NULL, // 使用系统背景 NULL, // 不使用菜单 L"MyWindowClass", // 窗口类名称 (HICON)NULL, // 未定义小图标 }; HWND hWnd = CreateWindowEx( WS_EX_CLIENTEDGE, // 添加一些窗口边框样式 L"MyWindowClass", // 窗口类名 L"我的第一个Win32窗口", // 窗口标题 WS_OVERLAPPEDWINDOW, // 窗口类型 CW_USEDEFAULT, // 默认位置 CW_USEDEFAULT, // 默认大小 300, 200, // 具体尺寸 NULL, // 父窗口 NULL, // 不使用菜单 hInstance, // 应用程序实例 NULL // 无额外参数 ); ``` 在这个例子中,`LoadIcon()`和`LoadCursor()`函数被用来加载图标和光标,`CreateWindowEx()`函数则根据提供的参数创建了窗口。注意,为了正确显示窗口,开发者还需要处理窗口消息循环,以便响应用户操作和系统消息。 总结来说,创建Win32窗口涉及设置窗口类属性、加载图标和光标,以及通过`CreateWindowEx()`函数创建窗口。了解并掌握这些基本概念对于编写Windows桌面应用至关重要。
应用程序创建窗口之前必须先定义和注册一个相应的窗口类,
老的是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
style:
CS_DBLCLKS 鼠标指针在窗口内时,用户双击鼠标,向响应的窗口类的Windows Procedure发送双击消息
CS_CLASSDC 同一窗口类的所有窗口共享一个设备环境
CS_GLOBALCLASS 允许所有应用程序创建此类的窗口,不用考虑传递给CreateWindowEx()函数的hInstance参数的值。
CS_HREDRAW 如果客户区宽度改变或者移动窗口,重绘整个窗口
CS_VREDRAW 如果客户区高度改变或者移动窗口,重绘整个窗口
CS_NOCLOSE 禁用系统菜单中的关闭命令项
CS_OWNDC 为此类窗口中的每个窗口分配一个唯一的设备环境(上下文)
CS_PARENTDC 设置父窗口中的子窗口的剪贴区域,以便在父窗口上绘制子窗口
CS_SAVEBIT 将被窗口覆盖的屏幕图像部分作为位图保存,这种风格类型对于小的窗口很有用(例如菜单或者对话框),这类窗口在屏幕上只是暂时显示,其他的屏幕操作执行之前,它就会消失。
hIcon hIconSm:
HICON LoadIcon(HINSTANCE hInst,LPCSTR lpszName);
应用程序的图标和鼠标指针也需要在窗口类结构中定义。用户可以自定义这些资源,也可以使用windows系统提供的内建资源
可以为一个窗口类创建两个图标:一个大的一个小的。小图标用于系统菜单或者当应用程序最小化时在任务栏中的显示。大图标用于在文件、文件夹中和桌面上表示窗口。
用LoadIcon()加载图标。
参数lpszName指定图标资源
参数hInst指定包含此图标资源的模块的句柄
函数返回指向此图标的一个句柄。
如果使用windows提供的内建图标资源,只需将参数hInst赋值为NULL,然后lpszName赋值为系统内建图标资源的图标宏。
IDI_APPLICATION 默认应用程序图标
IDI_ASTERISK 星状图标
IDI_ERROR 手型图标
IDI_EXCLAMATION 惊叹号图标
IDI_HAND 手型图标
IDI_INFORMATION 星状图标
IDI_QUESTION 问号图标
IDI_WARNING 惊叹号图标
IDI_WINLOGO Windows标志图标
hCursor:
HCURSOR LoadCursor(HINSTANCE hInst,LPCSTR lpszName)
参数hInst指定包含资源的模块的句柄
参数lpszName指定资源
返回指向指针的句柄。
如果使用windows提供的内建指针资源,将参数hInst设置为NULL,lpszName设置为内建宏。
IDC_APPSTARTING 带小沙漏的标准箭头指针
IDC_ARROW 标准箭头指针
IDC_CROSS 十字指针
剩余6页未读,继续阅读
- 粉丝: 0
- 资源: 8
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++标准程序库:权威指南
- Java解惑:奇数判断误区与改进方法
- C++编程必读:20种设计模式详解与实战
- LM3S8962微控制器数据手册
- 51单片机C语言实战教程:从入门到精通
- Spring3.0权威指南:JavaEE6实战
- Win32多线程程序设计详解
- Lucene2.9.1开发全攻略:从环境配置到索引创建
- 内存虚拟硬盘技术:提升电脑速度的秘密武器
- Java操作数据库:保存与显示图片到数据库及页面
- ISO14001:2004环境管理体系要求详解
- ShopExV4.8二次开发详解
- 企业形象与产品推广一站式网站建设技术方案揭秘
- Shopex二次开发:触发器与控制器重定向技术详解
- FPGA开发实战指南:创新设计与进阶技巧
- ShopExV4.8二次开发入门:解决升级问题与功能扩展