C# WinForm(表單) 畫面UI『邊框畫線元件&四圓角(RoundPanel&PanelEx)』

C# WinForm(表單) 畫面UI『邊框畫線元件&四圓角(RoundPanel&PanelEx)』

C# WinForm(表單) 畫面UI『邊框畫線元件&四圓角(RoundPanel&PanelEx)』


資料來源:

https://blog.csdn.net/breakbridge/article/details/113403842

https://www.cnblogs.com/JiYF/p/9047559.html


GITHUB: https://github.com/jash-git/CS_RoundPanel-PanelEx


RoundPanel Class

using System;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace CS_VPOS
{
    //https://blog.csdn.net/breakbridge/article/details/113403842
    public partial class RoundPanel : Panel
    {
        [DllImport("user32.dll")]
        static extern IntPtr GetWindowDC(IntPtr hwnd);
        [DllImport("user32.dll")]
        static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
        Color _borderColor = Color.Black;
        int _borderWidth = 1;


        [Description("组件的边框颜色。"), Category("Appearance")]
        public Color BorderColor
        {
            get
            {
                return _borderColor;
            }
            set
            {
                _borderColor = value;
                this.Invalidate();
            }
        }


        [Description("组件的边框宽度。"), Category("Appearance")]
        public int BorderWidth
        {
            get
            {
                return _borderWidth;
            }
            set
            {
                _borderWidth = value;
                this.Invalidate();
            }
        }

        Color _currBColor = Color.Empty;
        public void SetBackColorImg(Color color)
        {
            if (_currBColor != color)
            {
                drawBackColor(100, color);
                _currBColor = color;
            }
        }

        public RoundPanel()
        {
            SetStyle(ControlStyles.DoubleBuffer, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, false);
            SetStyle(ControlStyles.ResizeRedraw, true);
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.SupportsTransparentBackColor, true);
            this.Padding = new System.Windows.Forms.Padding(0, 0, 0, 0);
            this.Margin = new System.Windows.Forms.Padding(0, 0, 0, 0);
            this.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
            this.Paint += new PaintEventHandler(PanelEx_Paint);
        }

        /// <summary>
        /// 绘制背景色,以图片填充
        /// </summary>
        void drawBackColor(int percentage, Color drawColor)
        {
            percentage = Math.Min(percentage, 100);
            Bitmap b = new Bitmap(this.Width, this.Height);
            Graphics g = Graphics.FromImage(b);
            int height = (int)(this.Height * (double)((100 - percentage) / (double)100));
            Rectangle rectangle = new Rectangle(new Point(0, height), new Size(this.Width, this.Height));
            g.DrawRectangle(new Pen(drawColor), rectangle);
            g.FillRectangle(new SolidBrush(drawColor), rectangle);
            g.Dispose();
            this.BackgroundImage = b;
        }

        [Browsable(true)]
        [Category("外观"), Description("生成该颜色的图片填充背景图片")]
        public Color BackImgColor
        {
            get { return _currBColor; }
            set
            {
                SetBackColorImg(value);
            }
        }

        void PanelEx_Paint(object sender, PaintEventArgs e)
        {
            if (this.BorderStyle == BorderStyle.FixedSingle)
            {
                IntPtr hDC = GetWindowDC(this.Handle);
                Graphics g = Graphics.FromHdc(hDC);
                ControlPaint.DrawBorder(
                 g,
                 new Rectangle(0, 0, this.Width, this.Height),
                 _borderColor,
                 _borderWidth,
                 ButtonBorderStyle.Solid,
                 _borderColor,
                 _borderWidth,
                 ButtonBorderStyle.Solid,
                 _borderColor,
                 _borderWidth,
                 ButtonBorderStyle.Solid,
                 _borderColor,
                 _borderWidth,
                 ButtonBorderStyle.Solid);
                g.Dispose();
                ReleaseDC(Handle, hDC);
            }
        }

        //<summary>
        //解决加载闪烁,背景透明等问题
        //</summary>
        protected override CreateParams CreateParams
        {
            get
            {
                var parms = base.CreateParams;
                parms.Style &= ~0x02000000;
                return parms;
            }
        }

        uint _topLeftRadius;
        [Browsable(true)]
        [Category("倒角"), Description("左上圆角弧度(0为不要圆角)")]
        public uint TopLeftRadius
        {
            get
            {
                return _topLeftRadius;
            }
            set
            {
                _topLeftRadius = value;
                radiusChanged(value);
            }
        }

        uint _topRightRadius;
        [Browsable(true)]
        [Category("倒角"), Description("右上圆角弧度(0为不要圆角)")]
        public uint TopRightRadius
        {
            get
            {
                return _topRightRadius;
            }
            set
            {
                _topRightRadius = value;
                radiusChanged(value);
            }
        }

        uint _bottomLeftRadius;
        [Browsable(true)]
        [Category("倒角"), Description("左下圆角弧度(0为不要圆角)")]
        public uint BottomLeftRadius
        {
            get
            {
                return _bottomLeftRadius;
            }
            set
            {
                _bottomLeftRadius = value;
                radiusChanged(value);
            }
        }

        uint _bottomRightRadius;
        [Browsable(true)]
        [Category("倒角"), Description("右下圆角弧度(0为不要圆角)")]
        public uint BottomRightRadius
        {
            get
            {
                return _bottomRightRadius;
            }
            set
            {
                _bottomRightRadius = value;
                radiusChanged(value);
            }
        }

        void radiusChanged(uint radius)
        {
            base.Refresh();
        }

        uint _allRound = 0;
        [Browsable(true)]
        [Category("倒角"), Description("统一圆角弧度")]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public uint AllRound
        {
            get { return _allRound; }
            set
            {
                _allRound = value;
                if (value != 0)
                {
                    _topLeftRadius = _allRound;
                    _topRightRadius = _allRound;
                    _bottomLeftRadius = _allRound;
                    _bottomRightRadius = _allRound;
                    radiusChanged(value);
                }
            }
        }

        // 圆角代码
        public void Round(System.Drawing.Region region)
        {
            System.Drawing.Drawing2D.GraphicsPath oPath = new System.Drawing.Drawing2D.GraphicsPath();
            int x = 0;
            int y = 0;
            int thisWidth = this.Width;
            int thisHeight = this.Height;
            if (_topLeftRadius > 0)
            {
                oPath.AddArc(x, y, _topLeftRadius, _topLeftRadius, 180, 90);                                 // 左上角
            }
            oPath.AddLine(x + _topLeftRadius, y, thisWidth - _topRightRadius, y);                         // 顶端
            if (_topRightRadius > 0)
            {
                oPath.AddArc(thisWidth - _topRightRadius, y, _topRightRadius, _topRightRadius, 270, 90);                 // 右上角
            }
            oPath.AddLine(thisWidth, y + _topRightRadius, thisWidth, thisHeight - _bottomRightRadius);        // 右边
            if (_bottomRightRadius > 0)
            {
                oPath.AddArc(thisWidth - _bottomRightRadius, thisHeight - _bottomRightRadius, _bottomRightRadius, _bottomRightRadius, 0, 90);  // 右下角
            }
            oPath.AddLine(thisWidth - _bottomRightRadius, thisHeight, x + _bottomLeftRadius, thisHeight);       // 底边
            if (_bottomLeftRadius > 0)
            {
                oPath.AddArc(x, thisHeight - _bottomLeftRadius, _bottomLeftRadius, _bottomLeftRadius, 90, 90);                 // 左下角
            }
            oPath.AddLine(x, thisHeight - _bottomLeftRadius, x, y + _topLeftRadius);                        // 左边

            oPath.CloseAllFigures();
            this.Region = new System.Drawing.Region(oPath);
        }

        protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
        {
            base.OnPaint(e);
            Round(this.Region);  // 圆角
        }

        protected override void OnResize(EventArgs eventargs)
        {
            base.OnResize(eventargs);
            base.Refresh();
        }
    }
}


