AlphaControls是一套Delphi下的优秀的皮肤vcl控件。几年前,一般用得比较多的是vclskin,使用很方便,可惜这套2010年已经停止维护了。后来就看到更多的人开始推崇AlphaControls,即能让别家的控件激活皮肤效果,也可以只使用AlphaControls的控件。

为了方便自动编译、避免异地安装控件的麻烦和日后维护的方便,我们一般是把这个控件选定版本的源码放在项目源码中,通过动态创建的方式来使用这套vcl控件。

比如在delphi项目的源码目录src中,增加一个third目录存放第三方vcl控件,把AlphaControls的源码放到 src/third/ac目录下。在delphi项目的搜索路径中增加./third/ac,即可。

动态创建的代码:

skin := TsSkinManager.Create(self);  //创建皮肤管理器对象
skin.SkinDirectory := extractfilepath(application.ExeName)+'skins\'; //设置皮肤文件目录
skin.SkinName := skinfilename; //指定皮肤
skin.ExtendedBorders := true;
skin.IsDefault := true;
skin.SkinnedPopups := true;
skin.SkinningRules :=[srStdForms, srStdDialogs, srThirdParty]; // 皮肤使用规则
skin.Active := true; // 激活皮肤

好了,运行后发现空白窗体的皮肤效果已经出来了。但增加了TMemo等控件后,发现这些控件并没有被影响,还是原生界面。因为缺省除AlphaControls提供的同类控件外,其它的控件都属于第三方控件,得单独处理才能有皮肤效果。

再增加以下代码:

//  with skin.ThirdLists[ord(tpEdit)] do
// begin
// Add('TEdit');
// Add('TMemo');
// Add('TListBox');
// Add('TCheckListBox');
// Add('TRichEdit');
// Add('TDateTimePicker');
// end;
// with skin.ThirdLists[ord(tpButton)] do
// begin
// Add('TButton');
// end;
// with skin.ThirdLists[ord(tpBitBtn)] do
// begin
// Add('TBitBtn');
// end;
// with skin.ThirdLists[ord(tpCheckBox)] do
// begin
// Add('TCheckBox');
// Add('TRadioButton');
// Add('TGroupButton');
// end;
// with skin.ThirdLists[ord(tpGroupBox)] do
// begin
// Add('TGroupBox');
// Add('TRadioGroup');
// end;
// with skin.ThirdLists[ord(tpPanel)] do
// begin
// Add('TPanel');
// end;
// with skin.ThirdLists[ord(tpComboBox)] do
// begin
// Add('TComboBox');
// Add('TColorBox');
// end;
// with skin.ThirdLists[ord(tpPageControl)] do
// begin
// Add('TPageControl');
// end;
// with skin.ThirdLists[ord(tpTabControl)] do
// begin
// Add('TTabControl');
// end;
// with skin.ThirdLists[ord(tpStatusBar)] do
// begin
// Add('TStatusBar');
// end;
// with skin.ThirdLists[ord(tpVirtualTree)] do
// begin
// Add('TVirtualStringTree');
// end;
// with skin.ThirdLists[ord(tpUpDownBtn)] do
// begin
// Add('TUpDown');
// end;
// with skin.ThirdLists[ord(tpSpeedButton)] do
// begin
// Add('TSpeedButton');
// end;

注意,要查看效果请先去掉代码前的注释符号,这样,常用的Delphi控件就都会有皮肤效果了。

可能会注意到上面的代码都被注释掉了,因为我们其实可以更方便让通用第三方控件(对AlphaControls来说)自动具有皮肤效果。

把上面的支持第三方控件的代码去掉,找到./third/ac目录下的sDefs.inc文件,在

// << 3rdparty support start <<

后增加一行:

{$DEFINE RUNIDEONLY}

保存后,重新编译,就会发现其实Delphi自带的控件就已经具有皮肤效果了。

当然,非官方的控件,还是需要通过类似上面的代码自己分类添加才会有效果。比如TVirtualStringTree,就得增加代码:

with skin.ThirdLists[ord(tpVirtualTree)] do
begin
Add('TVirtualStringTree');
end;

对于一些特殊的控件包,比如TntControls、DevExpress等,可以通过sDefs.inc进行设置进行支持。

