Win32应用程序基础——WNDCLASSEX窗口类。

有了主函数,程序即可以运行了,程序首先找到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的,这也是一个命名规则。

定义完窗口类并不表明咱们可让程序显示一个窗口了,别忘了还要注册显示呢。

相关文章
相关标签/搜索