PanelEx Class

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CS_VPOS
{
    //https://www.cnblogs.com/JiYF/p/9047559.html
    public partial class PanelEx : Panel
    {
        private Color _BorderColor = Color.Black;

        [Browsable(true), Description("边框颜色"), Category("自定义分组")]
        public Color BorderColor
        {
            get { return _BorderColor; }
            set
            {
                _BorderColor = value;
                this.Invalidate();
            }
        }

        private int _BorderSize = 1;

        [Browsable(true), Description("边框粗细"), Category("自定义分组")]
        public int BorderSize
        {
            get { return _BorderSize; }
            set
            {
                _BorderSize = value;
                this.Invalidate();
            }
        }


        public PanelEx()
        {
            InitializeComponent();
        }

        public PanelEx(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }

        /// <summary>
        /// 重写OnPaint方法
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPaint(PaintEventArgs e)
        {
            ControlPaint.DrawBorder(e.Graphics,
                            this.ClientRectangle,
                            this._BorderColor,
                            this._BorderSize,
                            ButtonBorderStyle.Solid,
                            this._BorderColor,
                            this._BorderSize,
                            ButtonBorderStyle.Solid,
                           this._BorderColor,
                            this._BorderSize,
                            ButtonBorderStyle.Solid,
                            this._BorderColor,
                            this._BorderSize,
                            ButtonBorderStyle.Solid);
        }



    }
}
namespace CS_VPOS
{
    partial class PanelEx
    {
        /// <summary>
        /// 設計工具所需的變數。
        /// </summary>
        private System.ComponentModel.IContainer components = null;

