窗口类的概念
窗口类包含了窗口的各种参数信息的数据结构
每个窗口都具有窗口类,基于窗口类创建窗口
每个窗口类都具有一个名称,使用前必须注册到系统
窗口的分类
系统窗口类
系统已经定义好的窗口类,所有应用程序都可以直接使用
应用程序全局窗口类
由用户自己定义,当前应用程序所有模块都可以使用
应用程序局部窗口类
由用户自己定义,当前应用程序中本模块可以使用
系统窗口类
不需要注册,直接使用窗口类即可。系统已经注册好了
例如:按钮 BUTTON 编辑框 EDIT
示例:
// 在内存创建button
HWND btn = CreateWindow("BUTTON", "BUTTON", WS_OVERLAPPEDWINDOW,
100, 100, 500, 500, NULL, NULL, hInstance, NULL);
ShowWindow(btn, SW_SHOW);
// refresh window
UpdateWindow(btn);
// 在内存创建EDIT
HWND edit = CreateWindow("EDIT", "EDIT", WS_OVERLAPPEDWINDOW,
100, 100, 500, 500, NULL, NULL, hInstance, NULL);
ShowWindow(edit, SW_SHOW);
// refresh window
UpdateWindow(edit);
全局及局部窗口类
ATOM Register(CONST WNDCLASS *lpWndClass // 窗口类的数据); // 注册成功后,返回一个数字标识,失败返回0,成功返回非0。 将数据写入到操作系统.
// 注册窗口类
WNDCLASS wc = { 0 };
// 缓冲区
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
// 窗口属性
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
// 使用默认光标
wc.hCursor = NULL;
// 使用默认图标
wc.hIcon = NULL;
// 定义窗口处理函数
wc.lpfnWndProc = WndProc;
// 窗口名字
wc.lpszClassName = "Main";
// 无菜单
wc.lpszMenuName = NULL;
// 重绘标志
wc.style = CS_HREDRAW | CS_VREDRAW;
// 将以上所有赋值全部写入操作系统
RegisterClass(&wc);
注册窗口类的结构体
typedef struct WNDCLASS {
UINT style; // 窗口类的风格
WNDPROC lpfnWndProc; // 窗口处理函数
int cbClsExtra; // 窗口类的附加数据buff大小
int cbWndExtra; // 窗口的附加数据buff的大小
HINSTANCE hInstance; // 当前模块的实例句柄
HICON hIcon; // 窗口图标句柄
HCURSOR hCursor; // 鼠标的句柄
HBRUSH hbrBackground; // 绘制窗口背景的画刷句柄
LPCTSTR lpszMenuName; // 窗口菜单的资源ID字符串
LPCTSTR lpszClassName; // 窗口类的名称,窗口创建的时候要用到该名字 unique唯一咯
}
style窗口类风格
创建窗口
HWND CreateWindowExA(
_In_ DWORD dwExStyle, // 窗口的扩展风格
_In_opt_ LPCSTR lpClassName, // 已经注册的窗口类名称
_In_opt_ LPCSTR lpWindowName, // 窗口标题栏的名字
_In_ DWORD dwStyle, // 窗口的基本风格
_In_ int X, // 位置x
_In_ int Y, // 位置y
_In_ int nWidth, // 宽度
_In_ int nHeight, // 高度
_In_opt_ HWND hWndParent,
_In_opt_ HMENU hMenu, // 窗口菜单句柄
_In_opt_ HINSTANCE hInstance, // 应用程序实例句柄
_In_opt_ LPVOID lpParam); // 窗口创建时附加参数
创建成功返回窗口句柄
CreateWindowEx
匹配查找窗口类-申请一大块内存,将数据信息存入这块内存-返回句柄
匹配查找失败返回空
创建子窗口
设置父窗口句柄
创建风格要增加 WS_CHILD | WS_VISABLE
// wnd为父窗口的句柄
HWND btn = CreateWindow("BUTTON", "BUTTON",
WS_OVERLAPPEDWINDOW | WS_CHILD | WS_VISIBLE,
100, 100, 100, 40, wnd, NULL, hInstance, NULL);