DrGraph软件升级:皮肤

使用DevExpress控件,缺省有三个皮肤:BlueBlackSilver,能看到三种效果,不错。

然后,就没有然后了,无论怎样改皮肤名称,在设计状态下能看到期望状态,但运行时还是只有这三种状态。

分析原因,应该是自己生成的可执行程序下,没有皮肤资源内容。

先找皮肤资源内容,这个很容易就找到了,在C:UsersDrGraphDocumentsDevExpress VCLExpressSkins Library目录下

DrGraph软件升级:皮肤



拷贝到目标程序目录下


不行啊,木有效果。

GOOGLE一下,发现一篇文章:

1.引用Dll皮肤文件

1 Type
 2 procedure SetSkin(skinnam:string);
 3 
 4    
 5 
 6 procedure TFrmMain.SetSkin(skinnam:string);
 7   var
 8   Hinst:THANDLE;
 9   RStream:TResourceStream;
10 begin
11      Hinst:=Loadlibrary('ALLSK.dll');
12      If Hinst=0 Then
13      Exit
14      else
15      begin
16        Rstream:=TResourceStream.Create(Hinst,skinnam,'MYSKIN');
17        dxSkinsUserSkinLoadFromStream(Rstream);
18        dxSkinController1.NativeStyle:=False;
19        dxSkinController1.UseSkins:=True;
20      end;
21 end;
22 
23    
24 
25 procedure TFrmMain.Button1Click(Sender: TObject);
26 begin
27 setskin('Office2007Blue');
28 end;

2.有效减小使用皮肤后软件体积巨大的方法:

一. DELPHI的主菜单: Project -> Modify Skin Options ,弹出Project Skin Options

Editor 对话框,从列表中,只选择: UserSkin这一项,取消Enable skin Support的勾,

点OK退出. (注意:此步骤需DEV40以上版本才有效)

二. 从Dev Express 项下选择dxSkinController控件,添加到工程,设置dxSkinController1的SkinName属性设为:UserSkin ;

三. 代码:(对RES皮肤有效,在程序文件夹里需要先建一个叫Skin的文件夹)

1 procedure TFrmMain.Button1Click(Sender: TObject);
2 var str:string;
3 begin
4    str:='Xmas2008Blue.skinres';  //可自行修改
5    dxSkinsUserSkinLoadFromFile(Trim(ExtractFilePath(Application.ExeName)) + 'skin' + str);
6    dxSkinController1.NativeStyle:=False;
7    dxSkinController1.UseSkins:=True;
8 end;

按此操作,仍不行,DrGraph软件升级:皮肤



再找:


关于DEVExpressSkins的使用心得

最近发现好多网友对DevExpress Skins的使用不太了解所以近日研究了一下,并写出以下心得:

Q:
设计时有风格,运行时没有风格?

A:
这种情况主要是因为没有加单元引用,因为在设计时Skins的包已经被注册到了delphi中所以在设计时可以显示皮肤,但如果没有把单元引用加入到代码中,delphi是不会编译皮肤到你的exe中去的,所以就出现了这种问题.

1.
对皮肤的引用,好像从V36开始dev把每套皮肤单独封成了包,所在在程序中我们只要加入所使用皮肤的单元引用就可以了,例如使用皮肤:Office2007Silver就要加入引用:dxSkinOffice2007Silver,以下我列出所有皮肤引用的单元:dxSkinOffice2007Black, dxSkinOffice2007Blue, dxSkinLiquidSky, dxSkinLondonLiquidSky, dxSkinMcSkin, dxSkinMoneyTwins, dxSkinOffice2007Green, dxSkinOffice2007Pink, dxSkinOffice2007Silver, dxSkinSilver, dxSkinStardust, dxSkinValentine, dxSkinXmas2008Blue, dxSkinBlack, dxSkinBlue, dxSkinCaramel, dxSkinCoffee, dxSkinGlassOceans, dxSkiniMaginary, dxSkinLilian;

另:如果你的程序是
runtime package的话,记得发布时要把相对的bpl加上。

