對於 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)//強行爲父窗體換膚
}
再次運行程序,發現叢裏到外皮膚已經完美的更換好了!!!!