delphi透明組件(控件)開發

我的blog開通了:)。今天就談談我最近寫透明組件(透明控件)的dd吧。

網友提供的方法:

/////////////////////////////////////////////
透明的控件, 一般繼承自TGraphicControl的
(就是那些沒有handle屬性, 不能有focus的控件, 如image)
都有Transparent屬性. 對TWinControl類的控件, 要實現透明只要完成以下
四步基本上就成了.
1.在Create中設定ControlStyle :=
ControlStyle - [csOpaque];)
2. override 它的CreateParams方法, exstyle 里加上WS_EX_TRANSPARENT.
3. 修改它的parent的window style, 去掉WS_CLIPCHILDREN.
  inherited CreateParams(Params);
  with Params do
  begin
  { 完全重畫 }
    Style := Style and not WS_CLIPCHILDREN;
    Style := Style and not WS_CLIPSIBLINGS;
  { 增加透明 }
    ExStyle := ExStyle or WS_EX_TRANSPARENT;
  end;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


4. 截獲WM_ERASEBKGND, 什麼都不做直接返回1.(不搽除背景)
一般有上面3步能成. 有些控件比如TPanel, 在它的paint中用了fillrect,
所以要實現透明的話還要override 它的paint方法, 自己畫.
按鈕透明需要進一步處理.
createparams里加上style := style or BS_OWNERDRAW;
然後在WM_DRAWITEM中自己畫吧
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


我的研究發現    Style := Style and not WS_CLIPCHILDREN;
    Style := Style and not WS_CLIPSIBLINGS;
沒有作用。
如果你要改變控件位置和顏色,請攔截WM_MOVE,和CN_CTLCOLOREDIT消息,在裏面調用invalidate方法,重繪組件。

閱讀inside vcl 和 飛思的組件開發書籍。瞭解如何選擇適當的基類去繼承然後擴展成自己的類。建議寫控件的朋友應先了解這方面的知識,不要從tobject開始寫起。ControlStyle :=ControlStyle - [csOpaque];)很關鍵,看源代碼發現它影響了整個控件的畫方法。現在已經實現了透明組件,可是用鼠標移動該組件就出現刷新不夠,背景混亂的問題。現在正在閱讀timage源代碼,看它是如何實現。想討論這方面技術的朋友請email:[email protected]

 

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