zoukankan      html  css  js  c++  java
  • 自行实现透明的控件如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

  • 相关阅读:
    CentOS7 mysql5.7安装并配置主主同步
    CentOS7 jdk安装
    CentOS7 zabbix安装并实现其它服务器服务监控报警与自动恢复
    CentOS7 SkyWalking APM8.1.0 搭建与项目集成使用
    Centos7 搭建DNS服务器
    mybatis中collection association优化使用及多参数传递
    mysql常用配置注意项与sql优化
    Spring webFlux:坐等spring-boot-starter-data-mysql-reactive
    ElasticSearch 工具类封装(基于ElasticsearchTemplate)
    接口配置有效管理(获取配置文件内容3种常见方式)
  • 原文地址:https://www.cnblogs.com/findumars/p/8877257.html
Copyright © 2011-2022 走看看