        /// <summary> 
        /// 清除任何使用中的資源。
        /// </summary>
        /// <param name="disposing">如果應該處置受控資源則為 true,否則為 false。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

        #region 元件設計工具產生的程式碼

        /// <summary>
        /// 此為設計工具支援所需的方法 - 請勿使用程式碼編輯器修改
        /// 這個方法的內容。
        /// </summary>
        private void InitializeComponent()
        {
            this.SuspendLayout();
            // 
            // PanelEx
            // 
            this.ResumeLayout(false);
        }

        #endregion
    }
}


Use Code

 private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(main));
            this.panelEx1 = new CS_VPOS.PanelEx(this.components);
            this.roundPanel1 = new CS_VPOS.RoundPanel();
            this.SuspendLayout();
            // 
            // panelEx1
            // 
            this.panelEx1.BorderColor = System.Drawing.Color.Brown;
            this.panelEx1.BorderSize = 3;
            this.panelEx1.Location = new System.Drawing.Point(47, 26);
            this.panelEx1.Name = "panelEx1";
            this.panelEx1.Size = new System.Drawing.Size(397, 178);
            this.panelEx1.TabIndex = 0;
            // 
            // roundPanel1
            // 
            this.roundPanel1.AllRound = ((uint)(20u));
            //this.roundPanel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(28)))), ((int)(((byte)(74)))), ((int)(((byte)(110)))));
            //this.roundPanel1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("roundPanel1.BackgroundImage")));
            //this.roundPanel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
            //this.roundPanel1.BackImgColor = System.Drawing.Color.Transparent;
            this.roundPanel1.BorderColor = System.Drawing.Color.Red;
            this.roundPanel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
            this.roundPanel1.BorderWidth = 5;
            //this.roundPanel1.BottomLeftRadius = ((uint)(20u));
            //this.roundPanel1.BottomRightRadius = ((uint)(20u));
            this.roundPanel1.Location = new System.Drawing.Point(507, 187);
            this.roundPanel1.Margin = new System.Windows.Forms.Padding(0);
            this.roundPanel1.Name = "roundPanel1";
            this.roundPanel1.Size = new System.Drawing.Size(859, 443);
            this.roundPanel1.TabIndex = 1;
            //this.roundPanel1.TopLeftRadius = ((uint)(20u));
            //this.roundPanel1.TopRightRadius = ((uint)(20u));
            // 
            // main
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.AutoScroll = true;
            this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(28)))), ((int)(((byte)(74)))), ((int)(((byte)(110)))));
            this.ClientSize = new System.Drawing.Size(1920, 1080);
            this.Controls.Add(this.roundPanel1);
            this.Controls.Add(this.panelEx1);
            this.Font = new System.Drawing.Font("微軟正黑體", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.Margin = new System.Windows.Forms.Padding(4);
            this.Name = "main";
            this.Text = "Form1";
            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            this.ResumeLayout(false);

        }
        private PanelEx panelEx1;
        private RoundPanel roundPanel1;


發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *