自行实现透明的控件如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。
因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢。
Q:
言归正传,要实现一些标准的容器类控件的透明效果,也许是个经常会想到的问题。事实上在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; } };
相关文章推荐
- 【转】自行实现透明的控件如Panel GroupBox
- C#如何在Panel或者GroupBox控件中自由地切换其他窗体
- 学习Winform分组类控件(Panel、groupBox、TabControl)
- C#控件 GroupBox和Panel的区别
- 容器里panel控件和groupBox控件的区别
- C#用了皮肤后,Panel和GroupBox 容器背景透明
- Winform重写CreateParams实现控件的透明显示(Panel为例)
- 我想在透明的panel里滚动文本! 主要是想透明滚动,看到下面的控件! 怎样实现!
- mfc static,checkbox,groupbox,redio 控件透明
- pushbutton成为可点击的图标(实现全透明,不论点击与否都只显示Icon)(也就是一个万能控件)
- winform groupbox控件放到窗体中间位置
- MFC-combox和listbox、radio button、group box等控件及onTimer函数的应用
- MFC实现背景透明,控件不透明的对话框,且点击图片有事件响应
- Kotlin 第一弹:自定义 ViewGroup 实现流式标签控件
- UpdatePanel控件的使用(实现局部刷新,ajax)
- C#怎样实现窗体透明而控件不透明,或者就是怎样无窗体显示图片,就像圣诞那样的程序,不吝赐教!
- 循序渐进实现仿QQ界面(五):半透明窗体与不透明控件
- ASP.NET AJAX UpdatePanel 控件实现剖析
- Windows Mobile实现透明控件
- panel 与treeview控件的结合实现tablecontrol功能