对于 VCLSkin的使用网上的文章并不多,害的我在这次客户突如其来的对界面的无理要求中手足无措。
其实 VCLSkin是个使用很简单,强大,皮肤繁多的控件。可以满足C++builder以及Delphi的日常开发使用。
但是,天有不测风云,总是有那么种需求是不会那么顺利完成的,好,我现在说说我的问题:
由于用C++Builder制作了一个视频浏览的OCX,用网页加载。可用户觉得界面难看之极,需要和网站的风格统一,
这却是个说大不大,但却很麻烦的需求,我可不想一个一个的去修改控件风格,那简直就是不折不扣的体力劳动。
于是想到了VCLSkin控件,但是我需要将子Form停靠在父窗体的panel中(一般ocx的做法)可使用中发现,在ocx中不论是将控件加载在ActiveXFrom1界面上,还是在之后自己新new出来的Form中,都无法显示出来皮肤的效果。
按照帮助中说的:
对于嵌入窗体VCLSkin不会自动换肤,需要增加skindata1->AddNestForm(this,form2);//可不论怎么更换都没有丝毫作用
其实对于panel停靠的窗体来说,VCLSkin已经丢失了句柄,自然之后的窗体也不会顺利的贴上皮肤。
真正有用的做法是,在子Form中使用VCLSkin对象,
并在Form中:
Form::FormCreate()
{
skindata1->skinform((int)Form->Handle)//强制给这个窗体换肤
}
这还不够,在这个过程中只能看到界面的背景变化了,但是其他控件却安然没有动。
这个时候还有关键一步:
在父窗体中new出子窗体的同时,需要使用同一个skindata对象,来对父窗体进行强行换肤。
如下:
ActiveXFrom::ActiveXFrom1Create()
{
Form2 = new TForm2(this);//一定要把主窗体句柄传入,否则什么换肤效果也没有
Form2 ->skindata1->skinform((int)ActiveXFrom1->Handle)//强行为父窗体换肤
}
再次运行程序,发现丛里到外皮肤已经完美的更换好了!!!!