创建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 ...
随机推荐
- Java对于私有变量“反思暴力”技术
(1)这两个类:(在相同的包装可以是) watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/font ...
- 阅读:AirBag Boosting Smartphone Resistance to Malware Infection
- 查看文章strncpy()功能更好的文章
strncpy()功能 原型:extern char *strncpy(char *dest, char *src, int n); 使用方法:#include <string.h> ...
- IOT(Index Organized Table)
我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式.Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表里 ...
- 重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom
原文:重新想象 Windows 8 Store Apps (13) - 控件之 SemanticZoom [源码下载] 重新想象 Windows 8 Store Apps (13) - 控件之 Sem ...
- Android SQLite 数据库 增删改查操作
Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...
- state pattern
6 状态模式总结 状态模式将一个对象在不同状态下的不同行为封装在一个个状态类中,通过设置不同的状态对象可以让环境对象拥有不同的行为,而状态转换的细节对于客户端而言是透明的,方便了客户端的使用.在实际开 ...
- Win32 Windows编程 九
资源的使用 1 资源文件 图标 光标 字符串 菜单 加速键 对话框资源位图等等 资源脚本文件 - 扩展名为RC文件 定义了资源和相关文件等信息 资源编译器 - RC.exe 2 图标资源 ICON ...
- java: org.luaj.vm2.LuaError:XXX module not found lua脚本初始化出错(转)
我遇到这个错误是因为在引用脚本目录时,设置错了位置.设置成脚本所在目录的上级目录. lua使用和加载初始化方法 在java中使用lua,使用需要引用 luaj-jse-2.0.2.jar 同时需要使用 ...
- Lua 脚本语法说明(转)
Lua脚本语法说明(增加lua5.1部份特性) Lua 的语法比较简单,学习起来也比较省力,但功能却并不弱. 所以,我只简单的归纳一下Lua的一些语法规则,使用起来方便好查就可以了.估计看完了,就懂得 ...