DrGraph图形博士

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

DrGraph软件升级:皮肤

使用DevExpress控件,缺省有三个皮肤:BlueBlackSilver,能看到三种效果,不错。
然后,就没有然后了,无论怎样改皮肤名称,在设计状态下能看到期望状态,但运行时还是只有这三种状态。
分析原因,应该是自己生成的可执行程序下,没有皮肤资源内容。
先找皮肤资源内容,这个很容易就找到了,在C:\Users\DrGraph\Documents\DevExpress VCL\ExpressSkins Library目录下


拷贝到目标程序目录下

不行啊,木有效果。

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;

 

 

 

 按此操作,仍不行, 

再找:

 

关于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中选择:SkinNavigationPaneView   SkinExploreBarView 那么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程序员是不是要感谢我一下了,  

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

今天处理皮肤未果,心有不甘,为什么DELPHI可以而CB不行?犯了技术人员的毛病,不做完老是觉得欠欠的。坐在计算机旁边,还是不自觉地继续。
别的办法没有,那就弄个小的程序来试,不就那几个属性嘛,顺序倒倒说不定就OK了。
没想到真有意外收获,在白天的基础上,居然给试出来了。想起了高考作文题,到处挖井都说没水,其实最深的一口井马上就要挖到水了。
 
先看几个结果

Caramel皮肤




SpringTime皮肤
(
哈,顺便发现了QQ截图的一个BUG:如果要截的图在第二个屏幕上,QQ是截不到的。)
这效果,钢钢的。
一共有40种皮肤,太爽了。
 
最后的代码很简单:

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; 

 

 

再发几张图,自己舒服下: 
 
 Money Twins皮肤


Valentine皮肤 

核心的代码已贴出,如果有什么疑问,欢迎随时沟通交流。
怎一个爽字了得!! 

posted on   drgraph  阅读(583)  评论(0编辑  收藏  举报

努力加载评论中...
点击右上角即可分享
微信分享提示