• (八十七)c#Winform自定义控件-朝上的瓶子


    官网

    http://www.hzhcontrols.com/

    前提

    入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章。

    GitHub:https://github.com/kwwwvagaa/NetWinformControl

    码云:https://gitee.com/kwwwvagaa/net_winform_custom_control.git

    如果觉得写的还行,请点个 star 支持一下吧

    欢迎前来交流探讨: 企鹅群568015492 企鹅群568015492

    来都来了,点个【推荐】再走吧,谢谢

    NuGet

    Install-Package HZH_Controls

    目录

    http://www.hzhcontrols.com/blog-63.html

    用处及效果

    image.png

    准备工作

    之前的瓶子是朝下的,这里扩展一下 朝上

    (五十六)c#Winform自定义控件-瓶子(工业)

    开始

    增加一个属性

            private Direction direction = Direction.Down;
     
            [Description("瓶子方向,默认朝下"), Category("自定义")]
            public Direction Direction
            {
                get return direction; }
                set
                {
                    direction = value;
                    Refresh();
                }
            }

    重绘里面判断朝上的代码

     else
                {
                    //写文字
                    var size = g.MeasureString(title, Font);
                    g.DrawString(title, Font, new SolidBrush(ForeColor), new PointF((this.Width - size.Width) / 2, this.Height - size.Height - 2));
                    //画空瓶子
                    GraphicsPath pathPS = new GraphicsPath();
                    Point[] psPS = new Point[] 
                    {       
                        new Point(m_workingRect.Left + m_workingRect.Width / 4, m_workingRect.Top),
                        new Point(m_workingRect.Right - 1- m_workingRect.Width / 4, m_workingRect.Top),
                        new Point(m_workingRect.Right - 1, m_workingRect.Top + 15),
                        new Point(m_workingRect.Right - 1, m_workingRect.Bottom),
                        new Point(m_workingRect.Left , m_workingRect.Bottom),
                        new Point(m_workingRect.Left, m_workingRect.Top + 15),
                    };
                    pathPS.AddLines(psPS);
                    pathPS.CloseAllFigures();
                    g.FillPath(new SolidBrush(bottleColor), pathPS);
                    //画液体
                    decimal decYTHeight = (m_value / maxValue) * m_workingRect.Height;
                    GraphicsPath pathYT = new GraphicsPath();
                    Rectangle rectYT = Rectangle.Empty;
                    if (decYTHeight > m_workingRect.Height - 15)
                    {
                        PointF[] psYT = new PointF[] 
                        
                            new PointF((float)(m_workingRect.Left+(decYTHeight-(m_workingRect.Height-15)))+3,(float)(m_workingRect.Bottom-decYTHeight)),                   
                            new PointF((float)(m_workingRect.Right-(decYTHeight-(m_workingRect.Height-15)))-3,(float)(m_workingRect.Bottom-decYTHeight)),  
                            new PointF(m_workingRect.Right-1, m_workingRect.Top+15),
                            new PointF(m_workingRect.Right-1, m_workingRect.Bottom),
                            new PointF(m_workingRect.Left, m_workingRect.Bottom),
                            new PointF(m_workingRect.Left, m_workingRect.Top+15),
                        };
                        pathYT.AddLines(psYT);
                        pathYT.CloseAllFigures();
                        rectYT = new Rectangle(m_workingRect.Left + (int)(decYTHeight - (m_workingRect.Height - 15)) +1, (int)(m_workingRect.Bottom - decYTHeight - 4), m_workingRect.Width - (int)(decYTHeight - (m_workingRect.Height - 15)) * 2-2 , 10);
                    }
                    else
                    {
                        PointF[] psYT = new PointF[] 
                        
                            new PointF(m_workingRect.Left,(float)(m_workingRect.Bottom-decYTHeight)),
                            new PointF(m_workingRect.Right-1,(float)(m_workingRect.Bottom-decYTHeight)),
                            new PointF(m_workingRect.Right-1,m_workingRect.Bottom),
                            new PointF(m_workingRect.Left,m_workingRect.Bottom),
                        };
                        pathYT.AddLines(psYT);
                        pathYT.CloseAllFigures();
                        rectYT = new Rectangle(m_workingRect.Left, m_workingRect.Bottom - (int)decYTHeight - 5, m_workingRect.Width, 10);
                    }
     
                    g.FillPath(new SolidBrush(liquidColor), pathYT);
                    g.FillPath(new SolidBrush(Color.FromArgb(50, bottleMouthColor)), pathYT);
                    //画液体面
                    g.FillEllipse(new SolidBrush(liquidColor), rectYT);
                    g.FillEllipse(new SolidBrush(Color.FromArgb(50, Color.White)), rectYT);
                    //画高亮
                    int intCount = m_workingRect.Width / 2 / 4;
                    int intSplit = (255 - 100) / intCount;
                    for (int i = 0; i < intCount; i++)
                    {
                        int _penWidth = m_workingRect.Width / 2 - 4 * i;
                        if (_penWidth <= 0)
                            _penWidth = 1;
                        g.DrawLine(new Pen(new SolidBrush(Color.FromArgb(10, Color.White)), _penWidth), new Point(m_workingRect.Width / 2, m_workingRect.Top + 15), new Point(m_workingRect.Width / 2, m_workingRect.Bottom));
                        if (_penWidth == 1)
                            break;
                    }
                    //画瓶底
                    g.FillEllipse(new SolidBrush(liquidColor), new RectangleF(m_workingRect.Left, m_workingRect.Bottom - 5, m_workingRect.Width - 2, 10));
                    g.FillEllipse(new SolidBrush(Color.FromArgb(50, liquidColor)), new RectangleF(m_workingRect.Left, m_workingRect.Bottom - 5, m_workingRect.Width - 2, 10));
                    //画瓶口
                    g.FillRectangle(new SolidBrush(bottleMouthColor), new Rectangle(m_workingRect.Left + m_workingRect.Width / 4, m_workingRect.Top - 15 + 1, m_workingRect.Width / 2, 15));
                    //画瓶颈阴影
                    GraphicsPath pathPJ = new GraphicsPath();
                    Point[] psPJ = new Point[] 
                    {       
                        new Point(m_workingRect.Left+m_workingRect.Width/4, m_workingRect.Top),
                        new Point(m_workingRect.Right-1-m_workingRect.Width/4, m_workingRect.Top),
                        new Point(m_workingRect.Right-1, m_workingRect.Top+15),
                        new Point(m_workingRect.Left,  m_workingRect.Top+15)               
                    };
                    pathPJ.AddLines(psPJ);
                    pathPJ.CloseAllFigures();
                    g.FillPath(new SolidBrush(Color.FromArgb(50, bottleMouthColor)), pathPJ);
                    //写编号
                    if (!string.IsNullOrEmpty(m_NO))
                    {
                        var nosize = g.MeasureString(m_NO, Font);
                        g.DrawString(m_NO, Font, new SolidBrush(ForeColor), new PointF((this.Width - nosize.Width) / 2, m_workingRect.Bottom - nosize.Height - 10));
                    }
                }

    最后的话

    如果你喜欢的话,请到 https://gitee.com/kwwwvagaa/net_winform_custom_control 点个星星吧

  • 相关阅读:
    作业 20180918-2 每周例行报告
    将Python文件打包为exe文件,并在控制台运行之简易教程
    作业20181011-1 每周例行报告
    用WebView加载本地图片的方法
    ios webview自适应实际内容高度4种方法
    UIWebView加载本地网页与图片的方法
    nonatomic与atomic的区别与作用
    @dynamic与@synthesize的区别与用法
    xib与storyboard的区别
    iOS与H5的交互
  • 原文地址:https://www.cnblogs.com/bfyx/p/12897221.html
Copyright © 2020-2023  润新知