zoukankan      html  css  js  c++  java
  • 自定义圆角矩形控件

    构造函数里设置相应的style,并将背景色设为透明

    this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    this.SetStyle(ControlStyles.ResizeRedraw, true);
    this.SetStyle(ControlStyles.UserPaint, true);
    this.BackColor = Color.Transparent;
    

    在OnSizeChanged中添加标记,改变全局变量_path

            protected override void OnSizeChanged(EventArgs e)
            {
                base.OnSizeChanged(e);
    
                _isSizeChanged = true;
            }
    

    在OnPaint绘制边线

            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                if (_isSizeChanged)
                {
                    updateRegion();
                    _isSizeChanged = false;
                }
    
                Graphics g = e.Graphics;
                g.SmoothingMode = SmoothingMode.AntiAlias;
    
                g.FillPath(Brushes.White, _path);
                g.DrawPath(_penBorderline, _path);
            }
    

    辅助函数,用来更新path

            private void updateRegion()
            {
                int x = 0;
                int y = 0;
                int width = this.Width - 1;  //这里需要-1,不然会超出边界
                int height = this.Height - 1;   //这里需要-1,不然会超出边界
                int roundRadius = _roundRadius;
                _path = new GraphicsPath();//这里用来清空前面保存的_path
    
                if (roundRadius > 0)
                {
                    _path.AddArc(x, y, roundRadius, roundRadius, 180, 90);                                 // 左上角
                    _path.AddArc(width - roundRadius, y, roundRadius, roundRadius, 270, 90);                 // 右上角
                    _path.AddArc(width - roundRadius, height - roundRadius, roundRadius, roundRadius, 0, 90);  // 右下角
                    _path.AddArc(x, height - roundRadius, roundRadius, roundRadius, 90, 90);                 // 左下角
                }
                else
                {
                    _path.AddLine(x + roundRadius, y, width - roundRadius, y);                         // 顶端
                    _path.AddLine(width, y + roundRadius, width, height - roundRadius);        // 右边
                    _path.AddLine(width - roundRadius, height, x + roundRadius, height);       // 底边
                    _path.AddLine(x, y + roundRadius, x, height - roundRadius);                        // 左边;
                }
    
                _path.CloseAllFigures();
            }
    

    全局变量

            bool _isSizeChanged = false;
    
            GraphicsPath _path;
            int _roundRadius = 50;
            Pen _penBorderline = new Pen(Color.Black);
    
  • 相关阅读:
    oracle性能调优
    oracle常用函数
    plsql的安装与使用
    WSAIoctl
    SQL中大概有这么几种JOIN
    如何取分组最大值记录
    having
    MSSQL—按照某一列分组后取前N条记录
    sql之left join、right join、inner join的区别
    delphi 接收心跳包怎么写
  • 原文地址:https://www.cnblogs.com/YYi_H/p/2159251.html
Copyright © 2011-2022 走看看