关于C++Builder 中使用 VCLSkin 换肤控件的一点心得!在OCX(ActiveX)中的应用。

对于 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)//强行为父窗体换肤

}

再次运行程序,发现丛里到外皮肤已经完美的更换好了!!!!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章