创建Windows类

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类。

时间: 2024-11-05 12:13:39

创建Windows类的相关文章

使用Topshelf 5步创建Windows 服务 z

使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务.Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主. 1.Topshelf的代码托管在http://topshelf-project.c

(转)创建Windows服务(Windows Services)N种方式总结

转自:http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html 最近由于工作需要,写了一些windows服务程序,有一些经验,我现在总结写出来.目前我知道的创建创建Windows服务有3种方式:a.利用.net框架类ServiceBaseb.利用组件Topshelfc.利用小工具instsrv和srvany 下面我利用这3种方式,分别做一个windows服务程序,程序功能就是每隔5秒往程序目录下记录日志: a.利用.net框架类

使用Topshelf创建Windows 服务

本文转载:http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html b.利用组件Topshelf 本方式特点:代码简单,开源组件,Windows服务可运行多个实例 Topshelf是一个开源的跨平台的服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务. 官方网站:http://topshelf-project.com 第1步:引用程序集TopShelf.dll和log4net.dll 第2步:创

C#创建windows服务搭配定时器Timer使用实例(用代码做,截图版)

功能说明:C#创建一个windows服务,服务启动时D:\mcWindowsService.txt写入数据,服务运行期间每隔两秒写入当前时间.      原理这些就不说了,三语两语说不清楚,直接贴一个实例.不能贴图片!!那个压缩文里面是word文档!!有图有真相 1.建立空白项目 2.添加创建windows服务需要的引用,选择System.ServiceProcess.   3.创建服务类,继承ServiceBase,类的源代码在后面. 4. 添加windows服务的安装类. (1)在类名或者解

C# 使用Vici WinService组件来创建Windows服务

Vici WinService 是 是Windows平台下使用C#开发的轻量级用于创建,删除服务的类库,您只需简单的几行代码即可实现多线程异步服务的创建,删除,运行 废话不多说,直接上代码 /****************************************************************** * 创建人:HTL * 创建时间:2015-5-12 14:09:39 * 说明:使用Vici WinService组件创建的Windows服务 * Email:[email

创建Windows服务(Windows Services)N种方式总结

最近由于工作需要,写了一些windows服务程序,有一些经验,我现在总结写出来.目前我知道的创建创建Windows服务有3种方式:a.利用.net框架类ServiceBaseb.利用组件Topshelfc.利用小工具instsrv和srvany 下面我利用这3种方式,分别做一个windows服务程序,程序功能就是每隔5秒往程序目录下记录日志: a.利用.net框架类ServiceBase 本方式特点:简单,兼容性好 通过继承.net框架类ServiceBase实现 第1步: 新建一个Window

VS2013创建Windows服务 || VS2015+Windows服务简易教程

转自:https://www.cnblogs.com/no27/p/4849123.htmlhttps://blog.csdn.net/ly416/article/details/78860522 VS2013创建Windows服务 一.创建服务 1.文件->新建->项目->windows桌面->windows服务,修改你要的项目名称.我这不改名,仍叫WindowsService1,确定. 2.其中的Program.cs文件是入口,Service1.cs是服务文件,所有的逻辑都在这

Windows类标识符及其妙用

Windows类标识符 百度百科这样解释: Windows的类标识符class identifier也称为CLASSID或CLSID,是与某一个类对象相联系的唯一标记(UUID).一个准备创建多个对象的类对象应将其CLSID注册到系统注册数据库的任务表中,以使客户能够定位并装载与该对象有关的可执行代码. 回收站.{645ff040-5081-101b-9f08-00aa002f954e} 回收站(满).{5ef4af3a-f726-11d0-b8a2-00c04fc309a4} 拨号网络.{99

.NET windows服务(一:创建windows服务)

引用地址:https://docs.microsoft.com/zh-cn/dotnet/framework/windows-services/how-to-create-windows-services 创建服务时,可使用名为"Windows 服务"的 Visual Studio 项目模板. 通过引用适当的类和命名空间.为服务设置来自基类的继承和替代你可能想要替代的几个方法,此模板自动为你完成了许多工作. 警告 Visual Studio 的速成版中未提供 Windows 服务项目模