创建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类别。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
创建Windows类别的更多相关文章
- 用Visual C#创建Windows服务程序
一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT.Windows 2000和Windows XP等操作系统下用户环境以外的程序.在以前,编写Wind ...
- 用C#创建Windows服务(Windows Services)
用C#创建Windows服务(Windows Services) 学习: 第一步:创建服务框架 创建一个新的 Windows 服务项目,可以从Visual C# 工程中选取 Windows 服务(W ...
- 玩转Windows服务系列——创建Windows服务
创建Windows服务的项目 新建项目->C++语言->ATL->ATL项目->服务(EXE) 这样就创建了一个Windows服务项目. 生成的解决方案包含两个项目:Servi ...
- .Net创建windows服务入门
本文主要记录学习.net 如何创建windows服务. 1.创建一个Windows服务程序 2.新建安装程序 3.修改service文件 代码如下 protected override void On ...
- C# 创建Windows服务
创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart用于执行服务事件,一般采用线程方式执行方法,便于隔一段事件执行一回 END ...
- 使用.net 创建windows service
最近公司项目需要,写了个windows 服务,windows 服务的内容可以在VS 中新建一个"windows服务项目", (1)服务中的主要代码: public partial ...
- 使用Topshelf创建Windows服务
概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...
- C#创建windows服务列表
转载自:http://www.cnblogs.com/sorex/archive/2012/05/16/2502001.html Windows Service这一块并不复杂,但是注意事项太多了,网上 ...
- [转]C#创建Windows服务与安装
本文档用于创建windows服务说明,使用vs2010系统平台 创建项目 1 创建windows服务项目 2 右键点击Service1.cs,查看代码, 用于编写操作逻辑代码 3 代码中OnStart ...
随机推荐
- Android下的单元測试
android下的单元測试 在AndroidManifest.xml文件里配置下面信息: 在manifest节点下加入: <!-- 指定測试信息和要測试的包 --> <instrum ...
- 潜水 java类加载器ClassLoader
类加载器(class loader)用于装载 Java 类到 Java 虚拟机中.一般来说.Java 虚拟机使用 Java 类的方式例如以下:Java 源程序(.java 文件)在经过 Java 编译 ...
- css3仿山猫侧边栏
演示:http://jsfiddle.net/Adce2/ 其主要思想: 1, 先画边栏html. 2, 使用css3分别财产close sidebar-content动图片. 3, 使用css3的k ...
- poj 1789 Truck History(kruskal算法)
主题链接:http://poj.org/problem?id=1789 思维:一个一个点,每两行之间不懂得字符个数就看做是权值.然后用kruskal算法计算出最小生成树 我写了两个代码一个是用优先队列 ...
- 详细说明XML分解(两)—DOM4J
第一部分关于博客XML三接口,同时也为学习DOM4J该分析工具做准备.一般解析器基本上都实现了DOM和SAX这两组接口,DOM4J自然也不例外..DOM4J仅仅是经常使用解析器的当中一种,只是既然是实 ...
- lsb_release: command not found 解决方法(转)
问题:通过lsb_release -a 是查看linux系统版本时报错,具体的解决办法如下: [root@localhost ~]# lsb_release -a-bash: lsb_release: ...
- Heritage from father
Problem Description Famous Harry Potter,who seemd to be a normal and poor boy,is actually a wizard.E ...
- 在线API大全
之前整理过几个经常使用api地址,在经常使用在线API集合博文中. 近期浏览网页的时候,又发现一个很完整的api的大全,分享出来,建议大家收藏起来,用的时候方便查询. 经常使用API文档索引http: ...
- DataGridView绑定数据源
给DataGridView绑定数据源比較简单,方法主要有两种: 1.直接在控件属性中绑定数据源,这样的方法最简单,但它是直接连接数据库的,这样就和传DataTable的后果差点儿相同了,所以还是尽量避 ...
- android ListView优化
android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...