今天继续介绍win32的框架,使用的框架仍然是上次的vs2013的开发环境下自动创创建的win32项目:
1.windows窗口创建的流程
1.入口函数
2.注册窗口
3.创建窗口
4.显示窗口
5.更新窗口
6.消息循环
2.Windows窗口的注册流程
1先定义一个Windows窗口类
typedef struct { UINT style; // 窗口类风格
WNDPROC lpfnWndProc; // 窗口过程函数指针
int cbClsExtra; // 窗口类附加数据缓冲区字节数
int cbWndExtra; // 窗口附加数据缓冲区字节数
HINSTANCE hInstance; // 当前应用程序实例句柄
HICON hIcon; // 图标句柄
HCURSOR hCursor; // 光标句柄
HBRUSH hbrBackground; // 刷子句柄
LPCTSTR lpszMenuName; // 菜单资源名
LPCTSTR lpszClassName; // 窗口类名 } WNDCLASS, *PWNDCLASS;
注意: WNDCLASSEX中多了一个 UINT cbSize; // 结构体字节数*
以上是Windows帮我们定义好的Windows窗口类型,WNDCLASS ,我们只需要使用这个类型去定义具体的窗口对象即可。
下面是一Windows窗口注册的一个示例代码(有些内容给出注释)
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex; //带后缀ex表示扩展类,说明一定有一个不带ex的类与之相对应wcex.cbSize = sizeof(WNDCLASSEX); //窗口类的内存大小()结构体大小,必须要这样给出
wcex.style = CS_HREDRAW | CS_VREDRAW;
//CS_HREDRAW 水平刷新 CS_VREDRAW 垂直刷新 CS_DBLCLKS 窗口捕获鼠标双击
//窗口类的风格 垂直刷新和水平刷新, 还有一个常用的风 //格为允许双击
wcex.lpfnWndProc = WndProc; //窗口消息处理函数,//函数指针,指定这个窗口上如果有 //事 件产生,由这个指定的函数来处理事件
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TEST));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCE(IDC_TEST);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));return RegisterClassEx(&wcex); //调用系统窗口注册类函数,真正注册窗口,
}//Windows窗口的注册其实就相当于你先画了一张图纸,你要先把这张图纸交给Windows系统,然后你才能让Windows按照这张图纸来创建窗口。
3.生成窗口,显示窗口,更新窗口
HWND hWnd;
hInst = hInstance; // 将实例句柄存储在全局变量中
//创建窗口
hWnd = CreateWindow(_T("abc"),//窗口类名 ,根据已有的窗口类名才能创建,所以这个参数必须和注册窗口类名一 //致,否则创建窗口不成功
_T("第一个windows窗口"), //窗口标题栏字符串
//WS_OVERLAPPEDWINDOW,//窗口风格
WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX,
100/*CW_USEDEFAULT*/, //窗口x坐标 CW_USEDEFAULT 使用默认的x,当x为使用默认的时候,y不用给值,给0,可以自适应,如果x给出具体值,y如果还是0,那么不管有多少个窗口,y的坐标就是0位置
0, //窗口y坐标
800/*CW_USEDEFAULT*/, //窗口的宽,具体的特性参照x,y
600, //窗口的高
NULL, //窗口的父窗口是谁,一般给null
/*hmenu*/NULL,//菜单句柄,如果给null的话,默认使用注册时的菜单 ,如果不为空,就以当前的菜单句柄来当做窗口的菜单
hInstance, //窗口的实例句柄
NULL);//一般给nullif (!hWnd)
{
return FALSE;
}//ShowCursor(false);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
4.一些窗口相关的函数
HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName ); // 寻找是否已经存在此类型的窗口
ATOM RegisterClass (CONST WNDCLASS* lpWndClass);
ATOM即unsigned short,成功返回所注册窗口类的唯一标识码(非0), 失败返回0。