Windows窗口和消息(一)
Windows应用程序基本结构,包括:
窗口处理 包括设计窗口类、注册窗口类、创建窗口、显示及更新窗口
消息循环 包括消息结构体,消息循环,消息的结束,消息的解释、分发
窗口过程函数
常用句柄、常用消息介绍
Windows应用程序运行原理
建立自己的窗口
MessageBox创建的窗口,功能局限
可以有几个按钮、图标、标题、消息正文;按钮和图标必须是Windows提供的。
CreateWindow创建窗口函数
创建一个窗口,其中指定了窗口类、窗口名、窗口样式、窗口初始大小和显示位置、窗口菜单等等内容。
在创建窗口之前,要先有一个窗口类对象。
CreateWindow原型
HWND CreateWindow(
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
int x, int y,
int nWidth, int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam );
窗口类原型
typedef struct {
UINT style; //窗口类型
WNDPROC lpfnWndProc; //窗口过程函数
int cbClsExtra; //
int cbWndExtra; //
HINSTANCE hInstance; //窗口的实例
HICON hIcon; //窗口的图标
HCURSOR hCursor; //窗口的光标
HBRUSH hbrBackground; //窗口背景
LPCTSTR lpszMenuName; //窗口菜单名
LPCTSTR lpszClassName; //窗口类名
} WNDCLASS;
窗口类-常用style
风格 含义
CS_HREDRAW 如果窗口宽度发生改变,重绘整个窗口
CS_VREDRAW 如果窗口高度发生改变,重绘整个窗口
CS_DBLCLKS 能感受用户在窗口中的双击消息
CS_NOCLOSE 禁用系统菜单中的“关闭”命令
如:WNDCLASS wnd;
wnd.style=CS_HREDRAW|CS_VREDRAW;
窗口类-窗口过程函数
第二个成员变量lpfnWndProc指定了窗口的过程函数,它将处理根据这个窗口类别建立的所有窗口的全部消息。
调用过程由操作系统而不是应用程序自己来实施,但回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数来处理呢?操作系统调用的就是窗口类中的lpfnWndProc成员指定的函数
wnd.lpfnWndProc=WndProc;
窗口类-其他成员
hInstance 代表应用程序实例,用WinMain的参数赋值:wnd.hInstance=hInstance;
wnd.hIcon=LoadIcon(hInstance, lpIconName);
wnd.hCursor=LoadCursor(hInstance, lpCursorName);
加载应用程序图标、光标,可以预定义/自定义
预定义:第一个参数为NULL;第二个参数是以IDI(图标)、IDC(光标)开始的标识符,他们在WINUSER.H中定义。
自定义:第一个参数为程序的执行实例句柄hInstance;第二个参数是自定义图标、光标的文件名,他们以资源的形式存放在项目中。
窗口类-其他成员
wnd.hbrBackground=(HBRUSH)GetStockObject(nBrush);
设置窗口背景颜色,通过指定一个画刷来实现。GetStockObject能够得到一个预定义的画笔、画刷、字体等对象。
lpszMenuName=NULL;
设定窗口的菜单,NULL表示没有菜单
lpszClassName=窗口类名(字符串)
必须给出字符串形式的窗口类名,在创建窗口时要使用。
注册窗口类
Bool RegisterClass(&wnd)
窗口类必须要先注册后使用
函数返回布尔值,成功返回真,否则为假
一般主程序中都会检测这个值,如果为假则给出提示,退出程序。如:
if (!RegisterClass (&wnd))
{
MessageBox(NULL, TEXT(“RegisterClass fail!"), TEXT(“ERROR”), MB_ICONERROR);
return 0;
}
创建窗口
HWND CreateWindow(
lpszClassName, //窗口类名
lpszTitle, //窗口标题名
WS_OVERLAPPEDWINDOW, //窗口样式
10, //窗口位置X坐标
10, //窗口位置Y坐标
800, //窗口宽度
600, //窗口高度
NULL, //该窗口父窗口句柄
NULL, //窗口主菜单句柄
hInstance, //创建此窗口的实例句柄
NULL); //传给WM_CREATE消息的参数
第一个参数就是程序注册的窗口类的类名。这样,我们建立的窗口才和窗口类联系起来。
CreateWindow函数失败返回NULL;执行成功返回窗口句柄,这个值将提供给很多Windows函数做参数。如:
HWND hwnd=CreateWindow(wnd, TEXT(“my window”, …);
显示及更新窗口
在CreateWindow调用之后,Windows已经建立了这个窗口。即,Windows已经配置了一块内存,用来保存在CreateWindow调用中指定窗口的全部信息和窗口其它信息,而Windows以后就是依据窗口句柄找到这些信息的。
两个函数负责把窗口显示出来:
ShowWindow(hwnd, nCmdShow);
hwnd就是刚刚创建成功的窗口的句柄;nCmdShow为WinMain传递来的参数,表示窗口的显示方式;
UptateWindow(hwnd);
发送WM_PAINT消息给窗口消息处理程序,导致重绘窗口的显示区域
常用句柄
HWND 窗口句柄
HINSTANCE 实例句柄
HICON 图标句柄
HCURSOR 光标句柄
HBRUSH 画刷句柄
一些标识符
这些标识符是在Windows头文件中定义的。有些标识符含有两个字母或者三个字母的前缀,后面接着一个下划线:
CS_HREDRAW CS_VREDRAW 窗口类style CS_DBLCLKS CS_NOCLOSE
WS_OVERLAPPEDWINDOW 窗口style
IDC_ARROW IDC_WAIT 光标样式
IDI_APPLICATION 图标样式
WM_CREATE WM_PAINT 消息
前缀 含义 前缀 含义
CS 窗口类别样式 MB 消息框
CW 建立窗口 SND 声音
DT 绘制文字 WM 窗口消息
IDI 图示ID WS 窗口样式
IDC 游标ID
窗口的创建
创建窗口需要经过下面四个操作步骤:
设计窗口类
注册窗口类 RegisterClass()
创建窗口 CreateWindow()
显示及更新窗口
ShowWindow() UptateWindow()
Windows应用程序基本结构
入口函数WinMain()
{
初始化;
创建窗口;
进入消息循环;
}
窗口过程函数WinProc()
{
调用各消息响应函数响应消息;
}