自行实现透明的控件如Panel GroupBox(使用不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT属性)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自行实现透明的控件如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

以上是关于自行实现透明的控件如Panel GroupBox(使用不需要重绘父控件的效果,一切都因为窗口有了WS_EX_TRANSPARENT属性)的主要内容,如果未能解决你的问题,请参考以下文章

扩展GroupBox控件

vb.net入门之分组控件:GroupBox控件

VB中Panel和GroupBox区别

Panel控件的使用

VC的GroupBox控件

2016.5.30实现透明Panel及控件置顶的方法