zoukankan      html  css  js  c++  java
  • WinForm自定义控件开发(1)

    类图

    1)   具有渐变色的Label控件MyLabel:具有渐变色的标签

    2)   实现坐标系控件 MyCoordinate

     

    代码

    1)         MyLabel

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

    using System.Drawing;

    using System.ComponentModel;

    using System.Drawing.Drawing2D;

     

     

    namespace WindowsFormsControlLibrary

    {

        /// <summary>

        /// 自定义Label

        /// </summary>

        /// <remarks>

        /// 渐变背景的Label

        /// </remarks>

        public class MyLabel:Control

        {

            /// <summary>

            /// 背景渐变颜色2

            /// </summary>

            private Color backColor2;

     

            /// <summary>

            /// 背景渐变颜色2

            /// </summary>

            public Color BackColor2

            {

                get

                {

                    return backColor2;

                }

                set

                {

                    //重绘控件

                    this.Invalidate();

                    backColor2 = value;

                }

            }

     

            public override string Text

            {

                get

                {

                    return base.Text;

                }

                set

                {

                    //重绘控件

                    this.Invalidate();

                    base.Text = value;

                }

            }

     

            protected override void OnPaint(PaintEventArgs e)

            {

                base.OnPaint(e);

     

                LinearGradientBrush currentBrush = new LinearGradientBrush

                (

                new Point(0, 0),

                new Point(0, Height),

                BackColor, backColor2

                );

     

                e.Graphics.FillRectangle(currentBrush, ClientRectangle);

     

                //测量字体所占的矩形大小

                SizeF textSize = e.Graphics.MeasureString(Text, Font);

     

                Brush foreBrush = new SolidBrush(ForeColor);

     

                e.Graphics.DrawString(Text, Font, foreBrush,

                    new PointF(

                        (Width - textSize.Width) / 2,

                        (Height - textSize.Height) / 2

                        )

                        );

     

                currentBrush.Dispose();

                foreBrush.Dispose();

            }

     

            private void InitializeComponent()

            {

                this.SuspendLayout();

                this.ResumeLayout(false);

     

            }

        }

    }

     

    2)   MyCoordinate

     

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Windows.Forms;

    using System.Drawing;

    using System.ComponentModel;

    using System.Drawing.Drawing2D;

     

    namespace WindowsFormsControlLibrary

    {

        public class MyCoordinate:Control

        {

     

            //坐标轴X与控件边缘的距离

            private const int xPad = 80;

     

            //坐标轴Y与控件边缘的距离

            private const int yPad = 60;

     

            /// <summary>

            /// X坐标标签间距

            /// </summary>

            private int coordinateLablePadX = 20;

            public int CoordinateLablePadX

            {

                get

                {

                    return coordinateLablePadX;

                }

     

                set

                {

                    Invalidate();

                    coordinateLablePadX = value;

                }

            }

           

     

            /// <summary>

            /// Y坐标标签间距

            /// </summary>

            private int coordinateLablePadY = 30;

            public int CoordinateLablePadY

            {

                get

                {

                    return coordinateLablePadY;

                }

     

                set

                {

                    Invalidate();

                    coordinateLablePadY = value;

                }

            }

     

            /// <summary>

            /// y坐标轴起点坐标

            /// </summary>

            public Point YCoordinateStartPoint

            {

                get

                {

                    return new Point(xPad, this.Height - yPad);

     

                }

            }

     

           

            /// <summary>

            /// y坐标轴终点坐标

            /// </summary>

            public Point YCoordinateEndPoint

            {

                get

                {

                    return new Point(xPad, yPad);

                }

            }

     

     

            /// <summary>

            /// x坐标轴起点坐标

            /// </summary>

            public Point XCoordinateStartPoint

            {

                get

                {

                    return YCoordinateStartPoint;

                }

            }

     

            /// <summary>

            /// x坐标轴终点坐标

            /// </summary>

            public Point XCoordinateEndPoint

            {

                get

                {

                    Point current = new Point();

                    current.X = Width-xPad ;

                    current.Y = Height - yPad ;

                    return current;

                }

            }

     

            /// <summary>

            /// 当前鼠标的位置坐标

            /// </summary>

            private Point currentMouseLocation = new Point();

     

            private void InitializeComponent()

            {

                this.SuspendLayout();

                //

                // MyCoordinate

                //

     

                this.ResumeLayout(false);

     

            }

     

            /// <summary>

            /// 重载绘制事件

            /// </summary>

            /// <param name="e"></param>

            protected override void OnPaint(PaintEventArgs e)

            {

                base.OnPaint(e);

                Pen currentPen=new Pen(Color.Black ) ;

     

                currentPen.EndCap = LineCap.ArrowAnchor ;

     

                //绘制Y轴

                e.Graphics.DrawLine(

                    currentPen,

                    YCoordinateStartPoint,

                    YCoordinateEndPoint

                    );

     

                //绘制Y轴

                e.Graphics.DrawLine(

                    currentPen,

                    XCoordinateStartPoint,

                    XCoordinateEndPoint

                    );

                currentPen.Dispose();

     

                //绘制X,Y 标签

                DrawCoordinateLabel(e.Graphics, YCoordinateStartPoint, YCoordinateEndPoint,XCoordinateStartPoint, XCoordinateEndPoint);

               

     

            }

     

            /// <summary>

            /// 重载鼠标移动事件

            /// </summary>

            /// <param name="e"></param>

            protected override void OnMouseMove(MouseEventArgs e)

            {

                base.OnMouseMove(e);

                currentMouseLocation = e.Location;

                this.Invalidate();

            }

     

          

            /// <summary>

            /// 绘制坐标标记

            /// </summary>

            private void DrawCoordinateLabel(Graphics gp,Point startYPoint,Point endYPoint,Point startXPoint,Point endXPoint)

            {

                //int y = YCoordinateStartPoint .Y - YCoordinateEndPoint.Y;

     

                int currentValue=-1;

                float labelX = 0,labelY=0;

                int pad = 5;

     

                //绘制Y轴

                for (int current = YCoordinateStartPoint.Y; current >YCoordinateEndPoint.Y ; current -= CoordinateLablePadY)

                {

                    currentValue++;

     

                    SizeF textSize= gp.MeasureString(currentValue.ToString(), Font);

                   

                    labelX=YCoordinateStartPoint.X - xPad / 2;

                    labelY=current-textSize.Height/2;

     

                    //绘制label

                    gp.DrawString(currentValue.ToString () ,Font,Brushes.Black,

                        new PointF(labelX ,labelY)

                            );

     

                    //绘制|-

                    gp.DrawLine(Pens.Black,new Point(YCoordinateStartPoint.X,current),new Point(YCoordinateStartPoint.X+pad,current ));

                        

                }

     

                currentValue = -1;

                //绘制X轴

                for (int current = XCoordinateStartPoint.X ; current < XCoordinateEndPoint.X ; current += CoordinateLablePadX)

                {

                    currentValue++;

     

                    SizeF textSize = gp.MeasureString(currentValue.ToString(), Font);

     

                    labelY = XCoordinateStartPoint.Y + yPad / 2;

                    labelX = current;

     

                    //绘制label

                    gp.DrawString(currentValue.ToString(), Font, Brushes.Black,

                        new PointF(labelX, labelY)

                            );

     

                    //绘制_|_

                    gp.DrawLine(Pens.Black,

                        new Point(current, XCoordinateStartPoint.Y ),

                    new Point(current, XCoordinateStartPoint.Y-pad )

                    );

                  

     

                }

     

                //绘制交叉线

                List<Point> list = GetCurrentArrowLinesPoints(currentMouseLocation);

                gp.DrawLine(Pens.Blue , list[0], list[1]);

                gp.DrawLine(Pens.Blue, list[2], list[3]);

     

                //绘制交叉点的坐标

     

                DrawMousePointLabel(gp, currentMouseLocation);

     

               

            }

     

            /// <summary>

            /// 绘制当前鼠标所指的坐标位置

            /// </summary>

            /// <param name="ph"></param>

            /// <param name="current"></param>

            private void DrawMousePointLabel(Graphics ph,Point current)

            {

                int margin = 15;

                current = LimitMouseLocation(current);

     

     

                string text = string.Format("X:{0} Y:{1}",

                    (current.X -xPad)/ CoordinateLablePadX,

                    ((YCoordinateStartPoint.Y-YCoordinateEndPoint.Y)/CoordinateLablePadY)-(current.Y-yPad)/CoordinateLablePadY

                    );

               

                ph.DrawString(text, Font, Brushes.Black , new PointF((float)current.X+margin , (float)current.Y));

            }

     

           

     

            /// <summary>

            /// 当前鼠标经过位置点的交叉线坐标

            /// </summary>

            /// <param name="p"></param>

            /// <returns></returns>

            private List<Point> GetCurrentArrowLinesPoints(Point p)

            {

                List<Point> list = new List<Point>();

     

                p = LimitMouseLocation(p);

     

               

                Point px1 = new Point(p.X, YCoordinateStartPoint.Y);

     

                list.Add(px1);

     

                Point px2 = new Point(p.X, YCoordinateEndPoint.Y);

                list.Add(px2);

     

     

                Point py1 = new Point(XCoordinateStartPoint.X ,p.Y );

     

                list.Add(py1);

     

                Point py2 = new Point(XCoordinateEndPoint.X, p.Y );

                list.Add(py2);

     

                return list;

     

               

            }

     

            /// <summary>

            /// 修正鼠标位置

            /// </summary>

            /// <param name="p"></param>

            /// <returns></returns>

            private Point LimitMouseLocation(Point p)

            {

                //X越界后修正

                if (p.X > XCoordinateEndPoint.X)

                {

                    p.X = XCoordinateEndPoint.X;

                }

                else if (p.X < XCoordinateStartPoint.X)

                {

                    p.X = XCoordinateStartPoint.X;

                }

     

                //Y越界后修正

                if (p.Y < YCoordinateEndPoint.Y)

                {

                    p.Y = YCoordinateEndPoint.Y;

                }

                else if (p.Y > YCoordinateStartPoint.Y)

                {

                    p.Y = YCoordinateStartPoint.Y;

                }

                return p;

            }

     

           

           

        }

    }

    运行效果

     



  • 相关阅读:
    临摹帖
    PC+PLC通过Modbus协议构建工控系统
    mvn打包时出现一个子模块找不到另一个子模块的情况
    T-SQL——函数——字符串操作函数
    T-SQL——透视PIVOT动态获取待扩展元素集
    T-SQL——数据透视和逆透视
    T-SQL——关于表数据的复制插入
    T-SQL——关于SQL读取Excel文件
    T-SQL——关于SqlPrompt的使用
    微信小程序--聊天室小程序(云开发)
  • 原文地址:https://www.cnblogs.com/hbb0b0/p/1886858.html
Copyright © 2011-2022 走看看