社区
Delphi
帖子详情
如何,用api函数修改一个Edit控件的字体?
CoolDesigner
2003-08-01 10:22:16
如何,用api函数修改一个Edit控件的字体?
...全文
124
6
打赏
收藏
如何,用api函数修改一个Edit控件的字体?
如何,用api函数修改一个Edit控件的字体?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
CoolDesigner
2003-08-01
打赏
举报
回复
Edit是用api函数创建的。
firetoucher
2003-08-01
打赏
举报
回复
看看msdn吧
hfont:= createFont(.....);//创建一个新的字体
holdfont:=SelectObject(edt1.canvas.handle,hfont);//选择
....//操作
SelectObject(edt1.canvas.handle,holdfont);//恢复字体
DeleteObject(hfont);//删除新的字体
Microsoft OLE DB Provider for SQL Server 错误 '80040e31'
超时已过期
/Expert/reply.asp,行105
firetoucher
2003-08-01
打赏
举报
回复
看看msdn吧
hfont:= createFont(.....);//创建一个新的字体
holdfont:=SelectObject(edt1.canvas.handle,hfont);//选择
....//操作
SelectObject(edt1.canvas.handle,holdfont);//恢复字体
DeleteObject(hfont);//删除新的字体
firetoucher
2003-08-01
打赏
举报
回复
看看msdn吧
hfont:= createFont(.....);//创建一个新的字体
holdfont:=SelectObject(edt1.canvas.handle,hfont);//选择
....//操作
SelectObject(edt1.canvas.handle,holdfont);//恢复字体
DeleteObject(hfont);//删除新的字体
things
2003-08-01
打赏
举报
回复
为什么要用API,用自身的FONT属性不是很好吗?
Edit1.Font.Name := '隶书';
Edit1.Font.Size := 20;
CoolDesigner
2003-08-01
打赏
举报
回复
等待
(推荐)Win32
API
大全
作为Microsoft 32位平台的应用程序编程接口, Win32
API
是从事Windows应用程序开发所必备的。 首先对Win32
API
函数
做完整的概述;然后收录五大类
函数
: 窗口管理、图形设备接口、系统服务、国际特性以及网络服务; 在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。
控件
与消息
函数
共91个
函数
硬件与系统
函数
共98个
函数
设备场景
函数
共73个
函数
绘图
函数
共105个
函数
位图、图标和光栅运算
函数
共39个
函数
菜单
函数
共37个
函数
文本和
字体
函数
共41个
函数
打印
函数
共66个
函数
文件处理
函数
共118个
函数
进程和线程
函数
共40个
函数
Windows消息
函数
共11个
函数
网络
函数
共14个
函数
目 录 第一章 Win32
API
概论…………………………………………………………………………1 1.1 为什么使用Win32
API
…………………………………………………………………1 1.2 Win32
API
简介 …………………………………………………………………………1 1.3 综述………………………………………………………………………………………11 第二章 窗口管理
函数
(Windows Control Function) ……………………………………13 2.1 易用特性
函数
(Accessibility Features)…………………………………………13 2.2 按钮
函数
(Button)……………………………………………………………………20 2.3 插入标记(^)
函数
(Caret)…………………………………………………………21 2.4 组合框
函数
(Combo box) ……………………………………………………………24 2.5 通用对话框
函数
(Common Dialog Box) ……………………………………………25 2.6 标
函数
(Cursor)………………………………………………………………………36 2.7 对话框
函数
(Dialog Box)……………………………………………………………40 2.8 编辑控制
函数
(
Edit
Control)………………………………………………………54 2.9 图标
函数
(Icon)………………………………………………………………………54 2.10 键盘加速器
函数
(Keyboard Accelerator)……………………………………… 61 2.11 键盘输入
函数
(Keyboard InPut) …………………………………………………63 2.12 列表框
函数
(List box) ……………………………………………………………75 2.13 菜单
函数
(Menu) ……………………………………………………………………76 2.14 消息和消息队列
函数
(Message and Message Queue)……………………………90 2.15 鼠标输入
函数
(Mouse Input) ……………………………………………………100 2.16 多文档接口
函数
(Multiple Document Interface) ……………………………103 2.17 资源
函数
(Resource)………………………………………………………………105 2.18 滚动条
函数
(Scroll Bar)…………………………………………………………113 2.19 窗口
函数
(Window)…………………………………………………………………119 2.20 窗口类
函数
(Window Class)………………………………………………………144 2.21 窗口过程
函数
(Window Procedure)………………………………………………150 2.22 窗口属性
函数
(Window Property) ………………………………………………152 第三章 图形设备接口
函数
(Graphic Device Interface Function) …………………155 3.1 位图
函数
(Bitmap) …………………………………………………………………155 3.2 笔刷
函数
(Brush)……………………………………………………………………171 3.3 剪切
函数
(Clipping) ………………………………………………………………176 3.4 颜色
函数
(Color)……………………………………………………………………179 3.5 坐标空间与变换
函数
(Coordinate Space Transformation)……………………186 3.6 设备环境
函数
(Device Context) …………………………………………………195 3.7 填充形态
函数
(Filled shape) ……………………………………………………211 3.8
字体
和正文
函数
(Font and Text)…………………………………………………215 3.9 ICM 2.0
函数
…………………………………………………………………………238 3.10 线段和曲线
函数
(Line and Curve)………………………………………………295 3.11 图元文件
函数
(Metafile)…………………………………………………………300 3.12 多显示器
函数
(Multiple Display Monitors) …………………………………311 3.13 绘图
函数
和画图
函数
(Painting and Drawing)…………………………………313 3.14 路径
函数
(Path)……………………………………………………………………328 3.15 画笔
函数
(Pen) ……………………………………………………………………332 3.16 打印及打印假脱机程序
函数
(Printing and Print Spooler)…………………334 3.17 矩形
函数
(Rectangle) ……………………………………………………………371 3.18 区域
函数
(Region)…………………………………………………………………374 第四章 系统服务
函数
(System Service Function) ……………………………………383 4.1 访问控制
函数
(Access Control) …………………………………………………383 4.2 原子
函数
(Atom) ……………………………………………………………………406 4.3 客户/服务器访问控制
函数
(Client/Server Access Control) ………………409 4.4 剪贴板
函数
(Clipboard)……………………………………………………………431 4.5 通信
函数
(Communication)…………………………………………………………436 4.6 控制台
函数
(Console)………………………………………………………………444 4.7 数据解压库
函数
(Data Decompression Library) ………………………………463 4.8 调试
函数
(Debugging)………………………………………………………………466 4.9 设备输入输出
函数
(Device Input and Output)…………………………………472 4.10 动态数据交换
函数
(Dynamic Data Exchange) …………………………………474 4.11 动态数据交换管理
函数
(Dynamic Data Exchange Management)………………476 4.12 动态链接库
函数
(Dynamic-Link Library)………………………………………489 4.13 错误
函数
(Error) …………………………………………………………………496 4.14 事件日志
函数
(Event Logging) …………………………………………………499 4.15 文件
函数
(File)……………………………………………………………………503 4.16 文件安装库
函数
(File Installation Library) ………………………………542 4.17 文件映射
函数
(File Mapping)……………………………………………………546 4.18 文件系统
函数
File System)………………………………………………………551 4.19 句柄和对象
函数
(Handle and Object)………………………………………………556 4.20 挂钩
函数
(Hook)………………………………………………………………………560 4.21 ImageHlp
函数
…………………………………………………………………………572 4.22 大整数操作
函数
(Iarge Integer Operations)……………………………………594 4.23 低层访问控制
函数
(Low-Level Access Control)………………………………596 4.24 LS
API
函数
…………………………………………………………………………617 4.25 邮槽
函数
(Mailslot)………………………………………………………………622 4.26 内存管理
函数
(Memory Management) ……………………………………………623 4.27 管道
函数
(Pipe) …………………………………………………………………655 4.28 电源管理
函数
(Power Management) …………………………………………… 663 4.29 进程和线程
函数
(Process and Thread)…………………………………………666 4.30 注册表
函数
(Registry)……………………………………………………………700 4.31 字符串操作
函数
(String Manipulation)……………………………………… 724 4.32 结构化异常处理
函数
(Structured Exception Handling) ……………………742 4.33 同步
函数
(Synchronization) ……………………………………………………745 4.34 系统信息
函数
(System Information)……………………………………………766 4.35 系统消息
函数
(System Message)…………………………………………………780 4.36 系统关机
函数
(System Shutdown) ………………………………………………781 4.37 磁带备份
函数
(Tape Backup) ……………………………………………………783 4.38 时间
函数
(Time)……………………………………………………………………789 4.39 计时器
函数
(Timer) ………………………………………………………………795 4.40 工具帮助
函数
(Tool Help) ………………………………………………………796 4.41 窗口站和桌面
函数
(Window Station and Desktop)……………………………799 4.42 Windows NT 4.0访问控制
函数
(Window NT 4.0 Access-Control)……………808 4.43 WinTrust
函数
(WinTrust)…………………………………………………………814 第五章 国际特性
函数
(International Peatures Punction)时性…………………………815 5.1 输入方法编辑
函数
(Input Method
Edit
or)…………………………………………815 5.2 国家语言支持
函数
(National Language Support)………………………………… 828 5.3 Unicode和字符集
函数
(Unicode and Character Set)……………………………… 843 第六章 网络服务
函数
(Networding Service Function)……………………………………849 6.1 数据链路控制
函数
(DLC)………………………………………………………………849 6.2 网络
函数
(Net)…………………………………………………………………………849 6.3 NetBIOS
函数
……………………………………………………………………………896 6.4 网络DDE
函数
(Networking DDE)……………………………………………………897 6.5 RAS服务器管理
函数
(RAS Server Administration)………………………………901 6.6 远程访问服务
函数
(Remote Access Administration)………………………………910 6.7 服务
函数
(Service)……………………………………………………………………929 6.8 Windows网络
函数
(Windows Networking)……………………………………………930 附录1 如何在VB中调用DLL
API
……………………………………………………………945 1 DLL
API
的声明……………………………………………………………………………945 2 DLL
API
的调用……………………………………………………………………………947 附录2 在Delphi中直接调用Windows
API
…………………………………………………953
window32
API
大全 win32编程
作为Microsoft 32位平台的应用程序编程接口,Win32
API
是从事Windows应用程序开发所必备的。本书首先对Win32
API
函数
做完整的概述;然后收录五大类
函数
:窗口管理、图形设备接口、系统服务、国际特性以及网络服务;在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 Win32
API
作为 Microsoft 32位平台(包括:Windows 9x,Windows NT3.1/4.0/5.0,WindowsCE)的应用程序编程接口,它是构筑所有32位Windows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些
函数
。 从事Windows应用程序开发,离不开对Win32
API
函数
的调用。只有充分理解和利用
API
函数
,才能深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性。 近年来,随着Microsoft 32位平台的版本升级, Win32
API
函数
的构成、功能与调用方式都有很大的发展变化,然而,国内很少有相关的新版资料出版。为了满足广大开发人员的迫切需求,我们经过认真收集、整理素材,组织编写了这本与各种Microsoft 32位平台最新版本同步的Win32
API
参考手册。 全书收录了五大类
函数
:窗口管理、图形设备接口、系统服务、国际特性以及网络服务。所有
函数
均附有功能说明、参数说明、返回值说明、备注以及引用说明。另外,在本书的第一章,我们对WiN32
API
函数
作了完整的概述;在附录部分,讲解了如何在Visual Basic和Delphi中对其调用。 由于篇幅较大,涉及技术内容广泛,加之时间仓促,书中难免存在不少错误或疏漏,希望广大读者给与批评指正。 在Windows程序设计领域处于发展初期时,Windows程序员可使用的编程工具唯有
API
函数
。这些
函数
在程序员手中犹如"积木块"一样,可搭建出各种界面丰富、功能灵活的应用程序。不过,由于这些
函数
结构复杂,所以往往难以理解,而且容易误用。 随着软件技术的不断发展,在Windows平台上出现了很多优秀的可视化编程环境,程序员可以采用"所见即所得"的编程方式来开发具有精美用户界面和功能的应用程序。这些可视化编程环境操作简便、界面友好,比如:Visual C++,Delphi,Visual Basic等等。在这些工具中提供了大量的类库和各种
控件
,它们替代了
API
的神秘功能。事实上,这些类库和
控件
都是构筑在Windows
API
的基础上的,但它们使用方便,加速了Windows应用程序的开发,所以受到程序员的普遍采用。有了这些类库和
控件
,程序员们便可以把主要精力放在整体功能的设计上,而不必过于关注具体细节。不过,这也导致了非常多的程序员在类库面前"固步自封",对下层
API
函数
的强大功能一无所知。 实际上。程序员要想开发出更灵活、更实用、更具效率的应用程序,必然要涉及到直接使用
API
函数
。虽然类库和
控件
使应用程序的开发容易得多,但它们只提供Microsoft Windows的一般功能,对于一些比较复杂和特殊的功能来说,单使用类库和
控件
是难以实现的,必须直接使用
API
函数
来编写。
API
函数
是构筑整个Windows框架的基石,只有充分理解和利用
API
函数
,才能深入到Windows的内部,充分发挥各种32位平台的强大功能和灵活性,才能成功地扩展和突破类库、
控件
和可视开发环境的限制。 Win32
API
即为Microsoft 32位平台的应用程序编程接口(Application Programming Interface)。所有在Win32平台上运行的应用程序都可以调用这些
函数
。 使用Win32
API
,应用程序可以充分挖掘Windows的32位操作系统的潜力。 Mircrosoft的所有32位平台都支持统一的
API
,包括
函数
、结构、消息、宏及接口。使用 Win32
API
不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。 在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些
函数
只能在更强大的平台上实现其功能。例如,安全
函数
只能在Windows NT操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或
函数
可管理的项目个数等等。 标准Win32
API
函数
可以分为以下几类: 窗口管理 窗口通用控制 Shell特性 图形设备接口 系统服务 国际特性 网络服务 在下面各节中,我们分别介绍这7种类型的
API
函数
。 窗口管理
函数
向应用程序提供了一些创建和管理用户界面的方法。你可以使用窗口管理
函数
创建和使用窗口来显示输出、提示用户进行输入以及
皮肤
控件
研究文档,破解后的库文件,皮肤设计工具使用教程
皮肤
控件
研究文档,破解后的库文件,皮肤设计工具使用教程 皮肤
控件
skin++ skincrafter SkinFeature IrisSkin 我共享的都是本人实际验证过的精品,有文档,破解后的库文件,皮肤设计工具使用教程, 1 软件界面 每个软件都要有自己的软件界面,对于软件开发来说,软件界面不一定是最重要的,但是也是相当重要的。一款软件要是可 以在界面上做好,吸引了客户的眼球,那这款软件也就相对成功了一半。 现在各行各业的软件都添加了自己的皮肤色彩,显示出了不同的特点。例如QQ,MSN,Foxmail等等,这些软件都
修改
了自己软件的界面,将自己的界面化做的很完善,很漂亮。使用起来感觉很舒服。 2 软件界面的解决方案之一:使用皮肤组件 皮肤组件能完全自动的为您的应用程序添加支持换肤功能,甚至不需要更改您的设计好的Form以及添加一行代码!您 也不再需要花费很多时间来使得自己的应用程序更漂亮。 3 选择皮肤组件产品时需要考虑的几个因素: 3.1 产品易用性 软件
控件
的
API
及使用 是否简单易用是我们需要考虑的
一个
重要关键。这个问题涉及到两个方面: 是否容易整合到现有应用程序中? 是否容易在新的应用程序项目中应用? 易用性: 界面
控件
类产品对应用程序的影响应该越小越好,要易于在现有应用程序中整合。这要求
API
简洁,同时也要求界面库易扩 展,兼容性强。 开发人员能否及时掌握并使用。 3.2 产品稳定性 界面库产品当前的稳定性当然是首要考虑的问题,目前可以从以下几个方面来鉴别产品的稳定性: 是否有足够多的示例Demos来演示
控件
库产品的各个方面的功能特性 是否已经有众多的成功案例 发布多长时间,同时是否一直有持续更新。 3.3 界面配置灵活性 界面开发
一个
很重要的问题是界面的样式是非常灵活的。比如
一个
button上面可能有
一个
图标,但有时也有可能需 要两个图标;有时有一行文字,但有时也可能有两行不同颜色的文字。界面库产品都需要考虑这些因素。以下是我们在开发 中经常遇到的问题:
控件
界面的多样性。 如上面提到的不同位置多个图标,多行文字等。如果
一个
控件
库的button只支持设置
一个
图标,这显然是不够灵活的,不实 用的。有人可能会说“把几张图片,切图时做到一起不就可以了么,反正
一个
控件
也可以理解只有
一个
背景。” 如果涉及 到色调调整,这种做法会遇到麻烦,比如如下界面: 其中间图标在色调调整时,其色调不变的。如果图标和背景做到一起,则不能做到此效果。
控件
界面元素的动态变化。
控件
的界面表现不是静态的,很多情况我们需要能根据程序逻辑动态调整界面表现。 比如: 这种情况在界面设计与开发中是非常常见的,界面库产品需要非常容易的支持此特性。 需要根据程序逻辑自绘界面。 界面库不是万能的,界面库的设计者需要考虑尽可能的避免让客户去绘制界面,但却无法做到100%避免,由于程序逻辑的需 要,客户有时候需要自己绘制
控件
的某一部分。因此
一个
完整的界面库系统需要有自绘的支持,即在界面库绘制之后,让客 户有绘制的机会。同时也需要有一套机制来管理自绘部分的图片,颜色等资源,不然无法保证界面色调的一致性。 3.4 界面库高效性 界面库的效率是
一个
核心问题。糟糕的界面库效率会带来极坏的用户体验,这也应是公司在考虑
一个
界面
控件
类产 品时首要考虑的问题。可以通过以下几种方式来判断界面库类产品的效率: 拖拽窗口,观察是否有明显的停顿感。 可在
一个
系统下,找一些知名软件比较,如QQ/MSN等。如果有明显差异,则说明界面库在界面的绘制等方面存在欠缺。 拖拽窗口,观察界面
控件
是否有明显闪烁 如发生界面闪烁,则说明界面绘制的处理有些问题。 软件启动速度 界面库产品应该对图片等资源加载做优化,以尽可能的减少界面库加载等带来的时间开销。也可以通过比较软件启动速度来 比较界面库的效率。 软件色调调整时的效率 色调调整等操作一般会涉及到整体界面库的运算与操作,这种情况下也可以显示出不同界面库产品之间的效率差异。如果色 调调整明显带来停顿感,则说明界面库某些方面的效率偏低;一般来说DirectUI类型的库这方面效率会稍微高些。 3.5 周边产品完整性 软件界面开发会涉及到很多部分,通用的界面库产品只是其中的
一个
需求。界面开发中还会涉及到其他行业相关 的特殊
控件
、组件需求,如果
控件
提供商能一站式的解决这些问题,提供完整的界面解决方案,那将极大的减少界面方面的 研发投入。 IM即时聊天客户端产品,除了通用界面库的需求外,可能还需要制作聊天窗口的Rich
Edit
扩展
控件
,配置面板,系统消息组 件,这些都是
一个
IM客户端必须的。 3.6 产品升级及售后服务 产品是否有持续的更新和升级 所选择的产品是否有持续的、及时的升级及更新,是否有可靠的售后服务也是需要考虑的重点。 如果
控件
提供商不能对产品持续投入,则产品不能保持技术竞争力,也不能给客户以信心。
一个
优秀的产品成长 的过程应该是根据客户的需求及行业的发展来不断升级和完善的过程。 售后服务是否有保障 有保障的售后服务是选择软件产品的基本条件。 一般来说以公司方式运营的产品在售后服务方面更有保障,双方可以以合同或协议的方式来保证产品的售后服务质量及 持续性。 4 市面上有几款比较好的皮肤组件 4.1 Skin++(属于第二代的外挂式的界面库) 网站链接:http://www.uipower.com/index.html 4.1.1 简介: 产品易用性 界面与业务逻辑彻底分离; 支持流行的Windows操作系统; 支持所有Win32/Win64平台,包括.Net应用程序; Skin++ 支持的开发工具: 支持VC++各种版本:VC6,VC2003,VC2005,VC2008; 支持VisualStudio. Net各种版本:VisualStudio. Net 2003, 2005, 2008; 支持 PowerBuilder 各种版本:PowerBuilder 6.0,7.0,8.0,9.0,10.0,10.5,11.0; 支持 Delphi各种版本:Delphi 4,5,6,7,8,2005,2006; 支持C++ Builder 各种版本:C++ Builder 4,5,6,2006; 产品稳定性 成功案例: Skype 华为eSpace 阿里旺旺 淘宝助理 江民杀毒软件 浩方对战平台 360安全卫士(使用DirectUI, DirectUI为上海勇进软件skn++有限公司旗下产品) 等等 界面配置灵活性 可视设计,正式版提供皮肤设计工具SkinBuilder,SkinBuilder是所见即所得的设计开发环境,可以设计用户自己风格的界 面皮肤,并实现动态换肤功能。 没有下载到试验版的SkinBuilder,我联系的skn++的客服人员,只提供了
一个
视频教程和
一个
文档Skin++BuilderHelp.chm 视频教程链接地址:http://www.uipower.com/bbs/forum-56-1.html 皮肤设计工具(SkinBuilder)使用演示: http://www.uipower.com/DirectUIBuilder/DirectUIBuilder.html 其它信息:http://www.uipower.com/bbs/index.htm 界面库高效性 下载试用skn++网站上的Skin++ 演示系统 SkinPlusPlus.VS.Net.Eval
Edit
ion.3.1.1.exe 窗口数量小于10个时,颜色改变时间延迟不明显,窗口推动不会闪烁。 窗口数量大于30时: 我测试时在MDI应用程序中的主框架下新建100个子窗口,改变一下界面主题颜色,从第
一个
子窗口改变颜色到整个界面改变 颜色,用了1分27秒。平均一秒
一个
窗口,内存使用28.4M左右,改变颜色过程中CPU占用99%。颜色改变时间延迟明显,窗口 推动不会闪烁,但是响应速度很慢。 周边产品完整性 可视设计,提供皮肤设计工具,所见即所得的设计开发环境; 色调变换,支持皮肤色调变换,每一套皮肤都拥有N种色调风格; 皮肤资源海量,提供方便的皮肤转换工具,可以将目前主流的皮肤主题转换成Skin++格式; 支持Unicode,提供多种编码格式; 支持静态库链接,与客户程序可以进行无缝整合; 支持第三方
控件
; 产品升级及售后服务 产品分为:标准版,专业版,企业版,高级版,企业源码版 根据购买的版本的不同服务的项目和时间各异: 提供4到32小时的面对面开发培训 提供1到12个月的免费售后技术服务期 同步升级1个月到12个月 价格:(skin++客服人员提供的价格) skin++ directUI 标准版 价格 5800- 专业版 价格 17800 企业版 价格 38800 58800 高级企业版 价格 58800 88800 企业源码版 价格 98800
控件
源码版 价格 158800 平台源码版 价格 218800 4.1.2 详细信息: 链接到<< 皮肤
控件
:Skin++产品详细信息>> 4.2 DSkinLite 网站链接:http://www.uieasy.cn/ 4.2.1 简介: 产品易用性 DSkinLite界面库
API
及XML配置语法简单,开发人员一般可以在2-3天内熟悉使用方法。DSkinLite界面库
API
共20个左右,常 用
API
函数
应该在5左右。同时DSkinLite采用C++编写,专为Visual Studio开发者设计,开发者可以很容易的将DSkinLite整 合到已有软件工程中或者迅速开发新的软件。 DSkinLite使用XML配置界面样式,定义界面资源(
字体
,颜色,图片)等。借助于XML的灵活的语法,可以描述多 种多样的
控件
界面风格。因此不管您是否有意选择DSkinLite界面产品,您都可以下载我们的使用试用版,了解DSkinLite界 面库的设计风格,相信会让您了解一种全新的界面产品设计理念,给您的界面开发带来启发。 产品稳定性 近期的客户:长江证券 广州因豪集团 易酷创新 IM即时聊天类的客户比较多 界面配置灵活性 需要熟悉xml语法。 界面配置灵活。DSkinLite界面库采用XML管理GDI元素,并独创了将界面元素抽象为图片,矩形,线条,文字等元素。任何
一个
控件
界面均可以由这些元素来组合,使用DSkinLite可以轻松配置各种界面效果。如下图所示: 由此在
一个
控件
界面中,可以灵活的配置界面元素,可以满足绝大多数界面设计需要. 动态的控制界面元素。同时DSkinLite提供相应的
API
可以控制这些元素(image,text,rect)的显示/隐藏,同时修正某些 属性,如image的picfile属性即更换图片,text的content属性即文本内容。这种界面需求在界面开发中十分常见。 界面库高效性 DSkinLite与其他界面库相比有以下特点: 没有采用Hook所有进程消息的方式,因此没有替换系统相关对话框。DSkinLite 只是采用MFC,ATL等framework类似的方式,简单替换窗口过程,截取界面绘制等消息,对应用程序来说基本上是透明的。 从这个方面讲,DSkinLite是一款轻量级的界面库,界面效率较高。 DSkinLite内部实现跟MFC类似,就是使用SetWindowLong替换窗口过程,然后截获绘制相关消息绘制界面. 周边产品完整性 没有可视化皮肤编辑工具
控件
的样式定义于XML中,你可以在xml中定义一张图片,并设置其在窗口的任何位置,包括标题栏区域, 产品升级及售后服务 DSkinLite界面库产品及服务: DSkinLite产品使用授权 软件界面开发服务
控件
定制服务 ekRich
Edit
控件
: ekRich
Edit
源码版使用授权 Rich
Edit
控件
定制服务 DirectUI界面库: DirectU产品源码使用授权
控件
定制服务 这个公司的UI设计也是外包的, 有专门针对IM即时聊天的扩展
控件
ekRich
Edit
; 价格 http://www.uieasy.cn/dskinlite/purchase.html DSkinLite界面库企业版(¥12000) 企业版售后服务如下: 12个月免费Email技术支持 12个月免费版本升级 8小时免费技术培训 两个工作日技术支持响应 软件界面开发服务(¥5000起) 软件界面框架开发服务,根据客户需求及提供的UI设计图片,完成软件界面框架开发。此服务费用为5000元起,具体费用需 要根据用户的需求评估具体工作量来定。
控件
定制服务(¥2000起) 如您需要一些特殊的
控件
,我们可以根据您的需求定制
控件
。此服务费用为2000元起,具体需要根据
控件
需求及具体工作量 来定。 4.3 其他产品及信息: 4.3.1 东日IrisSkin 支持Delphi 5/6/7/2005,C++Builder 5/6,BDS 2006,RAD Studio 2007/2009/2010/XE; Microsoft VisualStudio.NET 2002/2003/2005/2008/2010; 含有免费的SkinBuilder工具 IrisSkin 共有两个版本,
一个
是IrisSkin.dll 用于.Net Framework1.0/1.1 和IrisSkin2.dll 用于.Net Framework2.0版 本。详细内容见安装文件的help文档。 除此之外,东日还有两个很cool的Menu: MatrixMenu和WheelMenu。 (详细内容请参见http://www.sunisoft.cn/irisskin)。 《皮肤
控件
:东日 Skin详细信息.doc》 4.3.2 Appface Appface支持的语言与开发环境是我见到的最多的,在。net上面使用起来相对前面4中都相对复杂一点, 不过看看那个 Demo也差不多会了,还是几个
函数
的使用。 (详细内容请参见http://www.appface.net)。 4.3.3 SkinSE 网站链接:http://www.skinse.com/ 是一款真正意义上适合软件界面开发的C++皮肤库。通过使用XML文件来配置GDI资源(如:图片、
字体
、颜色等),最大程度将 界面与逻辑分开,让程序员有更多的时间去进行软件内部的逻辑处理。SkinSE没有采用传统的HOOK
修改
窗口过程
函数
的方式 ,而是只是针对具体窗口进行界面处理。SkinSE只用到了windows几个底层的核心库,没有用到(MFC/ATL等第三方库),采用 纯
API
编写,采用C语言导出方式,增强可移植性。 4.3.4 DotNetSkin DotNetSkin的用法和IrisSkin差不多。此外,网站提供了几个免费的很cool的
控件
, Button,RadioButton, CheckBox, 那个button和codeproject的XPButton有的一拼了。 (详细内容请参见http://www.dotnetskin.net)。 4.3.5 SkinCrafter SkinCrafter地用法和Skin++有点类似,都是添加
一个
Com引用,然后加上几句语句用来Load皮肤,和Apply皮肤。另外, SkinCrafter还另外提供了为Windows Installer换肤的软件。 (详细内容请参见http://www.skincrafter.com)。 4.3.6 SkinEngine Alcyonesoft推出了SkinEngine,支持的语言数目与Appface不相上下,用法和Skin++, SkinCrafter类似。(详细内容参 见http://www.ksdev.com) 6、 DotNetMagic提供了许多漂亮的
控件
(http://www.dotnetmagic.com), 7、DotNetBar许多很有创意,很炫的
控件
(http://www.devcomponents.com) 8、Divelements 的许多漂亮的
控件
(http://www.divelements.co.uk) VclSkin DevExpress系列 XPMenu、 SuiPack、 rainxp、 Flatstyle、 skinengine..... 4.3.7 其他公司的界面库: 金山 自己的界面库; 瑞星 自己的界面库; 腾讯 自己的界面库,皮肤设计工具做的最精细; 迅雷7 自己的皮肤库,采用lua+xml架构,扩展性强,效率高,“万能皮肤库”。
Visual C++2010开发权威指南(共三部分).part1.rar
第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与新特性 3 1.4 Visual C++ 2010开发环境操作指南 6 1.4.1 创建Visual C++应用程序 6 1.4.2 Visual C++ 2010菜单介绍 9 1.5 Visual C++ 2010 MFC简介 12 1.6 Visual C++ 2010 clr简介 13 1.7 Visual C++ 2010 64位编程 14 1.8 支持新的C++语言标准 14 1.8.1 支持新的C++语言标准(C++ 0x) 14 1.8.2 Lambda表达式 15 1.8.3 静态断言static_assert 17 1.8.4 auto关键字 18 1.8.5 右值引用 19 1.8.6 安全数据类型 22 1.8.7 移动构造 23 1.9 支持开发并行程序 26 1.9.1 运行库支持native代码 26 1.9.2 调试和分析工具 29 1.10 对MFC的增强 31 1.10.1 任务对话框CTaskDialog 31 1.10.2 重启管理器(Restart Manager)支持 33 1.10.3 支持新的用户界面风格 34 第2章 MFC应用程序框架 37 2.1 用MFC向导生成应用程序 37 2.1.1 生成的程序框架 37 2.1.2 生成的应用程序类型 43 2.1.3 向导生成工程文件简介 46 2.2 应用程序框架分析 46 2.2.1 框架简介 47 2.2.2 MFC应用程序运行流程 50 2.2.3 应用程序窗口 51 2.2.4 消息机制与消息循环 59 2.3 文档与视图 65 2.3.1 文档类结构分析 65 2.3.2 视图类结构分析 65 2.3.3 文档与视图的关系 67 2.3.4 sdi应用程序分析 69 2.3.5 mdi应用程序分析 69 2.4 工具栏与状态栏 69 2.4.1 工具栏 70 2.4.2 状态栏 78 2.5 MFC新功能——Office 2007风格程序分析 85 2.6 MFC新功能——Visual Studio风格程序分析 90 2.7 MFC新功能——Windows资源管理器风格程序分析 98 2.8 应用程序框架类对象分析 100 2.8.1 视图类对文档类的调用 100 2.8.2 在框架类中获得当前的文档类和视图类对象指针 101 2.8.3 获得应用程序类对象的指针 101 2.8.4 从应用类对象中获得主框架类对象的指针 101 2.9 小结 102 第3章 Visual C++ 2010 MFC菜单编程 103 3.1 菜单编程 103 3.1.1 创建菜单 104 3.1.2 创建菜单热键 115 3.1.3 标记菜单 115 3.1.4 给菜单加入图标 119 3.1.5 禁用菜单 121 3.1.6 移除与加载菜单 127 3.2 菜单消息的传输机制 129 3.2.1 菜单消息的分类 129 3.2.2 菜单消息的传输路由 129 3.3 动态菜单操作 131 3.3.1 添加菜单 131 3.3.2 插入菜单 133 3.3.3 删除菜单 135 3.3.4 插入菜单的命令响应 136 3.3.5
修改
菜单 137 3.4 小结 140 第4章 Visual C++ 2010 MFC对话框编程 141 4.1 对话框简介 141 4.1.1 对话框的
控件
简介 141 4.1.2 对话框的种类简介 149 4.1.3 设计对话框 150 4.2 创建与销毁对话框 153 4.2.1 模态对话框 153 4.2.2 非模式对话框 159 4.2.3 属性页对话框 163 4.3 消息对话框 173 4.4 通用对话框 175 4.4.1 文件打开对话框 176 4.4.2 文件保存对话框 178 4.4.3 颜色对话框 179 4.4.4
字体
对话框 181 4.4.5 查找对话框 183 4.4.6 页面设置对话框 185 4.4.7 打印对话框 186 4.5 小结 187 第5章 Visual C++ 2010 MFC对话框
控件
188 5.1 Visual C++ 2010 Button
控件
简介与开发 191 5.2 Visual C++ 2010 List Box
控件
简介与开发 193 5.3 Visual C++ 2010 Com boBox
控件
简介与开发 195 5.3.1 创建扩展组合框
控件
196 5.3.2 在扩展组合框
控件
中使用 5.3.2 图像列表 197 5.3.3 设置各项的图像 197 5.3.4 处理扩展组合框
控件
中的通知消息 198 5.4 Visual C++ 2010 List
控件
简介与开发 198 5.4.1 列表
控件
和列表视图 199 5.4.2 列表项和图像列表 199 5.4.3 回调项和回调屏蔽 200 5.4.4 创建列表
控件
200 5.4.5 创建图像列表 201 5.4.6 向
控件
添加列(报表视图) 204 5.4.7 向
控件
添加项 205 5.4.8 在列表
控件
中滚动、排列、排序和查找 205 5.4.9 在列表
控件
中实现工作区 205 5.4.10 处理列表
控件
中的通知消息 206 5.4.11 更改列表
控件
样式 206 5.4.12 虚拟列表
控件
207 5.4.13 列表
控件
的消息映射 209 5.4.14 列表
控件
的风格选项及表头设置 210 5.4.15 销毁列表
控件
210 5.5 Visual C++ 2010
Edit
控件
简介与开发 211 5.6 Visual C++ 2010 Rich
Edit
控件
简介与开发 213 5.6.1 Rich
Edit
控件
中的字符格式 215 5.6.2 Rich
Edit
控件
中的段落格式 215 5.6.3 Rich
Edit
控件
中的当前选定内容 215 5.6.4 Rich
Edit
控件
中的分词 216 5.6.5 Rich
Edit
控件
中的剪贴板操作 216 5.6.6 Rich
Edit
控件
中的流操作 216 5.6.7 Rich
Edit
控件
中的打印操作 216 5.6.8 无底的Rich
Edit
控件
217 5.6.9 来自Rich
Edit
控件
的通知 217 5.7 Visual C++ 2010 Progress
控件
简介与开发 219 5.7.1 进度
控件
的样式 219 5.7.2 进度
控件
的设置 219 5.7.3 操作进度
控件
220 5.8 Visual C++ 2010 Tree
控件
简介与开发 220 5.8.1 树
控件
样式 221 5.8.2 树
控件
父项和子项 221 5.8.3 树
控件
项位置 222 5.8.4 树
控件
项标签 222 5.8.5 树
控件
标签编辑 223 5.8.6 树
控件
项的状态 223 5.8.7 树
控件
图像列表 224 5.8.8 树
控件
项选择 224 5.8.9 树
控件
拖放操作 224 5.8.10 树
控件
项信息 225 5.8.11 树
控件
通知消息 225 5.9 Visual C++ 2010 DBgrid
控件
简介与开发 226 5.9.1 示例程序1 226 5.9.2 示例程序2 227 5.10 Visual C++ 2010 Rebar
控件
简介与开发 228 5.10.1 在Rebar
控件
中使用图像列表 230 5.10.2 在Rebar
控件
中使用对话栏 231 5.10.3 处理Rebar
控件
中的通知消息 231 5.11 Visual C++ 2010 Timer
控件
简介与开发 232 5.12 Visual C++ 2010 Tab
控件
简介与开发 234 5.12.1 选项卡和选项卡
控件
属性 235 5.12.2 选项卡
控件
的使用方法 235 5.12.3 创建选项卡
控件
的方法 235 5.12.4 处理选项卡
控件
通知消息 236 5.12.5 ctabctrl类简介 236 5.13 Visual C++ 2010 IP
控件
简介与开发 241 5.14 Visual C++ 2010 Picture
控件
简介与开发 241 5.15 Visual C++ 2010 Slider
控件
简介与开发 244 5.15.1 滑块
控件
样式 244 5.15.2 滑块
控件
成员
函数
245 5.15.3 滑块
控件
通知消息 246 5.16 Visual C++ 2010 Scroll Bar
控件
简介与开发 246 5.17 Visual C++ 2010 Hot Key
控件
简介与开发 248 5.17.1 使用热键
控件
248 5.17.2 设置热键 249 5.18 Visual C++ 2010 Animation
控件
简介与开发 249 5.18.1 使用动画
控件
249 5.18.2 动画
控件
发送的通知 250 5.19 Visual C++ 2010 Spin
控件
简介与开发 250 5.19.1 数值调节钮的样式 250 5.19.2 数值调节钮成员
函数
251 5.20 Visual C++ 2010 GroupBox
控件
简介与开发 251 5.21 Visual C++ 2010 Data Time Picker
控件
简介与开发 252 5.21.1 创建日期和时间选择器
控件
253 5.21.2 访问嵌入的月历
控件
253 5.21.3 在日期和时间选择器
控件
中使用自定义格式字符串 254 5.21.4 在日期和时间选择器
控件
中使用回调字段 254 5.21.5 处理日期和时间选择器
控件
中的通知消息 256 5.22 Visual C++ 2010 Month Canlendar
控件
简介与开发 256 5.22.1 创建月历
控件
257 5.22.2 处理月历
控件
中的通知消息 257 5.22.3 设置月历
控件
的日状态 257 5.23 Visual C++ 2010 Custom
控件
简介与开发 258 5.23.1 使用MFC方法定制
控件
必备的几个基本概念 259 5.23.2 定制自定义
控件
的3种常见方法 260 5.24 Visual C++ 2010 SysLink
控件
简介与开发 260 5.25 Visual C++ 2010 Split Button
控件
简介与开发 261 5.26 Visual C++ 2010 Network Address
控件
简介与开发 262 5.27 Visual C++ 2010 Check Box
控件
简介与开发 262 5.28 Visual C++ 2010 Radio Button
控件
简介与开发 264 5.28.1 为单选按钮
控件
分组 264 5.28.2 获得被选中的单选按钮的文本 264 5.29 Visual C++ 2010 Mediaplayer
控件
简介与开发 265 5.30 小结 266 第二部分 Visual C++ 2010下MFC开发 第6章 计算机测控系统概述 267 6.1 Visual C++ 2010 SDI开发简介 267 6.1.1 建立应用程序基本框架 267 6.1.2 处理视图 267 6.1.3 处理文档 271 6.1.4 串行化处理 274 6.1.5 sdi应用程序编程思路 275 6.2 Visual C++ 2010 MDI开发简介 277 6.2.1 多文档接口 277 6.2.2 生成程序 278 6.2.3 程序类、文件和代码 279 6.2.4 自定义资源 281 6.3 Visual C++ 2010 View开发 282 6.3.1 生成源文件 283 6.3.2 初始化视图类数据成员 283 6.3.3 加入消息处理功能 285 6.3.4 设计程序资源 290 6.3.5 定制miniDraw窗口 292 6.3.6 程序清单 293 6.4 Visual C++ 2010
Edit
View开发 298 6.4.1 生成Mini
Edit
程序 299 6.4.2
修改
程序菜单 300 6.4.3 编辑加速键 301 6.4.4 程序清单 303 6.5 Visual C++ 2010 FormView开发 306 6.5.1 自定义FormDemo程序 307 6.5.2 程序清单 314 6.6 Visual C++ 2010 ScrollView开发 319 6.6.1 加入滚动功能 319 6.6.2 坐标换算 319 6.6.3 限制图形大小 322 6.6.4 改变鼠标光标 325 6.7 Visual C++ 2010 Html
Edit
View开发 328 6.8 Visual C++ 2010 HtmlView开发 331 6.9 Visual C++ 2010 ListView开发 335 6.10 Visual C++ 2010 Rich
Edit
View开发 335 6.11 VisualC++ 2010 TreeView开发 336 6.12 Visual C++ 2010 Office 2007风格文档视图开发框架 337 6.13 Visual C++ 2010 Visual Studio 2008风格文档视图开发框架 342 6.14 Visual C++ 2010 Windows资源管理器风格文档视图开发框架 346 6.15 小结 350 第7章 Visual C++ 2010 MFC应用程序界面与美化 351 7.1 应用程序窗口风格美化 351 7.1.1 借助ActiveSkin美化窗口 351 7.1.2
修改
窗口外观 352 7.2 应用程序窗口图标与背景
修改
359 7.2.1
修改
窗口图标 359 7.2.2
修改
背景 360 7.3 工具栏编程与美化 365 7.3.1 创建工具栏 365 7.3.2 在工具栏中添加、删除按钮 366 7.3.3 从对话框创建工具栏 368 7.4 状态栏编程与美化 370 7.4.1 创建状态栏 370 7.4.2 在状态栏中插入进度条 370 7.5 鼠标光标编程 371 7.5.1 鼠标光标编程步骤 371 7.5.2 鼠标的消息处理机制 373 7.5.3 示例 374 7.6 创建启动界面 376 7.7 创建特效窗口启动应用程序 378 7.8 创建特效窗口关闭应用程序 378 7.9 小结 383 第8章 Visual C++ 2010 MFC文本与
字体
384 8.1 CFont
字体
类简介 384 8.1.1 CFont
字体
类成员介绍 384 8.1.2 CFont
字体
类初始化
函数
385 8.1.3 其他成员介绍 390 8.2 创建文本插入符与图片插入符 391 8.2.1 创建文本插入符 391 8.2.2 创建图片插入符 394 8.2.3 创建随鼠标移动的插入符 396 8.3 输出文字与
字体
格式 397 8.3.1 输出固定文字 397 8.3.2 设定输出
字体
的格式 398 8.3.3 字符输入 399 8.4 输出彩色文字与变色文字 404 8.4.1 DrawText()
函数
和字符串资源 404 8.4.2 定时器和变色文字 408 8.5 小结 410 第9章 Visual C++ 2010 MFC图形图像编程 411 9.1 Windows绘图简介 411 9.1.1 设备描述表 411 9.1.2 绘图属性 412 9.1.3 元文件和路径 412 9.1.4 颜色和调色板 412 9.1.5 图形设备接口
函数
413 9.2 Windows屏幕绘图简介 414 9.2.1 窗口客户区 414 9.2.2 映射模式 414 9.2.3 图形刷新 416 9.3 微软GDI绘图简介 416 9.3.1 GDI基础 416 9.3.2 GDI结构 417 9.3.3 GDI
函数
调用 417 9.3.4 GDI基本图形 418 9.4 GDI笔绘图 419 9.4.1 CPen类简介 419 9.4.2 使用GDI绘制线条 419 9.4.3 使用CPen类绘制指定的线条 422 9.4.4 绘制连续的线条 424 9.5 GDI画刷绘图 425 9.5.1 CBrush类介绍 426 9.5.2 CBrush类简单画刷的实现 429 9.5.3 CBrush类位图画刷的实现 430 9.5.4 透明画刷的实现 431 9.6 小结 433 第10章 Visual C++ 2010 MFC动态
函数
链接库 434 10.1 动态
函数
链接库简介 434 10.1.1 什么是动态
函数
链接库 434 10.1.2 动态
函数
链接库的优点 435 10.1.3 动态
函数
链接库的起源 436 10.1.4 动态
函数
链接库的原理 436 10.2 调用动态
函数
链接库 436 10.2.1 静态链接 436 10.2.2 动态链接 438 10.3 Dll的框架简介 439 10.3.1 DllMain()
函数
简介 439 10.3.2 Dll的导出
函数
439 10.4 创建MFC Dll范例 440 10.4.1 建立MFC Dll工程 440 10.4.2 添加实现代码 442 10.4.3 编译并调用 443 10.5 创建Win32 Dll范例 443 10.5.1 建立Win32工程 443 10.5.2 添加动态链接库代码 444 10.5.3 编译工程 444 10.6 创建资源Dll范例 445 10.6.1 建立MFC Application工程 445 10.6.2 建立中文资源Dll 445 10.6.3 加载资源Dll 446 10.7 hook技术 446 10.7.1 hook
函数
类型 446 10.7.2 使用hook
函数
449 10.7.3 hook鼠标 449 10.7.4 hook键盘 450 10.8 小结 452 第11章 Visual C++ 2010 MFC Activex
控件
454 11.1 Activex
控件
简介 454 11.2 Activex
控件
测试与注册 455 11.2.1 Activex
控件
的测试 455 11.2.2 Activex
控件
的注册 457 11.3 MFC Activex
控件
向导 458 11.4 Activex
控件
属性开发 458 11.4.1 添加常用属性 459 11.4.2 添加自定义属性 460 11.4.3 高级属性实现 460 11.4.4 访问环境属性 461 11.5 Activex
控件
事件开发 461 11.5.1 添加常用事件 462 11.5.2 添加自定义事件 463 11.6 Activex
控件
方法开发 464 11.6.1 添加常用方法 465 11.6.2 添加自定义方法 465 11.6.3 从方法返回错误代码 466 11.7 完整Activex
控件
范例 467 11.7.1 创建工程 467 11.7.2 clock
控件
的实现 469 11.7.3 添加常用属性 470 11.7.4 添加自定义属性 473 11.7.5 添加方法 474 11.7.6 添加常用事件 475 11.7.7 添加自定义事件 476 11.8 调用Activex
控件
477 11.9 小结 478 第12章 Visual C++ 2010 MFC文件与注册表操作 479 12.1 文本操作串行化 479 12.1.1 文档类serialize()
函数
479 12.1.2 CArchive对文件进行读写 482 12.1.3 文档操作串行化代码分析 485 12.2 CFile类 492 12.2.1 打开文件操作 493 12.2.2 读写文件操作 494 12.2.3 定位文件操作 496 12.2.4 关闭文件操作 497 12.2.5 异常操作 497 12.2.6 文件管理操作 498 12.3 .ini文件读写操作 500 12.4 注册表读写操作 502 12.4.1 注册表简介 502 12.4.2 注册表
API
504 12.4.3 访问并
修改
注册表 507 12.5 小结 509 第13章 Visual C++ 2010 MFC数据库开发 510 13.1 数据库基本知识 510 13.2 SQL语言的基础知识 511 13.3 ODBC访问数据库 512 13.3.1 注册ODBC数据库 512 13.3.2 创建
一个
MFC的ODBC程序 514 13.3.3 程序结构分析 515 13.3.4 在视图上显示数据库查询结果 520 13.3.5 对查询结果排序及设置查询条件 524 13.3.6 动态设置查询条件并更新查询结果 527 13.4 ODBC更新数据库 532 13.5 ODBC访问SQL server 540 13.6 ado数据库访问 543 13.6.1 ado数据库访问概述 543 13.6.2 在Visual C++中使用ado编程 546 13.7 ado访问SQL server数据库 556 13.8 小结 556 第14章 Visual C++2010 MFC多线程程序设计 557 14.1 进程和多线程的概念 557 14.2 线程的创建 558 14.2.1 创建工作者线程 558 14.2.2 创建用户界面线程 559 14.3 线程的终止 560 14.4 设置线程的优先级 562 14.5 暂停及重新启动线程 563 14.6 线程间的通信 571 14.7 线程的同步 572 14.7.1 临界区 572 14.7.2 互斥量 573 14.7.3 事件 573 14.7.4 信号量 574 14.8 小结 579 第15章 Visual C++ 2010 MFC网络程序设计 580 15.1 计算机网络的基础知识 580 15.1.1 TCP/IP协议模型 580 15.1.2 ip地址 582 15.1.3 端口 582 15.1.4 数据封装 582 15.2 Winsock简介 583 15.3 MFC对Windows Sockets的支持 583 15.3.1 Socket的定义 584 15.3.2 casyncSocket类介绍 584 15.3.3 cSocket类介绍 592 15.4
一个
基于udp的聊天室示例 593 15.4.1 MFC对Windows Sockets的初始化 593 15.4.2 服务器端的实现 595 15.4.3 客户端的实现 599 15.5
一个
基于TCP的聊天室示例 605 15.5.1 服务器端的实现 606 15.5.2 客户端的实现 609 15.6 小结 612 第16章 Visual C++ 2010 MFC进程通信 613 16.1 剪贴板通信 613 16.1.1 Openclipboard()
函数
613 16.1.2 Closeclipboard()
函数
614 16.1.3 emptyclipboard()
函数
614 16.1.4 Setclipboarddata()
函数
614 16.1.5 globalalloc()
函数
615 16.1.6 globallock()
函数
616 16.1.7 globalunlock()
函数
616 16.1.8 Getclipboarddata()
函数
616 16.1.9
一个
利用剪贴板在不同进程之间交换数据的示例 616 16.2 邮槽通信 619 16.2.1 Createmailslot()
函数
619 16.2.2 Getmailslotinfo()
函数
620 16.2.3 Setmailslotinfo()
函数
621 16.2.4 ReadFile()
函数
621 16.2.5 GetFiletime()
函数
和SetFiletime()
函数
621 16.2.6 CreateFile()
函数
622 16.2.7 WriteFile()
函数
623 16.2.8 Closehandle()
函数
623 16.2.9
一个
利用邮槽在不同进程间通信的示例 623 16.3 匿名管道通信 628 16.3.1 Createpipe()
函数
628 16.3.2 Createprocess()
函数
629 16.3.3 Getstdhandle()
函数
631 16.3.4 ReadFile()和WriteFile()
函数
632 16.3.5
一个
利用匿名管道在父子进程间通信的示例 632 16.4 命名管道通信 637 16.4.1 Createnamedpipe()
函数
637 16.4.2 connectnamedpipe()
函数
639 16.4.3 disconnectnamedpipe()
函数
640 16.4.4 waitnamedpipe()
函数
640 16.4.5 利用命名管道通信的基本流程 640 16.4.6
一个
利用命名管道在不同进程间通信的示例 641 16.5 共享内存通信 647 16.5.1 CreateFilemApping()
函数
647 16.5.2 mapViewofFile()
函数
648 16.5.3 unmapViewofFile()
函数
649 16.5.4 OpenFilemApping()
函数
649 16.5.5 利用共享内存通信的基本流程 649 16.5.6
一个
利用共享内存在不同进程间通信的示例 650 16.6 小结 655 第三部分 Visual C++ 2010下MFC与clr进行开发 第17章 Visual C++ 2010 clr开发基础 656 17.1 什么是.net 656 17.2 .net框架 656 17.3 公共语言运行时(clr) 657 17.3.1 托管代码 659 17.3.2 代码验证 659 17.3.3 代码访问验证 659 17.3.4 垃圾回收 659 17.3.5 语言的互操作性 660 17.3.6 实时编译(jit) 660 17.4 通用类型系统(cts) 661 17.5 通用语言规范(cls) 663 17.6 程序集 664 17.6.1 元数据 664 17.6.2 程序集版本管理 665 17.6.3 微软中间语言(msil) 665 17.6.4 资源 666 17.7 .net开发应用程序的范畴 666 17.8 .net框架类库 667 17.9 C++/clr开发语法简介 668 17.10 小结 670 第18章 Visual C++ 2010 clr Windows窗口编程 671 18.1 创建Windows应用程序 671 18.2 类层次结构 677 18.3 control类 677 18.3.1 大小与位置 678 18.3.2 外观 679 18.3.3 用户交互操作 679 18.3.4 Windows功能 680 18.4 标准Windows
控件
使用指南 681 18.4.1 Button
控件
681 18.4.2 checkBox
控件
681 18.4.3 radioButton
控件
682 18.4.4 comboBox
控件
、ListBox
控件
和checkedListBox
控件
682 18.4.5 datetimepicker
控件
684 18.4.6 errorprovider组件 685 18.4.7 helpprovider组件 686 18.4.8 imageList组件 686 18.4.9 label
控件
686 18.4.10 ListView
控件
687 18.4.11 pictureBox
控件
688 18.4.12 progressbar
控件
689 18.4.13 TextBox
控件
、RichTextBox
控件
与maskedTextBox 18.4.13
控件
689 18.4.14 panel
控件
690 18.4.15 flowlayoutpanel
控件
和tablelayoutpanel
控件
690 18.4.16 splitcontainer
控件
691 18.4.17 tabcontrol
控件
和tabpage
控件
691 18.4.18 toolstrip
控件
692 18.4.19 menustrip
控件
694 18.4.20 conTextmenustrip
控件
694 18.4.21 toolstripmenuitem
控件
694 18.4.22 toolstripmanager类 695 18.4.23 toolstripcontainer
控件
695 18.5 窗体Winform 695 18.5.1 form类 695 18.5.2 多文档界面 700 18.5.3 定制
控件
700 18.6 小结 707 第19章 Visual C++ 2010 MFC与.net交互编程 708 19.1 编写托管扩展应用程序 708 19.2 编写访问.net的MFC程序 709 19.3 混合模式编程问题 711 19.4 运用.net类型 713 19.4.1 定义和使用托管类型 713 19.4.2 将非托管对象作为托管类的成员 715 19.4.3 装箱和拆箱 716 19.4.4 指针 717 19.4.5 在非托管代码中使用托管数组 719 19.5 小结 720 第四部分 发布Visual C++ 2010程序 第20章 Visual C++ 2010应用程序部署 721 20.1 Windows installer介绍 722 20.2
一个
简单的Windows应用程序 723 20.3 使用安装向导快速创建安装包 726 20.4 手动创建安装程序 728 20.5 使用安装编辑器 731 20.5.1 File system(文件系统编辑器) 731 20.5.2 registry编辑器 732 20.5.3 File types编辑器 733 20.5.4 user interface编辑器 734 20.5.5 custom actions编辑器 735 20.5.6 launch conditions编辑器 736 20.6 小结 736 第五部分 基于Windows 7平台用Visual C++ 2010开发 第21章 Visual C++ 2010基于Windows 7新特性开发 737 21.1 实现C++兼容开发 737 21.1.1 实现uac数据重定向 737 21.1.2 实现高dpi 741 21.1.3 实现安装程序检测 742 21.1.4 会话0隔离 743 21.1.5 用户界面特权隔离(uipi) 746 21.1.6 版本检查 748 21.2 Windows 7系统专题 750 21.2.1 实现超级任务栏 750 21.2.2 实现shell库 759 21.2.3 实现后台服务 762 21.2.4 开发基于Windows 7的 21.1.5 设备与性能应用 763 21.3 开发基于Windows 7的新特性 769 21.3.1 实现多点触摸 769 21.3.2 实现获取传感器与位置 771 21.3.3 实现Windows 7 ribbon界面开发 774 21.3.4 基于Visual C++ 2010开发基于Windows 7的语音识别与语音合成 776 21.3.5 基于Visual C++ 2010与Windows sdk for Windows 7开发Windows 7平台的tablet pc应用 787 21.3.6 开发Windows 7的安全体验crypto
API
加密 804
VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:
VC之美化界面篇 作者:白乔 链接:http://vcer.net/1046595482643.html 本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础: 1. 大致了解MFC框架的基本运作原理; 2. 熟悉Windows消息机制,熟悉MFC的消息映射和反射机制; 3. 熟悉OOP理论和技术; 本文根据笔者多年的开发经验,并结合简单的例子一一展开,希望对读者有所帮助。 1 美化界面之开题篇 相信使用过《金山毒霸》、《瑞星杀毒》软件的读者应该还记得它们的精美界面: 图1 瑞星杀毒软件的精美界面 程序的功能如何如何强大是一回事,它的用户界面则是另一回事。千万不要忽视程序的用户界面,因为它是给用户最初最直接的印象,丑陋的界面、不友好的风格肯定会影响用户对软件程序的使用。 “受之以鱼,不若授之以渔”,本教程并不会向你推荐《瑞星杀毒软件》精美界面的具体实现,而只是向你推荐一些常用的美化方法。 2 美化界面之基础篇 美化界面需要先熟悉Windows下的绘图操作,并明白Windows的幕后绘图操作,才能有的放矢,知道哪些可以使用,知道哪些可以避免…… 2.1 Windows下的绘图操作 熟悉DOS的读者可能就知道:DOS下面的图形操作很方便,进入图形模式,整个屏幕就是你的了,你希望在哪画个点,那个地方就会出现
一个
点,红的、或者黄的,随你的便。你也可以花点时间画个按钮,画个你自己的菜单,等等…… Windows本身就是图形界面,所以Windows下面的绘图操作功能更丰富、简单。要了解Windows下的绘图操作,要实现Windows界面的美化,就必须了解MFC封装的设备环境类和图形对象类。 2.1.1 设备环境类 Windows下的绘图操作说到底就是DC操作。DC(Device Context设备环境)对象是
一个
抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是Windows的设备无关性。 MFC的CDC类封装了Windows
API
中大部分的画图
函数
。CDC的常见操作
函数
包括: Drawing-Attribute Functions:绘图属性操作,如:设置透明模式 Mapping Functions:映射操作 Coordinate Functions:坐标操作 Clipping Functions:剪切操作 Line-Output Functions:画线操作 Simple Drawing Functions:简单绘图操作,如:绘制矩形框 Ellipse and Polygon Functions:椭圆/多边形操作 Text Functions:文字输出操作 Printer Escape Functions:打印操作 Scrolling Functions:滚动操作 *Bitmap Functions:位图操作 *Region Functions:区域操作 *Font Functions:
字体
操作 *Color and Color Palette Functions:颜色/调色板操作 其中,标注*项会用到相应的图形对象类,参见2.1.2内容。 2.1.2 图形对象类 设备环境不足以包含绘图功能所需的所有绘图特征,除了设备环境外, Windows还有其他一些图形对象用来储存绘图特征。这些附加的功能包括从画线的宽度和颜色到画文本时所用的
字体
。图形对象类封装了所有六个图形对象。 下面的表格列出了MFC的图形对象类: MFC类 图形对象句柄 图形对象目的 CBitmap HBITMAP 内存中的位图 CBrush HBRUSH 画刷特性—填充某个图形时所使用的颜色和模式 CFont HFONT
字体
特性—写文本时所使用的
字体
CPalette HPALETTE 调色板颜色 CPen HPEN 画笔特性—画轮廓时所使用的线的粗细 CRgn HRGN 区域特性—包括定义它的点 表1 图形对象类和它们封装的句柄 使用CDC和图形对象类,在Windows里绘图还算是很简单的。观察以下的画面: 图2 使用CDC绘制出的按钮 该画面通过以下代码自行绘制的假按钮: BOOL CUi1View::PreCreateWindow(CREATESTRUCT& cs) { //设置背景色 //CBrush CUi1View::m_Back m_Back.CreateSolidBrush(::GetSysColor(COLOR_3DFACE)); cs.lpszClass = AfxRegisterWndClass(0, 0, m_Back, NULL); return CView::PreCreateWindow(cs); } int CUi1View::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; //创建
字体
//CFont CUi1View::m_Font m_Font.CreatePointFont(120, "Impact"); return 0; } void CUi1View::OnDraw(CDC* pDC) { //绘制按钮框架 pDC->DrawFrameControl(CRect(100, 100, 220, 160), DFC_BUTTON, DFCS_BUTTONPUSH); //输出文字 pDC->SetBkMode(TRANSPARENT); pDC->TextOut(120, 120, "Hello, CFan!"); } 呵呵,不好意思,这并不是真的Windows按钮,它只是
一个
假的空框子,当用户在按钮上点击鼠标时,放心,什么事情都不会发生。 2.2 Windows的幕后绘图操作 在Window中,如果所有的界面操作都由用户代码来实现,那将是
一个
很浩大的工程。笔者曾经在DOS设计过窗口图形界面,代码上千行,但实现的界面还是很古板、难看,除了我那个对编程一窍不通的女友,没有
一个
人欣赏它L;而且,更要命的是,操作系统,包括别的应用程序并不认识你的界面元素,这才是真正悲哀的。认识这些界面的只有你的程序,图2中的按钮永远只是
一个
无用的框子。 有了Windows,一切都好办了,Windows将诸如按钮、菜单、工具栏等等这些通用界面的绘制及动作都交给了系统,程序员就不用花心思再画那些按钮了,可以将更多的精力放在程序的功能实现方面。 所有的标准界面元素都被Windows封装好了。Windows知道怎么画你的菜单以及你的标注着“Hello, Cfan!”的按钮。当CFan某个快乐的小编(譬如:小飞)点击这个按钮的时候,Windows也明白按钮按下去的时候该有的模样,甚至,当这个友好的按钮获取焦点时,Windows也会不失时机地为它准备
一个
虚框…… 有利必有弊。你的不满这时候产生了:你既想使用Windows的True Button,可也嫌它的界面不够好看,譬如,你喜欢用蓝色的粗体表达你对CFan的无限情怀(正如图2那样)——人心不足,有办法吗?有的。 3 美化界面之实现篇 Windows还是给程序员留下了很多后门,通过一些途径还是可以美化界面的。本章节我们系统学习一下Windows界面美化的实现。 3.1 美化界面的途径 如何以合法的手段来达到美化界面的效果?一般美化界面的方法包括: 1. 使用MFC类的既有
函数
,设定界面属性; 2. 利用Windows的消息机制,截获有用的Windows的消息。通过MFC的消息映射(Message Mapping)和反射(Message Reflecting)机制,在Windows准备或者正在绘制该元素时,偷偷
修改
它的状态和行为,譬如:让按钮的边框为红色; 3. 利用MFC类的虚
函数
机制,重载有用的虚
函数
。在MFC框架调用该
函数
的时候,重新定义它的状态和行为; 一般来说,应用程序可以通过以下两种途径来实现以上的方法: 1. 在父窗口里,截获自身的或者由子元素(包括
控件
和菜单等元素)传递的关于界面绘制的消息; 2. 子类化子元素,或者为子元素准备
一个
新的类(一般来说该类必须继承于MFC封装的某个标准类,如:CButton)。在该子元素里,截获自身的或者从父窗口反射过来的关于界面绘制的消息。譬如:用户可以创建
一个
CXPButton类来实现具有XP风格的按钮,CXPButton继承于CButton。 对于应用程序,使用CXPButton类的途径相对于对话框窗口和普通窗口分成两种: ① 对话框窗口中,直接将原先绑定按钮的CButton类替换成CXPButton类,或者在绑定变量时直接指定Control类型为CXPButton,如图3所示: 图3 为按钮指定CXPButton类型 ②在普通窗口中,直接创建
一个
CXPButton类对象,然后在OnCreate()中调用CXPButton的Create方法; 以下的章节将综合地使用以上的方法,请读者朋友留心观察。 3.2 使用MFC类的既有
函数
在界面美化的专题中,MFC也并非一无是处。MFC类对于界面美化也做了部分的努力,以下是一些可以使用的,参数说明略去。 CWinApp::SetDialogBkColor void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREF clrCtlText = RGB(0, 0, 0) ); 指定对话框的背景色和文本颜色。 CListCtrl::SetBkColor CReBarCtrl::SetBkColor CStatusBarCtrl::SetBkColor CTreeCtrl::SetBkColor COLORREF SetBkColor( COLORREF clr ); 设定背景色。 CListCtrl::SetTextColor CReBarCtrl::SetTextColor CTreeCtrl::SetTextColor COLORREF SetTextColor( COLORREF clr ); 设定文本颜色。 CListCtrl::SetBkImage BOOL SetBkImage( LVBKIMAGE* plvbkImage ); BOOL SetBkImage( HBITMAP hbm, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0); BOOL SetBkImage( LPTSTR pszUrl, BOOL fTile = TRUE, int xOffsetPercent = 0, int yOffsetPercent = 0 ); 设定列表
控件
的背景图片。 CComboBoxEx::SetExtendedStyle CListCtrl::SetExtendedStyle CTabCtrl::SetExtendedStyle CToolBarCtrl::SetExtendedStyle DWORD SetExtendedStyle( DWORD dwExMask, DWORD dwExStyles ); 设置
控件
的扩展属性,例如:设置列表
控件
属性带有表格线。 图4是个简单应用MFC类的既有
函数
来改善Windows界面的例子: 图4 使用MFC类的既有
函数
美化界面 相关实现代码如下: BOOL CUi2App::InitInstance() { //… //设置对话框背景色和
字体
颜色 SetDialogBkColor(RGB(128, 192, 255), RGB(0, 0, 255)); //… } BOOL CUi2Dlg::OnInitDialog() { //… //设置列表
控件
属性带有表格线 DWORD NewStyle = m_List.GetExtendedStyle(); NewStyle |= LVS_EX_GRIDLINES; m_List.SetExtendedStyle(NewStyle); //设置列表
控件
字体
颜色为红色 m_List.SetTextColor(RGB(255, 0, 0)); //填充数据 m_List.InsertColumn(0, "QQ", LVCFMT_LEFT, 100); m_List.InsertColumn(1, "昵称", LVCFMT_LEFT, 100); m_List.InsertItem(0, "5854165"); m_List.SetItemText(0, 1, "白乔"); m_List.InsertItem(1, "6823864"); m_List.SetItemText(1, 1, "Satan"); //… } 嗯,这样的界面还算不错吧? 3.3 使用Windows的消息机制 使用MFC类的既有
函数
来美化界面,其功能是有限的。既然Windows是通过消息机制进行通讯的,那么我们就可以通过截获一些有用的消息来美化我们的界面,以下是一些有用的Windows消息: WM_PAINT WM_ERASEBKGND WM_CTLCOLOR* WM_DRAWITEM* WM_MEASUREITEM* NM_CUSTOMDRAW* 注意,标注*的消息是子元素发送给父窗口的通知消息,其它的为窗口或者子元素自身的消息。 3.3.1 WM_PAINT WM_PAINT消息相信大家都很熟悉,
一个
窗口要重绘了,就会有
一个
WM_PAINT消息发送给窗口。 可以响应窗口的WM_PAINT,以更改它们的模样。WM_PAINT的映射
函数
原型如下: afx_msg void OnPaint();
控件
也是窗口,所以
控件
也有WM_PAINT消息,通过消息映射我们完全可以定义
控件
的界面。如图5所示: 图5 利用WM_ PAINT消息美化界面 实现代码也很简单: void CLazyStatic::OnPaint() { CPaintDC dc(this); // device context for painting //什么都不输出,仅仅画
一个
矩形框 CRect rc; GetClientRect(&rc); dc.Rectangle(rc); } 哈哈,简单吧?不过WM_PAINT确实绝了点,它要求应用程序完成元素界面的所有绘制过程,想象一下如何画出
一个
完整的列表
控件
?太烦了吧。一般来说,很少有人喜欢使用WM_PAINT,还有其它更细致的消息。 3.3.2 WM_ERASEBKGND Windows在向窗口发送WM_PAINT消息之前,总会发送
一个
WM_ERASEBKGND消息通知该窗口擦除背景,默认情况下,Windows将以窗口的背景色清除该窗口。 可以响应窗口(包括子元素)的WM_ERASEBKGND,以更改它们的背景。WM_ERASEBKGND的映射
函数
原型如下: afx_msg BOOL OnEraseBkgnd( CDC* pDC ); 返回值: 指定背景是否已清除,如果为FALSE,系统将自动清除 参数: pDC指定了绘制操作所使用的设备环境。 图6是个简单的例子,通过OnEraseBkgnd为对话框加载了一副位图背景: 图6 利用WM_ ERASEBKGND消息美化界面 实现代码也很简单: BOOL CUi4Dlg::OnInitDialog() { //… //加载位图 //CBitmap m_Back; m_Back.LoadBitmap(IDB_BACK); //… } BOOL CUi4Dlg::OnEraseBkgnd(CDC* pDC) { CDC dc; dc.CreateCompatibleDC(pDC); dc.SelectObject(&m_Back); //获取BITMAP对象 BITMAP hb; m_Back.GetBitmap(&hb); //获取窗口大小 CRect rt; GetClientRect(&rt); //显示位图 pDC->StretchBlt(0, 0, rt.Width(), rt.Height(), &dc, 0, 0, hb.bmWidth, hb.bmHeight, SRCCOPY); return TRUE; } HBRUSH CUi4Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { //设置透明背景模式 pDC->SetBkMode(TRANSPARENT); //设置背景刷子为空 return (HBRUSH)::GetStockObject(HOLLOW_BRUSH); } 同时别忘了响应OnCtlColor,否则窗口里面的
控件
就不透明了。OnCtlColor的内容。 3.3.3 WM_CTLCOLOR 在
控件
显示之前,每
一个
控件
都会向父对话框发送
一个
WM_CTLCOLOR消息要求获取绘制所需要的颜色。WM_CTLCOLOR消息缺省处理
函数
CWnd::OnCtlColor返回
一个
HBRUSH类型的句柄,这样,就可以设置前景和背景文本颜色,并为
控件
或者对话框的非文本区域选定
一个
刷子。 WM_CTLCOLOR的映射
函数
原型如下: afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor ); 返回值: 用以指定背景的刷子 参数: pDC指定了绘制操作所使用的设备环境。 pWnd
控件
指针 nCtlColor 指定
控件
类型,其取值如表2所示: 类型值 含义 CTLCOLOR_BTN 按钮
控件
CTLCOLOR_DLG 对话框 CTLCOLOR_
EDIT
编辑
控件
CTLCOLOR_LISTBOX 列表框 CTLCOLOR_MSGBOX 消息框 CTLCOLOR_SCROLLBAR 滚动条 CTLCOLOR_STATIC 静态
控件
表2 nCtlColor的类型值与含义 作为
一个
简单的例子,观察以下的代码: BOOL CUi5Dlg::OnInitDialog() { //… //创建
字体
//CFont CUi1View::m_Font1, CUi1View::m_Font2 m_Font1.CreatePointFont(120, "Impact"); m_Font3.CreatePointFont(120, "Arial"); return TRUE; // return TRUE unless you set the focus to a control } HBRUSH CUi5Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(nCtlColor == CTLCOLOR_STATIC) { //区分静态
控件
switch(pWnd->GetDlgCtrlID()) { case IDC_STATIC1: { pDC->SelectObject(&m_Font1); pDC->SetTextColor(RGB(0, 0, 255)); break; } case IDC_STATIC2: { pDC->SelectObject(&m_Font2); pDC->SetTextColor(RGB(255, 0, 0)); break; } } } return hbr; } 生成的界面如下: 图7 利用WM_CTLCOLOR消息美化界面 3.3.4 WM_DRAWITEM OnCtlColor只能
修改
元素的颜色,但不能
修改
元素的界面框架,WM_DRAWITEM则可以。 当
一个
具有Owner draw风格的元素(包括按钮、组合框、列表框和菜单等)需要显示外观时,该元素会发送一条WM_DRAWITEM消息至它的隶属窗口(Owner)。 WM_DRAWITEM的映射
函数
原型如下: afx_msg void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct ); 参数: nIDCtl 该
控件
的ID,如果该元素为菜单,则nIDCtl为0 lpDrawItemStruct 指向DRAWITEMSTRUCT结构对象的指针,DRAWITEMSTRUCT的结构定义如下: typedef struct tagDRAWITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; DWORD itemData; }DRAWITEMSTRUCT; CtlType指定了
控件
的类型,其取值如表3所示: 类型值 含义 ODT_BUTTON 按钮
控件
ODT_COMBOBOX 组合框
控件
ODT_LISTBOX 列表框
控件
ODT_LISTVIEW 列表视图 ODT_MENU 菜单项 ODT_STATIC 静态文本
控件
ODT_TAB Tab
控件
表3 CtlType的类型值与含义 CtlID 指定自绘
控件
的ID值,该成员不适用于菜单项 itemID表示菜单项ID,也可以表示列表框或者组合框中某项的索引值。对于
一个
空的列表框或组合框,该成员的值为?C1。这时应用程序只绘制焦点矩形(该矩形的坐标由rcItem 成员给出)虽然此时
控件
中没有需要显示的项,但是绘制焦点矩形还是很有必要的,因为这样做能够提示用户该
控件
是否具有输入焦点。当然也可以设置itemAction 成员为合适值,使得无需绘制焦点。 itemAction 指定绘制行为,其取值为表4中所示值的
一个
或者多个的联合: 类型值 含义 ODA_DRAWENTIRE 当整个
控件
都需要被绘制时,设置该值。 ODA_FOCUS 如果
控件
需要在获得或失去焦点时被绘制,则设置该值。此时应该检查itemState成员,以确定
控件
是否具有输入焦点。 ODA_SELECT 如果
控件
需要在选中状态改变时被绘制,则设置该值。此时应该检查itemState 成员,以确定
控件
是否处于选中状态。 表4 itemAction的类型值与含义 itemState 指定了当前绘制项的状态。例如,如果菜单项应该被灰色显示,则可以指定ODS_GRAYED状态标志。其取值为表5中所示值的
一个
或者多个的联合: 类型值 含义 ODS_CHECKED 标记状态,仅适用于菜单项。 ODS_DEFAULT 默认状态。 ODS_DISABLED 禁止状态。 ODS_FOCUS 焦点状态。 ODS_GRAYED 灰化状态,仅适用于菜单项。 ODS_SELECTED 选中状态。 ODS_HOTLIGHT 仅适用于Windows 98/Me/Windows 2000/XP,热点状态:如果鼠标指针位于
控件
之上,则设置该值,这时
控件
会显示高亮颜色。 ODS_INACTIVE 仅适用于Windows 98/Me/Windows 2000/XP,非激活状态。 ODS_NOACCEL 仅适用于Windows 2000/XP,
控件
是否有快速键。 ODS_COMBOBOX
EDIT
在自绘组合框
控件
中只绘制选择区域。 ODS_NOFOCUSRECT 仅适用于Windows 2000/XP,不绘制捕获焦点的效果。 表5 itemState的类型值与含义 hwndItem 指定了组合框、列表框和按钮等自绘
控件
的窗口句柄;如果自绘的对象为菜单项,则表示包含该菜单项的菜单句柄。 hDC 指定了绘制操作所使用的设备环境。 rcItem 指定了将被绘制的矩形区域。这个矩形区域就是上面hDC的作用范围。系统会自动裁剪组合框、列表框或按钮等
控件
的自绘制区域以外的部分。也就是说rcItem中的坐标点(0,0)指的就是
控件
的左上角。但是系统不裁剪菜单项,所以在绘制菜单项的时候,必须先通过一定的换算得到该菜单项的位置,以保证绘制操作在我们希望的区域中进行。 itemData 对于菜单项,该成员的取值为由CMenu::AppendMenu、CMenu::InsertMenu、CMenu::ModifyMenu等
函数
传递给菜单的值。 对于列表框或这组合框,该成员的取值为由ComboBox::AddString、CComboBox::InsertString、CListBox::AddString或者CListBox::InsertString等
函数
传递给
控件
的值。 如果ctlType 的取值是ODT_BUTTON或者ODT_STATIC,itemData的取值为0。 图5是个相应的例子,它
修改
了按钮的界面: 图8 利用WM_DRAWITEM消息美化界面 实现代码如下: BOOL CUi6Dlg::OnInitDialog() { //… //创建
字体
//CFont CUi1View::m_Font m_Font.CreatePointFont(120, "Impact"); //… } void CUi6Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { if(nIDCtl == IDC_HELLO_CFAN) { //绘制按钮框架 UINT uStyle = DFCS_BUTTONPUSH; //是否按下去了? if (lpDrawItemStruct->itemState & ODS_SELECTED) uStyle |= DFCS_PUSHED; CDC dc; dc.Attach(lpDrawItemStruct->hDC); dc.DrawFrameControl(&lpDrawItemStruct->rcItem, DFC_BUTTON, uStyle); //输出文字 dc.SelectObject(&m_Font); dc.SetTextColor(RGB(0, 0, 255)); dc.SetBkMode(TRANSPARENT); CString sText; m_HelloCFan.GetWindowText(sText); dc.TextOut(lpDrawItemStruct->rcItem.left + 20, lpDrawItemStruct->rcItem.top + 20, sText); //是否得到焦点 if(lpDrawItemStruct->itemState & ODS_FOCUS) { //画虚框 CRect rtFocus = lpDrawItemStruct->rcItem; rtFocus.DeflateRect(3, 3); dc.DrawFocusRect(&rtFocus); } return; } CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); } 别忘了标记Owner draw属性: 图9 指定按钮的Owner draw属性 值得一提的是,CWnd内部截获了WM_DRAWITEM、WM_MEASUREITEM等消息,并映射成子元素的相应虚
函数
的调用,如CButton::DrawItem()。所以,以上例子也可以通过派生出
一个
CButton的派生类,并重载该类的DrawItem()
函数
来实现。使用虚
函数
机制实现界面美化参见3.4章节。 3.3.5 WM_MEASUREITEM 仅仅WM_DRAWITEM还是不够的,对于一些特殊的
控件
,如ListBox,系统在发送WM_DRAWITEM消息前,还发送WM_MEASUREITEM消息,需要你设置ListBox中每个项目的高度。 WM_DRAWITEM的映射
函数
原型如下: afx_msg void OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct ); nIDCtl 该
控件
的ID,如果该元素为菜单,则nIDCtl为0 lpMeasureItemStruct指向MEASUREITEMSTRUCT结构对象的指针,MEASUREITEMSTRUCT的结构定义如下: typedef struct tagMEASUREITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemWidth; UINT itemHeight; DWORD itemData } MEASUREITEMSTRUCT; CtlType指定了
控件
的类型,其取值如表6所示: 类型值 含义 ODT_COMBOBOX 组合框
控件
ODT_LISTBOX 列表框
控件
ODT_MENU 菜单项 表6 CtlType的类型值与含义 CtlID 指定自绘
控件
的ID值,该成员不适用于菜单项 itemID表示菜单项ID,也可以表示可变高度的列表框或组合框中某项的索引值。该成员不适用于固定高度的列表框或组合框。 itemWidth 指定菜单项的宽度 itemHeight指定菜单项或者列表框中某项的的高度,最大值为255 itemData 对于菜单项,该成员的取值为由CMenu::AppendMenu、CMenu::InsertMenu、CMenu::ModifyMenu等
函数
传递给菜单的值。 对于列表框或这组合框,该成员的取值为由ComboBox::AddString、CComboBox::InsertString、CListBox::AddString或者CListBox::InsertString等
函数
传递给
控件
的值。 图示出了OnMeasureItem的效果: 图10 利用WM_MEASUREITEM消息美化界面 相应的OnMeasureItem()实现如下: void CUi7Dlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) { if(nIDCtl == IDC_COLOR_PICKER) { //设定高度为 lpMeasureItemStruct->itemHeight = 30; return; } CDialog::OnMeasureItem(nIDCtl, lpMeasureItemStruct); } 同样别忘了指定列表框的Owner draw属性: 图11 指定下拉框的Owner draw属性 3.3.6 NM_CUSTOMDRAW 大家也许熟悉WM_NOTIFY,
控件
通过WM_NOTIFY向父窗口发送消息。在WM_NOTIFY消息体中,部分
控件
会发送NM_CUSTOMDRAW告诉父窗口自己需要绘图。 可以反射NM_CUSTOMDRAW消息,如: ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) afx_msg void OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult); 参数: pNMHDR 说到底只是
一个
指针,大多数情况下它指向
一个
NMHDR结构对象,NMHDR结构如下: typedef struct tagNMHDR { HWND hwndFrom; UINT idFrom; UINT code; } NMHDR; 其中: hwndFrom 发送方
控件
的窗口句柄 idFrom 发送方
控件
的ID code 通知代码 对于某些
控件
来说,pNMHDR则会解释成其它内容更丰富的结构对象的指针,如:对于列表
控件
来说,pNMHDR常常指向
一个
NMCUSTOMDRAW对象,NMCUSTOMDRAW结构如下: typedef struct tagNMCUSTOMDRAWINFO { NMHDR hdr; DWORD dwDrawStage; HDC hdc; RECT rc; DWORD dwItemSpec; UINT uItemState; LPARAM lItemlParam; } NMCUSTOMDRAW, FAR * LPNMCUSTOMDRAW; hdr NMHDR对象 dwDrawStage 当前绘制状态,其取值如表7所示: 类型值 含义 CDDS_POSTERASE 擦除循环结束 CDDS_POSTPAINT 绘制循环结束 CDDS_PREERASE 准备开始擦除循环 CDDS_PREPAINT 准备开始绘制循环 CDDS_ITEM 指定dwItemSpec, uItemState, lItemlParam参数有效 CDDS_ITEMPOSTERASE 列表项擦除结束 CDDS_ITEMPOSTPAINT 列表项绘制结束 CDDS_ITEMPREERASE 准备开始列表项擦除 CDDS_ITEMPREPAINT 准备开始列表项绘制 CDDS_SUBITEM 指定列表子项 表7 dwDrawStage的类型值与含义 hdc指定了绘制操作所使用的设备环境。 rc指定了将被绘制的矩形区域。 dwItemSpec 列表项的索引 uItemState 当前列表项的状态,其取值如表8所示: 类型值 含义 CDIS_CHECKED 标记状态。 CDIS_DEFAULT 默认状态。 CDIS_DISABLED 禁止状态。 CDIS_FOCUS 焦点状态。 CDIS_GRAYED 灰化状态。 CDIS_SELECTED 选中状态。 CDIS_HOTLIGHT 热点状态。 CDIS_INDETERMINATE 不定状态。 CDIS_MARKED 标注状态。 表8 uItemState的类型值与含义 lItemlParam 当前列表项的绑定数据 pResult 指向状态值的指针,指定系统后续操作,依赖于dwDrawStage: 当dwDrawStage为CDDS_PREPAINT,pResult含义如表9所示: 类型值 含义 CDRF_DODEFAULT 默认操作,即系统在列表项绘制循环过程不再发送NM_CUSTOMDRAW。 CDRF_NOTIFYITEMDRAW 指定列表项绘制前后发送消息。 CDRF_NOTIFYPOSTERASE 列表项擦除结束时发送消息。 CDRF_NOTIFYPOSTPAINT 列表项绘制结束时发送消息。 表9 pResult的类型值与含义(一) 当dwDrawStage为CDDS_ITEMPREPAINT,pResult含义如表10所示: 类型值 含义 CDRF_NEWFONT 指定后续操作采用应用中指定的新
字体
。 CDRF_NOTIFYSUBITEMDRAW 列表子项绘制时发送消息。 CDRF_SKIPDEFAULT 系统不必再绘制该子项。 表10 pResult的类型值与含义(二) 以下是
一个
利用NM_CUSTOMDRAW消息绘制出的多色列表框的例子: 图12 利用NM_CUSTOMDRAW消息美化界面 对应代码如下: void CCoolList::OnCustomDraw(NMHDR *pNMHDR, LRESULT *pResult) { //类型安全转换 NMLVCUSTOMDRAW* pLVCD = reinterpret_cast
(pNMHDR); *pResult = 0; //指定列表项绘制前后发送消息 if(CDDS_PREPAINT == pLVCD->nmcd.dwDrawStage) { *pResult = CDRF_NOTIFYITEMDRAW; } else if(CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage) { //奇数行 if(pLVCD->nmcd.dwItemSpec % 2) pLVCD->clrTextBk = RGB(255, 255, 128); //偶数行 else pLVCD->clrTextBk = RGB(128, 255, 255); //继续 *pResult = CDRF_DODEFAULT; } } 注意到上例采取了3.1所推荐的第2种实现方法,派生了
一个
新类CCoolList。 3.4 使用MFC类的虚
函数
机制
修改
Windows界面,除了从Windows消息机制下功夫,也可以从MFC类下功夫,这应该得益于类的虚
函数
机制。为了防止诸如“面向对象技术”等术语在此泛滥,以下仅举一段代码作为例子: void CView::OnPaint() { // standard paint routine CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); } 这是MFC中viewcore.cpp中的源代码,很多读者总不明白OnDraw()和OnPaint()之间的关系,从以上的代码中很容易看出,CView的WM_PAINT消息响应
函数
OnPaint()会自动调用CView::OnDraw()。而作为开发者的用户,可以通过简单的OnDraw()的重载实现对WM_PAINT的处理。所以说,对MFC类的虚
函数
的重载是对消息机制的扩展。 以下列出了与界面美化相关的虚
函数
,参数说明略去: CButton::DrawItem CCheckListBox::DrawItem CComboBox::DrawItem CHeaderCtrl::DrawItem CListBox::DrawItem CMenu::DrawItem CStatusBar::DrawItem CStatusBarCtrl::DrawItem CTabCtrl::DrawItem virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ); Owner draw元素自绘
函数
很显然,位图菜单都是通过这个DrawItem画出来的。限于篇幅,在此不再附以例程。
Delphi
5,379
社区成员
262,722
社区内容
发帖
与我相关
我的任务
Delphi
Delphi 开发及应用
复制链接
扫一扫
分享
社区描述
Delphi 开发及应用
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章