delphi里动态创建AlphaControls实现换肤的更多相关文章

  1. Delphi中动态创建窗体有四种方式

    Delphi中动态创建窗体有四种方式,最好的方式如下: 比如在第一个窗体中调用每二个,主为第一个,第二个设为动态创建 Uses Unit2; //引用单元文件 procedure TForm1.But ...

  2. 在DELPHI中动态创建控件以及控件的事件

    在DELPHI中我们经常要动态的创建控件以及控件的事件.例如,我们可能想根据程序需要动态的创建一些Tshape组件来创建某个图形,并使得在鼠标移动上去之后可以完成某些操作.这一般需要需要三步: 生成一 ...

  3. 实例讲解如何在Delphi中动态创建dxBarManager内容

    一.dxBarManager中一些非常重要的概念: TCategorys:为了方便对dxBarManager中的项目进行归类而设计的一个属性,当然,只使用默认的名字为Default的Category也 ...

  4. delphi dom动态创建节点方法

    在一次测试demo中 需要动态的创建xml节点并添加,实现方法如下: var NewItem:IXMLDOMElement; NewItem:=ConfigDoc.createElement('ite ...

  5. 在toolbar里动态创建多个button(ext.net)

    private void setOneMenu() { string sql = "select id,name,gids from Config where name<>'高级 ...

  6. Delphi 中 动态创建的Panel无法改变颜色的解决办法

    刚开始代码如下: procedure TForm1.Button1Click(Sender: TObject); var Panel: TPanel; begin Panel := TPanel.Cr ...

  7. Delphi中动态创建的Panel无法改变颜色的解决办法(要把Panel的ParentBackground设为False)

    刚开始代码如下: procedure TForm1.Button1Click(Sender: TObject); var Panel: TPanel; begin Panel := TPanel.Cr ...

  8. js实现换肤效果

    一,js换肤的基本原理 基本原理很简单,就是使用 JS 切换对应的 CSS 样式表文件.例如导航网站 Hao123 的右上方就有网页换肤功能.除了切换 CSS 样式表文件之外,通常的网页换肤还需要通过 ...

  9. VC++ 动态创建单个工具条,并加载外部的位图(bmp)文件为工具栏图像

    步骤: 1, 在框架类CMainFrame头文件里,增加图像变量和工具条变量. CMFCToolBarImages m_UserImages; CMFCToolBar m_wndToolBar; 2, ...

随机推荐

  1. JS与树本(复杂)

    <!DOCTYPE html><html><head> <meta charset="UTF-8"> <title>树形 ...

  2. ES5——函数,对象,方法,this

    JS由表达式和语句组成 表达式:计算出一个值,但并不进行任何操作,不改变计算机运行状态 语句:包括 声明语句,赋值语句,控制结构 函数,对象,方法,this 数组和对象:是两个非常重要的数据类型 函数 ...

  3. php 二维数组排序

    usort($info ,function($a,$b){ $a1 = $a['score']; $b1 = $b['score']; if($a1 == $b1) return 0; return ...

  4. C# WebForm内置对象2+Repeater的Command

    内置对象:用于页面之间的数据交互 为什么要使用这么内置对象?因为HTTP的无状态性. Session:在计算机中,尤其是在网络应用中,称为“会话控制”.Session 对象存储特定用户会话所需的属性及 ...

  5. category - junit用例分组执行

    一.category 和 testSuite的比较 (1)testSuite是类级分组(xx.class) (2)category是用例级分组(@Test) (3)category是testSuite ...

  6. JS实现 点击button(copy) 复制对应的网址——类似于复制推广链接

    <form action=""> <input type="text" class="share-input" value ...

  7. struts2+spring+hibernte整合示例

    简单实现添加用户功能,仅供初学者参考,可自行扩展程序功能(增删改查). 这里贴下代码,需要的可以下载看(因为比较懒). applicationContext.xml <?xml version= ...

  8. 告别IT,出售多年自己研发的股票分析系统源码

    不知已过而立,发狠告别IT,回头看看以前自己的多个作品,耗时最多的就是这个股票分析系统了,留在自己的电脑里也体现不出多大价值了,故打算出售源码给需要的人,联系方式QQ:874724605 注明:股票源 ...

  9. windbg无法下载符号文件

    symbol file path: srv*d:\symbolslocal*http://msdl.microsoft.com/download/symbols 即使设置是对的,但我用.reload, ...

  10. flex上下固定中间滚动布局

    传统 pc 端中,子容器高度超出父容器高度,通常使用 overflow:auto 可出现滚动条拖动显示溢出的内容,而移动web开发中,由于浏览器厂商的系统不同.版本不同,导致有部分机型不支持对弹性滚动 ...