创建Windows类别

时间:2022-06-09 14:53:07

Windows在表单。控制。对话框基本上形成。Windows类是Windows形式的类型,可处理叙述性说明。

在Windows提前有很多定义Windows类别,但它可以很容易地创建自己的Windows类别。对于每个应用程序,至少你需要创建一个Windows类别。同Windows类为模版,生成窗体,处理消息。

有两种数据结构可用于保存Windows类消息:WNDCLASS和WNDCLASSEX。WNDCLASS、是一种较早的数据结构。已不再使用。如今使用新的扩展版本号WNDCLASSEX。

WNDCLASSEX的结构为:
typedef struct tagWNDCLASSEXW {
UINT cbSize; //结构大小
/* Win 3.x */
UINT style; //样式标记
WNDPROC lpfnWndProc;//指向事件处理程序的函数指针
int cbClsExtra;//额外的类信息
int cbWndExtra;//额外的窗体信息
HINSTANCE hInstance;//应用程序实例
HICON hIcon;//主图标
HCURSOR hCursor;//鼠标图像
HBRUSH hbrBackground;//用于绘制窗体的背景刷
LPCWSTR lpszMenuName;//菜单名称
LPCWSTR lpszClassName;//类名
/* Win 4.0 */
HICON hIconSm;//小图标句柄
} WNDCLASSEXW

创建一个这种数据结构。并对其每一个字段赋值。

WNDCLASSEX wcex;

第一个字段 cbSzie ,为结构WNDCLASSEX自身的大小。是给其它函数使用的而不是给自己知道的。

设置为 

wcex.cbSize = sizeof(WNDCLASSEX);

样式标记style 。描写叙述窗体的常规属性。

属性的组合依旧使用OR 即 | 来进行组合。

CS_BYTEALIGNCLIENT: 在字节边界上(在x方向上)定位窗体的用户区域的位置

CS_BYTEALIGNWINDOW: 在字节边界上(在x方向上)定位窗体的位置

CS_CLASSDC: 该窗体类的全部窗体实例都共享一个窗体类DC

CS_DBLCLKS: 同意向窗体发送双击鼠标键的消息

CS_GLOBALCLASS: 当调用CreateWindow 或 CreateWindowEx 函数来创建窗体时同意它的hInstance參数和注冊窗体类时传递给RegisterClass 的 hInstance參数不同。假设不指定该风格。则这两个 hInstance 必须同样。

CS_HREDRAW: 当水平长度改变或移动窗体时,重画整个窗体

CS_NOCLOSE: 禁止系统菜单的关闭选项

CS_OWNDC: 给予每一个窗体实例它本身的DC。注意。虽然这样是非常方便。但它必须谨慎使用,由于每一个DC大约要占800个字节的内存。

CS_PARENTDC: 将子窗体的裁剪区域设置到父窗体的DC中去,这样子窗体便能够在父窗体上绘制自身。注意。这是子窗体还是从系统缓存中获取DC,而不是使用父窗体的DC。

使用该风格能够提高系统性能。

CS_SAVEBITS: 以位图形式保存被该窗体遮挡的屏幕部分,这样当给窗体移动以后。系统便能够用该保存的位图恢复屏幕移动的对应部分,从而系统不用向被该窗体遮挡的窗体发送 WM_PAINT 消息。该特性对于菜单类型的窗体比較合适,由于它一般是简短的显示一下之后便消失。设置该特性将添加显示该窗体的时间。由于它通常要先分配保存位图的内存。

CS_VREDRAW: 当垂直长度改变或移动窗体时。重画整个窗体

这里对CS_OWNDC和CS_CLASSDC要讨论一下:





首先。在没有这两个属性时,在调用GetDC或BeginPaint时。windows用默认值创建一个设备描写叙述表。对设备描写叙述表属性所做的一切改变在ReleaseDC或EndPaint使用后都会失效。

假设不想使用默认属性,那么能够使用CS_OWNDC 和 CS_CLASSDC 自定义设备描写叙述表属性。 

使用CS_OWNDC,这个窗体类的每个窗体都被创建了一个设备描写叙述表,且一直存在直到窗体被删除。仅仅须要初始化一次设备描写叙述表(能够在WM_CREATE消息期间完毕)当然能够在须要时改变,以后每次调用GetDC和BeginPaint函数时返回的的设备描写叙述表就是用你刚刚设置的设备描写叙述表了。

CS_OWNDC风格仅仅影响GetDC和BeginPaint获得的设备描写叙述表,不影响其他函数(如GetWindowDC)获得设备描写叙述表。

而使用CS_CLASSDC与CS_OWNDC不同的地方是,窗体类使用此风格时。仅仅创建一个设备描写叙述表为全部的窗体,全部的窗体共享这一个设备描写叙述表(且是相互排斥的)。





然后是參数 lpfnWndProc ,为一个函数指针。指向事件处理程序,SDK中函数一般都为回调函数。回调函数,__stdcall被typedef为 CALLBACK,意思即为回调。回调的基本特征是被调用函数指针作为调用函数的參数,且使用__stdcall ,由被调用函数清除栈。

回调函数的被调用函数仅仅传递一个接口,而调用函数中实现被调用函数。并设置调用方式。





接下来两个字段 cbClsExtra 和 cbWndExtra ,最初设计用来指示Windows在Windows类中保留一些额外空间,以保存执行时信息。可是,如今基本都不使用这两个字段。都设置为0.





下一个字段为hInstance ,这个字段为程序驱动时传递给WinMain()函数的hinstance,即系统启动程序时生成的该进程的实例句柄。

hIcon 为应用程序的图标 句柄。使用函数LoadIcon()载入系统图标。

hCursor。为光标句柄。使用LoadCursor进行载入。

hbrBackground 为又一次绘制或刷新窗体时。Windows至少会使用提前定义的颜色又一次绘制窗体客户区域的背景。即重刷的画刷。

画刷,画笔,。颜色。图形为GDI的组成部分。一般使用函数GetStockObject()获得系统的一些画刷。还有一种写法是直接(HBRUSH)(COLOR_WINDOW+1) 。

接下来字段为ipszMenuName。为一个以NULL结尾的字符串,包括载入到窗体上的菜单资源的名称。

ipszClassName中保存Windows类的名字。系统须要跟踪识别这些类。所以要有名字。一般为以NULL为结尾的字符串。

最后一个为小 图标,显示在win7的任务图标栏。

这完全定义Windows类别。

版权声明:本文博客原创文章,博客,未经同意,不得转载。