2.
对控件皮肤的引用:以上的皮肤包中只有dev基础控件的皮肤,对于大一点的控件(可选安装的)还要加入相对控的皮肤包的单元引用,例如:使用了ribbon的话就要加入dxSkinsdxRibbonPainter;使用的NavBar就要加入dxSkinsdxNavBar2Painter;使用的pageContorl就要引用dxSkinscxPCPainter;对于这类控件可以到dev的源码(skinssource目录中)中去找相印的包。

Q:Navbar
怎样设置同风格库的选择一起变化?

A:
原来的Navbar有自已的风格,我们只要在它的view styles中选择:SkinNavigationPaneViewSkinExploreBarView那么Navbar就会根据你设的风格改变风格了,两者的区别是前者是outlook风格的(像QQ那样),后者是组风格的(像xp的侧边栏)

Q:Ribbon
怎样设置同风格库的选择一起变化?

A:
这个我想可能是dev的一个bug,它是不根据风格的选择而变化的,要手动的再设置一下它的ColorSchemeName属性:设置与风格库所选的风格同名就好了。

Q:cxSplitter
为什么有时有风格有时没有?

A
:这可能又是一个bug,我研究了一下,在窗体上放一个cxSplitter运行时是有风格的,但什么时候没了呢,是在你右键此控件选splitter editor后就没了,解决方法是删除窗体上的风格库控件,再重新放上一个,注意(Ctrl + X Ctrl + V是不行的,一定要放个新的。如果其它的控件也有此BUG的话可以参照此解决方法(本人还没发现有其它的)



还是不行。网上的解决方案都是
DELPHI的,例子均可编译通过,但换成CB就是不行。

信心还是有的,直到看到DevExpress官方答复:



Sorry, we don't have a C++ equivalent of that code at present. In the meantime, C++Builder doesn't preclude you from including PAS units in your projects. So, we hope there should not be any serious problem in using the existing PAS code.

这叫人情何以堪!暂只能如此了。看还有没有其它办法,要是解决了这个问题,那N多的CB程序员是不是要感谢我一下了,DrGraph软件升级:皮肤

===================================================================================================================

今天处理皮肤未果,心有不甘,为什么DELPHI可以而CB不行?犯了技术人员的毛病,不做完老是觉得欠欠的。坐在计算机旁边,还是不自觉地继续。

别的办法没有,那就弄个小的程序来试,不就那几个属性嘛,顺序倒倒说不定就OK了。

没想到真有意外收获,在白天的基础上,居然给试出来了。想起了高考作文题,到处挖井都说没水,其实最深的一口井马上就要挖到水了。

先看几个结果

DrGraph软件升级:皮肤


Caramel皮肤



DrGraph软件升级:皮肤



DrGraph软件升级:皮肤

SpringTime皮肤

(
哈,顺便发现了QQ截图的一个BUG:如果要截的图在第二个屏幕上,QQ是截不到的。)

这效果,钢钢的。

一共有40种皮肤,太爽了。

DrGraph软件升级:皮肤


最后的代码很简单:


1  SkinController->NativeStyle = false;
2  SkinController->SkinName = "UserSkin";
3  SkinController->UseSkins = true;
4  Ribbon->SupportNonClientDrawing = false;
5  Ribbon->ColorSchemeName = "UserSkin";
6  dxSkinsUserSkinLoadFromFile(THelper::GetApplicationPath() + "\res\Skins\" + colorSchemeName + ".skinres");
7  Ribbon->SupportNonClientDrawing = true;

再发几张图,自己舒服下:

DrGraph软件升级:皮肤

Money Twins皮肤



DrGraph软件升级:皮肤

Valentine皮肤



核心的代码已贴出,如果有什么疑问,欢迎随时沟通交流。

怎一个爽字了得!!

原文链接: https://www.cnblogs.com/drgraph/archive/2013/04/15/3022199.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/84817

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午9:45
下一篇 2023年2月9日 下午9:46

相关推荐