绘制半口角

相信大家都在象棋中兵的位置和一些射击游戏里的准心都见过,废话就少说了,看代码吧。

基类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace GDI_Form
{
    /// <summary>
    /// 抽象基类
    /// <para>Author:Evan Lee</para>
    /// <para>QQ:278631309</para>
    /// <para>Blog:http://www.cnblogs.com/magic_evan </para>
    /// </summary>
    public abstract class BaseControl
    {
        private Graphics _g;
        private string _name;
        private int _ID;
        private object _Tag;
        private bool _v;
        private float _x;
        private float _y;
        private float _w;
        private float _h;

        /// <summary>
        /// 获取设置GDI对象
        /// </summary>
        public Graphics G
        {
            get { return _g; }
            set { _g = value; }
        }

        /// <summary>
        /// 对象名称
        /// </summary>
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }

        /// <summary>
        /// 编号
        /// </summary>
        public int ID
        {
            get { return _ID; }
            set { _ID = value; }
        }

        /// <summary>
        /// 标签数据
        /// </summary>
        public object Tag
        {
            get { return _Tag; }
            set { _Tag = value; }
        }

        /// <summary>
        /// 对象是否可见
        /// </summary>
        public bool Visible
        {
            get { return _v; }
            set { _v = value; }
        }

        /// <summary>
        /// 起始X轴点
        /// </summary>
        public float X
        {
            get { return _x; }
            set { _x = value; }
        }

        /// <summary>
        /// 起始Y轴点
        /// </summary>
        public float Y
        {
            get { return _y; }
            set { _y = value; }
        }

        /// <summary>
        /// 宽度
        /// </summary>
        public float Width
        {
            get { return _w; }
            set { _w = value; }
        }

        /// <summary>
        /// 高度
        /// </summary>
        public float Heiht
        {
            get { return _h; }
            set { _h = value; }
        }

    }
}

实现类:

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;

namespace GDI_Form
{
    /// <summary>
    /// 画边角类
    /// <para>Author:Evan Lee</para>
    ///<para>QQ:278631309</para>
    ///<para>Blog:http://www.cnblogs.com/magic_evan </para>
    /// </summary>
    public class Angle : BaseControl
    {
        /// <summary>
        /// 画边角类
        /// </summary>
        /// <param name="g"></param>
        public Angle(Graphics g)
        {
            this.G = g;
        }

        /// <summary>
        /// 角口的方向
        /// ┏ ┓┗ ┛ 
        /// </summary>
        public enum AngleDirection
        {
            /// <summary>
            /// 右上角┗
            /// </summary>
            UpperRight,
            /// <summary>
            /// 右下角┏
            /// </summary>
            LowerRight,
            /// <summary>
            /// 左下角┓
            /// </summary>
            LowerLeft,
            /// <summary>
            /// 左上角┛
            /// </summary>
            UpperLeft
        }

        /// <summary>
        /// 绘制半口角
        /// </summary>
        /// <param name="pen">画笔</param>
        /// <param name="centerP">中心坐标</param>
        /// <param name="offsetP">偏移中心的坐标</param>
        /// <param name="len">角的边长</param>
        /// <param name="direction">角口的方向</param>
        public void DrawAngle(Pen pen, Point centerP, Point offsetP, int len, AngleDirection direction)
        {
            if (this.G == null)
                return;
            switch (direction)
            {
                case AngleDirection.UpperRight:
                    this.G.DrawLine(pen, centerP.X + offsetP.X, centerP.Y - offsetP.Y, centerP.X + offsetP.X + len, centerP.Y - offsetP.Y);
                    this.G.DrawLine(pen, centerP.X + offsetP.X, centerP.Y - offsetP.Y, centerP.X + offsetP.X, centerP.Y - offsetP.Y - len);
                    break;
                case AngleDirection.UpperLeft:
                    this.G.DrawLine(pen, centerP.X - offsetP.X, centerP.Y - offsetP.Y, centerP.X - offsetP.X - len, centerP.Y - offsetP.Y);
                    this.G.DrawLine(pen, centerP.X - offsetP.X, centerP.Y - offsetP.Y, centerP.X - offsetP.X, centerP.Y - offsetP.Y - len);
                    break;
                case AngleDirection.LowerRight:
                    this.G.DrawLine(pen, centerP.X + offsetP.X, centerP.Y + offsetP.Y, centerP.X + offsetP.X + len, centerP.Y + offsetP.Y);
                    this.G.DrawLine(pen, centerP.X + offsetP.X, centerP.Y + offsetP.Y, centerP.X + offsetP.X, centerP.Y + offsetP.Y + len);
                    break;
                case AngleDirection.LowerLeft:
                    this.G.DrawLine(pen, centerP.X - offsetP.X, centerP.Y + offsetP.Y, centerP.X - offsetP.X - len, centerP.Y + offsetP.Y);
                    this.G.DrawLine(pen, centerP.X - offsetP.X, centerP.Y + offsetP.Y, centerP.X - offsetP.X, centerP.Y + offsetP.Y + len);
                    break;
            }
        }
    }
}


 使用方法

        private void test()
        {
            int centerX = this.Width / 2;
            int centerY = this.Height / 2;
            Point centerP = new Point(centerX, centerY);
            Point offsetP = new Point(3, 3);
            int len = 10;

            Graphics g = this.CreateGraphics();
            Pen pen = new Pen(Color.Red, 2);

            Angle angle = new Angle(g);
            angle.DrawAngle(pen, centerP, offsetP, len, Angle.AngleDirection.LowerLeft);
           angle.DrawAngle(pen, centerP, offsetP, len, Angle.AngleDirection.LowerRight);
            angle.DrawAngle(pen, centerP, offsetP, len, Angle.AngleDirection.UpperLeft);
            angle.DrawAngle(pen, centerP, offsetP, len, Angle.AngleDirection.UpperRight);
        }
原文地址:https://www.cnblogs.com/magic_evan/p/1859823.html