zoukankan      html  css  js  c++  java
  • 用GDI+模仿Kaxaml的关闭按钮

    曾经在学习WPF的情况下,用过一个编写XAML的小工具Kaxaml,觉得这个小工具的关闭按钮挺不错的,如下图所示:

    image

    为了练习GDI+,用代码实现了这个效果。虽然可能不是100%很像,但是从学习的角度来数,我觉得还算满意了。

    image

    代码如下:

    首先需要绘制一个关闭按钮,代码如下:

    /// <summary>
    /// 关闭按钮
    /// </summary>
    /// <param name="g"></param>
    private void CloseButton(Graphics g)
    {
        //Point组 绘制关闭按钮的两个叉
        Point[] points = new Point[4];
        //\
        points[0] = new Point(rect.X, rect.Y);
        points[1] = new Point(rect.Bottom, rect.Right);
        g.DrawLine(new Pen(new SolidBrush(ColorTable.CloseLineColor), 2.0f), points[0], points[1]); 
    
        // /
        points[2] = new Point(rect.Right, rect.X);
        points[3] = new Point(rect.X, rect.Bottom);
        g.DrawLine(new Pen(new SolidBrush(ColorTable.CloseLineColor), 2.0f), points[2], points[3]);
    } 

    用专门的一个方法来绘制底纹的圆形图案:

    /// <summary>
        /// 底纹圆
        /// </summary>
        /// <param name="g"></param>
        private void BottomClicle(Graphics g)
        { 
    
              //绘制最底层的圆
               using (LinearGradientBrush linearBrush = new LinearGradientBrush(
                   rect,
                   ColorTable.BottomCircleTopColor,
                   ColorTable.BottomCircleBottmColor,
                   LinearGradientMode.Vertical))
               {
                   g.FillEllipse(linearBrush, rect);
               } 
    
               rect.Inflate(CircleSpace, CircleSpace); 
    
               //绘制中间层的矩形
               SolidBrush solidBrush = new SolidBrush(ColorTable.MiddleCircleColor);
              g.FillEllipse(solidBrush, rect);
        }

    相应Paint事件:

    Graphics g = e.Graphics;
        g.SmoothingMode = SmoothingMode.HighQuality;
    
        //指定绘制矩形的大小
         rect = ClientRectangle;
        rect.Inflate(CircleSpace, CircleSpace);
        BottomClicle(g);
    
        //缩小4个像素 确定最上层的关闭按钮的区域
         rect.Inflate(CloseSpace + CircleSpace, CloseSpace + CircleSpace);
        CloseButton(g);

    MouseLeave事件:

    private void CloseButtonEx_MouseLeave(object sender, EventArgs e)
       {
        Invalidate();//强制刷新
       }
    另外几个鼠标事件:
    private void CloseButtonEx_MouseDown(object sender, MouseEventArgs e) 
     { 
               rect = ClientRectangle; 
               rect.Inflate(-6, -6);
    
               Graphics g = this.CreateGraphics(); 
               g.SmoothingMode = SmoothingMode.HighQuality;
    
               Color hoverColor = ColorTable.CloseHover; 
               SolidBrush solidBrush = new SolidBrush(hoverColor); 
               g.FillEllipse(solidBrush, rect);
    
               rect = ClientRectangle; 
               rect.Inflate(-10, -10); 
               Point loca = rect.Location; 
               rect.Location = new Point(loca.X + 1, loca.Y + 1); 
               CloseButton(g); 
       }
    
       private void CloseButtonEx_MouseUp(object sender, MouseEventArgs e) 
       { 
            Invalidate(); 
       }
    
       private void CloseButtonEx_MouseHover(object sender, EventArgs e) 
       { 
               rect = ClientRectangle; 
               rect.Inflate(-6, -6);
    
               Graphics g = this.CreateGraphics(); 
               g.SmoothingMode = SmoothingMode.HighQuality;
    
               Color hoverColor = ColorTable.CloseHover; 
               SolidBrush solidBrush = new SolidBrush(hoverColor);
    
               g.FillEllipse(solidBrush, rect); 
               Update(); 
       }

    至此,一个关闭按钮控件实现了。

    源代码下载

  • 相关阅读:
    JAVA设计模式-设计原则
    java 8 stream特性
    使用跟踪标记查看过滤统计信息是否被使用
    找到SQL Server的序列号
    使用SSIS进行数据清洗
    找到SQL Server数据库历史增长信息
    如何查看某个查询用了多少TempDB空间
    SQL Server 2014云特性:无缝集成公有云
    SQL Server 2014新特性-原生备份加密
    强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
  • 原文地址:https://www.cnblogs.com/liszt/p/1986517.html
Copyright © 2011-2022 走看看