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

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

AR highlight ner alignment 重繪 == 答案 nsh none

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

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