【转】自行实现透明的控件如Panel GroupBox
2012-07-21 12:08
330 查看
CSDN的Blog开通了。我想这里的Blog作为今后自己回答别人问题的时候,收藏答案的地方很不错呢。
因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢。
Q: http://community.csdn.net/Expert/TopicView.asp?id=3106090
言归正传,要实现一些标准的容器类控件的透明效果,也许是个经常会想到的问题。事实上在2000以上的系统下实现起来相当容易。
你不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT的属性可以选择。
下面我们就以TPanel和TGroupBox控件来说明。我们从它们继承两个新的控件,TTransPanel和TTransGroupBox。
原文地址:/article/2692874.html
因为社区的贴子早晚都会沉下去,查找起来很不方便,甚至再也找不到呢。
Q: http://community.csdn.net/Expert/TopicView.asp?id=3106090
言归正传,要实现一些标准的容器类控件的透明效果,也许是个经常会想到的问题。事实上在2000以上的系统下实现起来相当容易。
你不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT的属性可以选择。
下面我们就以TPanel和TGroupBox控件来说明。我们从它们继承两个新的控件,TTransPanel和TTransGroupBox。
[code]class TTransGroupBox :public TGroupBox { void __fastcall CreateParams(Controls::TCreateParams &Params) { TGroupBox::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() { int H; TRect R; Longint Flags; 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: __fastcall virtual TTransGroupBox(TComponent* AOwner):TGroupBox(AOwner) { ControlStyle >> csOpaque; Width = 185; Height = 105; } };
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; } };
原文地址:/article/2692874.html
相关文章推荐
- 自行实现透明的控件如Panel GroupBox
- C#如何在Panel或者GroupBox控件中自由地切换其他窗体
- 容器里panel控件和groupBox控件的区别
- C#控件 GroupBox和Panel的区别
- 我想在透明的panel里滚动文本! 主要是想透明滚动,看到下面的控件! 怎样实现!
- Winform重写CreateParams实现控件的透明显示(Panel为例)
- mfc static,checkbox,groupbox,redio 控件透明
- C#用了皮肤后,Panel和GroupBox 容器背景透明
- 学习Winform分组类控件(Panel、groupBox、TabControl)
- ScriptManager和UpdatePanel控件实现局部刷新
- (Winform)控件中添加GIF图片以及运用双缓冲使其不闪烁以及背景是gif时使控件(如panel)变透明
- Group Box中的控件都无法显示
- mfc evc CheckBox控件被Group Box控件给遮盖
- MFC透明控件的超级简单实现--发布日期:2008-05-14 00:44
- C++Builder/Delphi中透明Panel及透明窗口的实现方法
- UpdatePanel控件的使用(实现局部刷新,ajax)
- pushbutton成为可点击的图标(实现全透明,不论点击与否都只显示Icon)(也就是一个万能控件)
- C# 使用Panel控件实现在一个窗体中嵌套另一个窗体
- 实现对话框在位图作为背景时的控件透明
- Winform 通过FlowLayoutPanel及自定义的编辑控件,实现快速构建C/S版的编辑表单页面 z