Delphi 完全时尚手册之 Visual Style 篇 (界面不错) 转自http://blog.csdn.net/iseekcode/article/details/4733229
这里先说说两个概念:Theme(主题)和 Visual Style 。Theme 最早出现在 Microsoft Plus! for Windows 95 中,是 Windows 中 Wallpaper、Cursors、Fonts、Sounds 、Icons 等的设置值集合。Visual Style 在 Windows XP 中才被引入,Visual Style 规定了 Contorls 的外观,另外还包括使用这些外观的一套 API 。使用 Visual Style 必须要 ComCtl32.dll 6,而 ComCtl32.dll 6 是不能被分发到以前版本的 Windows 中的,所以只能在 Windows XP 下使用 Visual Style。
Delphi 7 (后面简称 7 吧)对 Visual Style 提供了较好的支持。首先 7 将那个 Menifest 封装成了 VCL - TXPMenifest,另外增加了 UxTheme.pas 单元,里面是对 Visual Style 的一套 API 及其结构、常数等的引用声明(大概有 47 个API 函数),更重要的是 7 还增加一个 Themes.pas 单元,里面是对这套 API 的更进一步的简化和封装,7 下的 Win32 控件对 Visual Style 的支持较 Delphi 6有了很大改观,就是这个单元的功劳。
一般来说要使 7 下编译的程序在 Windows XP 具有 Visual Style ,只需在主窗体上放入 VCL - TXPMenifest 即可,但对于一些非标准或是自画的控件,还是经典的界面。这里就说一下如何用 Themes.pas 中提供的方法使这些控件具有 Visual Style 。
Themes.pas 中只有一个类:TThemeServices 。这个类有一个重要的属性: ThemesEnabled (Boolean 类型),就是判断在当前程序能不能使用 Visual Style ,这个属性只有在程序使用了 TXPMenifest 并且在 Windows XP 下运行并且使用了 Windows XP 的主题(即桌面主题不是 Windows 经典)才为 True ,由于程序要运行在以前版本的 Windows 下,所以你的程序也得提供这个属性为 False 时的处理过程(一般就是原有的处理过程)。还要提一下这个类封装的几个重要函数:DrawEdge 用来画控件边界的,DrawElement 用来画整个界面的,DrawText 用来写字的。这个类还处理了 WM_THEMECHANGED 消息,这样当我们在改变桌面主题后,程序会自动调整外观。再说一下我们最常用到的一个函数(多态函数):GetElementDetails ,这个函数的返回值在上面的几个 DrawXXX 函数中要用到,这个函数的输入值是 24 个枚举类型中的元素,这 24 个枚举类型在 Themes.pas 单元开头定义(从第二个 TThemedButton 开始直到 TThemedWindow)。最后,我们不去直接使用这个类,在 Themes.pas 单元中有一函数:
function ThemeServices: TThemeServices;返回值就是这个类,所以我们直接使用这个方法,7 的 VCL 里都是这样做。
好,下面就来个简单的例子。Delphi 的 TPanel 控件不是标准控件,我们就来在它上面实现一下 Visual Style 。在 Delphi 7 中新建一工程,在主窗体上放入 TXPMenifest ,在 Unit1 单元引用 Themes 单元,在
TForm1 = class(TForm)前面加入下代码(主要是重载 TCustomPanel 的 Paint 方法):
TVSPanel = class(TCustomPanel)
private
//
protected
procedure Paint; override;
public
//
end;重载的 Paint 方法实现如下:
procedure TVSPanel.Paint;
var
Details: TThemedElementDetails;
begin
inherited;
if ThemeServices.ThemesEnabled then
begin
Details := ThemeServices.GetElementDetails(tbPushButtonHot); {这里画个按钮处于 Hot 状态下的样子}
PerformEraseBackground(Self, Canvas.Handle); {擦除画按钮时的背景}
ThemeServices.DrawElement(Canvas.Handle, Details, ClientRect);
ThemeServices.DrawText(Canvas.Handle, Details, Caption, ClientRect,
DT_EXPANDTABS or DT_VCENTER or DT_CENTER or DT_SINGLELINE, 0);
end;
end;TCustomPanel 的改动完成,再就是在主窗体的 Create 事件中实例化 TVSPanel ,代码如下:
procedure TForm1.FormCreate(Sender: TObject);
var
APanel: TVSPanel;
begin
APanel := TVSPanel.Create(Application);
APanel.Left := 100;
APanel.Top := 100;
APanel.Width := 200;
APanel.Height := 30;
APanel.Caption := '具有 Button 风格的 Panel';
APanel.Parent := Self;
end; 好了,运行看看 Visual Style 效果是不是出来了。我的程序里用 THintWindow 做了个浮动窗口并且加上了 Visual Style ,效果还不错,如果再细致点的话,就做出和 Windows XP 下微软拼音输入法那个浮动条完全相同的界面了。
另外,还有几个重要的东西没有提及,比如 Part 和 State ,大家可以查 MSDN ,在 User Interface Design and Development Windows Shell Shell Refrence Visual Styles Refrence 里,也可 Email 与我讨论
Delphi 完全时尚手册之 Visual Style 篇 (界面不错) 转自http://blog.csdn.net/iseekcode/article/details/4733229的更多相关文章
- Delphi 完全时尚手册之 Visual Style 篇
这里先说说两个概念:Theme(主题)和 Visual Style .Theme 最早出现在 Microsoft Plus! for Windows 95 中,是 Windows 中 Wallpape ...
- delphi 解析Json格式(转自:http://blog.csdn.net/jayqiang/article/details/7066824)
SuperObject 是开源的 Delphi 的 JSON 工具包,可生成 JSON 数据以及进行 JSON 解析. unit Unit6; interface uses Windows, Mess ...
- 第二篇 界面开发 (Android学习笔记)
第二篇 界面开发 第5章 探索界面UI元素 ●The Android View Class ●△Widget设计步骤 需要修改三个XML,以及一个class: 1)第一个xml是布局XML文件 ...
- 时尚与深度学习系列:Fashion forward: Forecasting visual style in fashion
https://arxiv.org/pdf/1705.06394.pdf 将深度学习与时尚预测联系在一起,是一个很有趣但是估计结果会没什么成效的话题.因为,时尚预测这一领 ...
- Delphi、C C++、Visual Basic数据类型的对照 转
Delphi.C C++.Visual Basic数据类型的对照 变量类型 Delphi C/C++ Visual Basic 位有符号整数 ShortInt char -- 位无符号整数 Byte ...
- JS魔法堂:不完全国际化&本地化手册 之 理論篇
前言 最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...
- Android样式的开发:Style篇
前面铺垫了那么多,终于要讲到本系列的终篇,整合所有资源,定义成统一的样式.哪些该定义成统一的样式呢?举几个例子吧: 每个页面标题栏的标题基本会有一样的字体大小.颜色.对齐方式.内间距.外间距等,这就可 ...
- Delphi XE5 for android 使用 BITMAP STYLE DESIGNER 改变控件背景
一.BITMAP STYLE DESIGNER 工具集成在IDE开发工具的TOOLS菜单. 使用NEW 新建一个安卓样式.NEW—NEW ANDROID STYLE FOR FIREMONKEY. 这 ...
- DELPHI学习---类和对象(五篇)
Classes and objects(类和对象) 类(或者类类型)定义了一个结构,它包括字段(也称为域).方法和属性:类的实例叫做对象:类的字段.方法和属性被称为它的部件(components)或成 ...
随机推荐
- Windows 安装 Go语言开发环境以及使用
下载安装包 下载地址:http://www.golangtc.com/download 32 位请选择名称中包含 windows-386 的 msi 安装包,64 位请选择名称中包含 windows- ...
- 【AtCoder】ARC091
C - Flip,Flip, and Flip...... 只有一个这一个是反面 只有一行那么除了两边以外都是反面 否则输出\((N - 2)*(M - 2)\) #include <bits/ ...
- 029 RDD Join相关API,以及程序
1.数据集 A表数据: 1 a 2 b 3 c B表数据: 1 aa1 1 aa2 2 bb1 2 bb2 2 bb3 4 dd1 2.join的分类 inner join left outer jo ...
- H5的简介
1.H5的诞生 2.介绍 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML5 是 W3C 与 WHATWG 合作的结果. WHATWG 致力于 web 表单和应用 ...
- linux 安装redis4.0
1.安装redis 第一步:下载redis安装包 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 1 2 3 4 5 6 7 8 9 ...
- HTTPS分析-简单易懂
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
- Android-LayoutAnimation
Android-LayoutAnimation 学习自 <Android开发艺术探索> LayoutAnimation漫谈 LayoutAnimation 也是View动画的一种,作用是为 ...
- codevs 2291 糖果堆
题目描述 Description [Shadow 1]第一题 WJMZBMR买了很多糖果,分成了N堆,排成一列.WJMZBMR说,如果Shadow能迅速求出第L堆到第R堆一共有多少糖果,就把这些糖果都 ...
- 优美的爆搜?KDtree学习
如果给你平面内一些点,让你求距离某一个指定点最近的点,应该怎么办呢? O(n)遍历! 但是,在遍历的过程中,我们发现有一些点是永远无法更新答案的. 如果我们把这些点按照一定顺序整理起来,省略对不必要点 ...
- BZOJ.4514.[SDOI2016]数字配对(费用流SPFA 二分图)
BZOJ 洛谷 \(Solution\) 很显然的建二分图后跑最大费用流,但有个问题是一个数是只能用一次的,这样二分图两部分都有这个数. 那么就用两倍的.如果\(i\)可以向\(j'\)连边,\(j\ ...