關於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)//強行爲父窗體換膚

}

再次運行程序,發現叢裏到外皮膚已經完美的更換好了!!!!

 

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