使用DevExpress控件,缺省有三个皮肤:Blue、Black、Silver,能看到三种效果,不错。
然后,就没有然后了,无论怎样改皮肤名称,在设计状态下能看到期望状态,但运行时还是只有这三种状态。
分析原因,应该是自己生成的可执行程序下,没有皮肤资源内容。
先找皮肤资源内容,这个很容易就找到了,在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的源码(skins的source目录中)中去找相印的包。
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皮肤
核心的代码已贴出,如果有什么疑问,欢迎随时沟通交流。
怎一个爽字了得!!