自行實現透明的控件如Panel GroupBox(使用不需要重繪父控件的效果,一切都因為窗口有了WS_EX_TRANSPARENT屬性)


CSDN的Blog開通了。我想這里的Blog作為今后自己回答別人問題的時候,收藏答案的地方很不錯呢。

因為社區的貼子早晚都會沉下去,查找起來很不方便,甚至再也找不到呢。

Q: http://community.csdn.net/Expert/TopicView.asp?id=3106090

言歸正傳,要實現一些標准的容器類控件的透明效果,也許是個經常會想到的問題。事實上在2000以上的系統下實現起來相當容易。

你不需要重繪父控件的效果,一切都因為窗口有了WS_EX_TRANSPARENT的屬性可以選擇。

下面我們就以TPanel和TGroupBox控件來說明。我們從它們繼承兩個新的控件,TTransPanel和TTransGroupBox。


 

 

class TTransPanel :public TPanel
{
  void __fastcall CreateParams(Controls::TCreateParams &Params)
  {
    TPanel::CreateParams(Params);
    Params.ExStyle += WS_EX_TRANSPARENT;
  }
  void __fastcall AdjustColors(TPanelBevel Bevel,TColor& TopColor,TColor& BottomColor)
  {
    TopColor = clBtnHighlight;
    if (Bevel == bvLowered) TopColor = clBtnShadow;
    BottomColor = clBtnShadow;
    if (Bevel == bvLowered) BottomColor = clBtnHighlight;
  }
  void __fastcall Paint()
  {
    DynamicArray<int> Alignments;
    Alignments.set_length(3);
    Alignments[taLeftJustify] = DT_LEFT;
    Alignments[taCenter] = DT_CENTER;
    Alignments[taRightJustify] = DT_RIGHT;
    TRect Rect;
    TColor TopColor, BottomColor;
    int FontHeight;
    Longint Flags;
    Rect = GetClientRect();
    if (BevelOuter != bvNone)
    {
      AdjustColors(BevelOuter,TopColor, BottomColor);
      Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
    }
    Frame3D(Canvas, Rect, Color, Color, BorderWidth);
    if (BevelInner != bvNone)
    {
      AdjustColors(BevelInner,TopColor, BottomColor);
      Frame3D(Canvas, Rect, TopColor, BottomColor, BevelWidth);
    }
    Canvas->Brush->Color = Color;
//    Canvas->FillRect(Rect); 注釋掉這一句,就透明了。下面的bsClear保證寫Caption的不使用底色。
    
Canvas->Brush->Style = bsClear;
    Canvas->Font = this->Font;
    FontHeight = Canvas->TextHeight('W');

    Rect.Top = ((Rect.Bottom + Rect.Top) - FontHeight) / 2;
    Rect.Bottom = Rect.Top + FontHeight;
    Flags = DT_EXPANDTABS | DT_VCENTER | Alignments[Alignment];
    Flags = DrawTextBiDiModeFlags(Flags);
    DrawText(Canvas->Handle, Caption.c_str(), -1, &Rect, Flags);
  }
public:
  __fastcall virtual TTransPanel(TComponent* AOwner):TPanel(AOwner)
  {
    ControlStyle >> csOpaque;
    Width  = 185;
    Height = 41;
  }
};

 

https://blog.csdn.net/cker/article/details/24110


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM