有了主函数,程序即可以运行了,程序首先找到WinMain入口,而后开始执行,可是注意,此时尚未任何的动做,因此此时的程序运行以后没有任何现象。函数
也许不少人预想的是,运行一个界面,上面显示一个Hello world。毕竟咱们在控制台程序中也是这么过来的。那么咱们接下来要作的就是“构造”一个窗口。spa
说到底咱们的程序是一个系统调用,因此咱们直接向操做系统请求构造窗口,而且要交给操做系统一些和窗口相关的参数,这样,操做系统就能按咱们预想的那样构造窗口了。操作系统
天然地,这些咱们逻辑上看起来的参数,实际上对操做系统而言就是一堆的数据,系统存储该数据并在须要的时候调用。咱们把这些参数打包,够形成一个结构体,在C++中这个结构体就是WNDCLASSEX窗口类。指针
WNDCLASSEX的生命以下:对象
typedef struct WNDCLASSEX { 继承
UINT cbSize; 进程
UINT style; 内存
WNDPROC lpfnWndProc; 回调函数
int cbClsExtra; 编译
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
每一个窗口都是由以上十二个成员参数定义的,不一样的组合产生了不一样的窗口,这种定义方式是Win系统中最基础的定义,不像C#那样直接来一个继承就能够给你产生一个窗口,因此天然地他要麻烦一些,不过绝对很灵活。
不要被这十二个看不懂的成员吓到,分别解释,其实也不是很难。
第一个:UINT cbSize UINT是Win32中定义的一个宏,其实就是一个32位无符号整数。#define UINT nusigned int 这个变量存储了该结构体的大小赋值时,咱们可使用sizeof(WNDCLASSEX)
第二个:UINT style 这个变量能够定义窗口的风格,style 虽然是一个无符号整数,可是他的取值,是系统定义好的一组宏变量:
CS_HREDRAW 若移动或改变了窗口宽度,则刷新整个窗口
CS_VREDRAW 若移动或改变了窗口高度,则刷新整个窗口
CS_OWNDC 为该类中的每一个窗口分配一个单值的设备描述表
CS_DBLCLKS 当用户双击鼠标时向窗口程序发送一个双击的信息,同时,光标位于属 于该类的窗口中
CS_PARENTDC 略
CS_NOCLOSE 禁止系统菜单上的关闭命令
CS_SAVEBITS 略
可使用or 将不一样的style链接起来。
第三个:WNDPROC lpfnWndProc 这个应该是该结构中最重要的一个成员,类型WNDPROC的实质是一个指向函数的长整类型的指针。 也就是说咱们定义一个窗口,当鼠标在该窗口上操做,或键盘按键时,该窗口收到了这个消息。此时他的lpfnWndProc指向一个回调函数,(回调函数见下方讲解)该窗口将参数送到回调函数,由回调函数执行动做,以后则能够对动做做出相应。
第四个:int cbClsExtra 给类而外预留的空间默认设为0 当你须要的时候天然会明白它的用处。
第五个:int cbWndExtra 同上
第六个:HINSTANCE hInstance 该窗口的句柄
第七个:HICON hIcon 该窗口的图标的句柄
第八个:HCURSOR hCursor 该窗口光标形式的句柄
第九个:HBRUSH hbrBackground 该窗口画刷的句柄(一边以H开头的都是句柄)
第十个:LPCTSTR lpszMenuName
先介绍一下该变量 LPCTSTR 他比LPSTR 多了一个C一个T C表明这是一个const T表明支持_T宏命令。实际他就是一个指向String的const指针。这个变量指向其菜单的名字。
十一个:LPCTSTR lpszClassName该类的名字。即给该类起一个名字。
十二个:HICON hIconSm这个图标显示的是窗口在任务栏处显示的图标。
就这样十二个成员介绍完了,关于回调函数能够在下一次介绍。
到此,可能还有困惑,就是为何要有个变量存储大小,为何要有一个变量存储类名。其实很简单,咱们觉得的都是咱们为类声明一个对象,而后不就能够直接使用此对象名引用该窗口类了?其实,这个名字只是存在咱们的编译前,当咱们定义了一个窗口进程会将窗口的各个成员值放入内存,也就是内存中存着的是各个成员的值,那么此时咱们生命的对象名还有吗?固然不在了,因此咱们要在内存中存一个名称,固然了这个名称不必定要是WNDCLASSEX咱们能够任意起名。
咱们有时候也会遇到一些名为WNDCLASS的类,其实他是WNDCLASSEX的老版本,他的存在只是为了兼容16位程序,当咱们使用时优先使用带EX的,这也是一个命名规则。
定义完窗口类并不表明咱们可让程序显示一个窗口了,别忘了还要注册显示呢。