您的位置:首页 > 其它

自行实现透明的控件如Panel GroupBox

2004-06-23 16:38 393 查看
CSDN的Blog开通了。我想这里的Blog作为今后自己回答别人问题的时候,收藏答案的地方很不错呢。

因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢。

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

言归正传,要实现一些标准的容器类控件的透明效果,也许是个经常会想到的问题。事实上在2000以上的系统下实现起来相当容易。

你不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT的属性可以选择。



下面我们就以TPanel和TGroupBox控件来说明。我们从它们继承两个新的控件,TTransPanel和TTransGroupBox。
[code]classTTransGroupBox:publicTGroupBox
{
void__fastcallCreateParams(Controls::TCreateParams&Params)
{
TGroupBox::CreateParams(Params);
Params.ExStyle+=WS_EX_TRANSPARENT;
}
void__fastcallAdjustColors(TPanelBevelBevel,TColor&TopColor,TColor&BottomColor)
{
TopColor=clBtnHighlight;
if(Bevel==bvLowered)TopColor=clBtnShadow;
BottomColor=clBtnShadow;
if(Bevel==bvLowered)BottomColor=clBtnHighlight;
}
void__fastcallPaint()
{
intH;
TRectR;
LongintFlags;
Canvas->Font=this->Font;
H=Canvas->TextHeight('0');
R=Rect(0,H/2-1,Width,Height);
if(Ctl3D)
{
R.Left++;
R.Top++;
Canvas->Brush->Color=clBtnHighlight;
Canvas->FrameRect(R);
OffsetRect(R,-1,-1);
Canvas->Brush->Color=clBtnShadow;
}
else
Canvas->Brush->Color=clWindowFrame;
Canvas->FrameRect(R);
if(Text!="")
{
if(!UseRightToLeftAlignment())
R=Rect(8,0,0,H);
else
R=Rect(R.Right-Canvas->TextWidth(Text)-8,0,0,H);
Flags=DrawTextBiDiModeFlags(DT_SINGLELINE);
DrawText(Canvas->Handle,Text.c_str(),Text.Length(),&R,Flags|DT_CALCRECT);
Canvas->Brush->Color=Color;
Canvas->Brush->Style=bsClear;
DrawText(Canvas->Handle,Text.c_str(),Text.Length(),&R,Flags);
}
}
public:
__fastcallvirtualTTransGroupBox(TComponent*AOwner):TGroupBox(AOwner)
{
ControlStyle>>csOpaque;
Width=185;
Height=105;
}
};


classTTransPanel:publicTPanel
{
void__fastcallCreateParams(Controls::TCreateParams&Params)
{
TPanel::CreateParams(Params);
Params.ExStyle+=WS_EX_TRANSPARENT;
}
void__fastcallAdjustColors(TPanelBevelBevel,TColor&TopColor,TColor&BottomColor)
{
TopColor=clBtnHighlight;
if(Bevel==bvLowered)TopColor=clBtnShadow;
BottomColor=clBtnShadow;
if(Bevel==bvLowered)BottomColor=clBtnHighlight;
}
void__fastcallPaint()
{
DynamicArray<int>Alignments;
Alignments.set_length(3);
Alignments[taLeftJustify]=DT_LEFT;
Alignments[taCenter]=DT_CENTER;
Alignments[taRightJustify]=DT_RIGHT;
TRectRect;
TColorTopColor,BottomColor;
intFontHeight;
LongintFlags;
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;
Flags=DrawTextBiDiModeFlags(Flags);
DrawText(Canvas->Handle,Caption.c_str(),-1,&Rect,Flags);
}
public:
__fastcallvirtualTTransPanel(TComponent*AOwner):TPanel(AOwner)
{
ControlStyle>>csOpaque;
Width=185;
Height=41;
}
};


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: