创建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 ...
随机推荐
- PHP+Mysql————表单数据插入数据库及数据提取
站点在进行新用户注冊时,都会将用户的注冊信息存入数据库中,须要的时候再进行提取.今天写了一个简单的实例. 主要完毕下面几点功能: (1)用户进行注冊,实现password反复确认,验证码校对功能. ( ...
- vultr centos x64 6.5.x 升级php7.0
升级前,先卸载 php5.6.x 卸载php5.6.2 从cent 6.5.x 需要卸载: yum remove php56u-mysqlnd-5.6.20-1.ius.centos6.x86_64 ...
- Android 反编译(一,apktool+smail2java)
一:解压缩(获取图片等资源) 对于apk中丰富的资源,假设我们在练习的时候须要引用某些apk中的资源文件时,最简单的办法使用解压缩工具对apk进行解压缩,然后在对应的文件夹下查找须要的资源文件. 二: ...
- 兔子--Fragment与ViewPager要切换滑动效果
效果图: 文件夹结构: 代码分析: MainActivity.java package com.example.myfragment; /** * @author Arthur Lee * @time ...
- 【Android先进】查看手机记忆库状态和应用方法
一世 我们知道.android程序存储器通常被限制16M.当然,24M的,和android程序存储器分为2部分:native和dalvik.dalvik 就是我们寻常说的java堆.我们创建的对象是在 ...
- OS调度算法常用摘要
一.常见的批处理作业调度 1.先来先服务调度算法(FCFS):就是依照各个作业进入系统的自然次序来调度作业.这样的调度算法的长处是实现简单,公平. 其缺点是没有考虑到系统中各种资源的综合使用情况,往往 ...
- WPF中的三维空间(2)
原文:WPF中的三维空间(2) 2.10.3 三维对象操作 1.在二维平面空间移动.缩放.旋转Viewport3D控件对象 图2-196 选中Viewport3D控件对象 图 ...
- ios-上拉电阻负载许多其他接口
想尝试拉加载意识到有多少开始了他的研究之旅,我看了两天做出最终的界面. 之所以这么慢是由于,我不知道要将上拉出现的view放在哪.就能在scrollView拉究竟部的时候被拉出来.还有就是怎么拉出来之 ...
- sql中 in 、not in 、exists、not exists 使用方法和区别
% 的一类. NOT IN:通过 NOT IN keyword引入的子查询也返回一列零值或很多其它值. 以下查询查找没有出版过商业书籍的出版商的名称. SELECT pub_name FROM pub ...
- TotoiseSVN基本用法
TotoiseSVN的基本用法 TotoiseSVN的基本用法 一.签入源码到SVNserver 假如我们使用Visual Studio在目录StartKit中创建了一个项目.我们要把这个项目的源码签 ...