簡體   English   中英

設計自定義 Windows 窗體

[英]Design Custom Windows Forms

我找到了一個允許在表單上放置圓角的代碼,但是,此代碼發生在表單本身內我想在一個類中這樣做以使其更清潔,但事實證明當我打電話時我不能表單接收值。

這是我的類文件:

       using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Data;
        using System.Drawing;
        using System.Linq;
        using System.Text;
        using System.Threading.Tasks;
        using System.Windows.Forms;
        using System.Runtime.InteropServices;
        using System.Drawing.Drawing2D;
        using System.Drawing.Imaging;
        namespace cornersroundedTest
        {
          
        
                public class ProgramGraphics : Form
                {
        
                protected override void OnPaintBackground(PaintEventArgs e)
                {
        
                    Rectangle rc = new Rectangle(0, 0, this.ClientSize.Width + 1, this.ClientSize.Height + 1);
                    using (LinearGradientBrush brush = new LinearGradientBrush(rc, Color.LightGreen, Color.WhiteSmoke, 45F))
                    {
                        e.Graphics.FillRectangle(brush, rc);
                    }
                }
        
                public void SetWindowRegion()
                {
                    System.Drawing.Drawing2D.GraphicsPath FormPath;
                    FormPath = new System.Drawing.Drawing2D.GraphicsPath();
                    Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
                    FormPath = GetRoundedRectPath(rect, 30); // 30 represents the size of the fillet angle
                    this.Region = new Region(FormPath);
                }
        
                private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius)
                {
                    int diameter = radius;
                    Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
                    GraphicsPath path = new GraphicsPath();
        
                    path.AddArc(arcRect, 180, 90); // top left
        
                    arcRect.X = rect.Right - diameter;//top right
                    path.AddArc(arcRect, 270, 90);
        
                    arcRect.Y = rect.Bottom - diameter; // buttom right
                    path.AddArc(arcRect, 0, 90);
        
                    arcRect.X = rect.Left; // button left
                    path.AddArc(arcRect, 90, 90);
                    path.CloseFigure();
                    return path;
                }
        
        
                private static GraphicsPath GetRoundRectangle(Rectangle rectangle, int r)
                {
                    int l = 2 * r;
                    // Divide the rounded rectangle into a combination of straight lines and arcs, and add them to the path in turn
                    GraphicsPath gp = new GraphicsPath();
                    gp.AddLine(new Point(rectangle.X + r, rectangle.Y), new Point(rectangle.Right - r, rectangle.Y));
                    gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Y, l, l), 270F, 90F);
        
                    gp.AddLine(new Point(rectangle.Right, rectangle.Y + r), new Point(rectangle.Right, rectangle.Bottom - r));
                    gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Bottom - l, l, l), 0F, 90F);
        
                    gp.AddLine(new Point(rectangle.Right - r, rectangle.Bottom), new Point(rectangle.X + r, rectangle.Bottom));
                    gp.AddArc(new Rectangle(rectangle.X, rectangle.Bottom - l, l, l), 90F, 90F);
        
                    gp.AddLine(new Point(rectangle.X, rectangle.Bottom - r), new Point(rectangle.X, rectangle.Y + r));
                    gp.AddArc(new Rectangle(rectangle.X, rectangle.Y, l, l), 180F, 90F);
                    return gp;
                }
        
                public void FillRoundRectangle(Graphics g, Rectangle rectangle, Pen pen, int r)
                {
                    rectangle = new Rectangle(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
                    g.DrawPath(pen, GetRoundRectangle(rectangle, r));
                }
        
                private void OnpaintForm(object sender, PaintEventArgs e)
                {
                    SetWindowRegion();
                    Pen pen = new Pen(Color.Blue, 3);
                    pen.DashStyle = DashStyle.Solid;
                    Rectangle rectangle = new Rectangle(1, 1, this.Width - 2, this.Height - 2);
                    FillRoundRectangle(e.Graphics, rectangle, pen, 14);
                }
        
        
        
            }
        }

This code was separated To be called by the form file name: ProgramGraphics it was typed as type form.


Now the normal code inside the form:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;

namespace cornersroundedTest
{
    public partial class Form1 : Form
    {
        private Timer drawTimer = new Timer();
        public Form1()
        {
         
            InitializeComponent();
            this.FormBorderStyle = FormBorderStyle.None;
            this.SetStyle(ControlStyles.ResizeRedraw, true);
           
        }

        protected override void OnPaintBackground(PaintEventArgs e)
        {
            Rectangle rc = new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height);
            using (LinearGradientBrush brush = new LinearGradientBrush(rc, Color.LightGreen, Color.WhiteSmoke, 45F))
            {
                e.Graphics.FillRectangle(brush, rc);
            }
        }

            public void SetWindowRegion()
        {
            System.Drawing.Drawing2D.GraphicsPath FormPath;
            FormPath = new System.Drawing.Drawing2D.GraphicsPath();
            Rectangle rect = new Rectangle(0, 0, this.Width, this.Height);
            FormPath = GetRoundedRectPath(rect, 30); // 30 represents the size of the fillet angle
            this.Region = new Region(FormPath);
        }

        private GraphicsPath GetRoundedRectPath(Rectangle rect, int radius)
        {
            int diameter = radius;
            Rectangle arcRect = new Rectangle(rect.Location, new Size(diameter, diameter));
            GraphicsPath path = new GraphicsPath();

            path.AddArc(arcRect, 180, 90); // top left

            arcRect.X = rect.Right - diameter;//top right
            path.AddArc(arcRect, 270, 90);

            arcRect.Y = rect.Bottom - diameter; // buttom right
            path.AddArc(arcRect, 0, 90);

            arcRect.X = rect.Left; // button left
            path.AddArc(arcRect, 90, 90);
            path.CloseFigure();
            return path;
        }


        private static GraphicsPath GetRoundRectangle(Rectangle rectangle, int r)
        {
            int l = 2 * r;
            // Divide the rounded rectangle into a combination of straight lines and arcs, and add them to the path in turn
            GraphicsPath gp = new GraphicsPath();
            gp.AddLine(new Point(rectangle.X + r, rectangle.Y), new Point(rectangle.Right - r, rectangle.Y));
            gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Y, l, l), 270F, 90F);

            gp.AddLine(new Point(rectangle.Right, rectangle.Y + r), new Point(rectangle.Right, rectangle.Bottom - r));
            gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Bottom - l, l, l), 0F, 90F);

            gp.AddLine(new Point(rectangle.Right - r, rectangle.Bottom), new Point(rectangle.X + r, rectangle.Bottom));
            gp.AddArc(new Rectangle(rectangle.X, rectangle.Bottom - l, l, l), 90F, 90F);

            gp.AddLine(new Point(rectangle.X, rectangle.Bottom - r), new Point(rectangle.X, rectangle.Y + r));
            gp.AddArc(new Rectangle(rectangle.X, rectangle.Y, l, l), 180F, 90F);
            return gp;
        }

        public void FillRoundRectangle(Graphics g, Rectangle rectangle, Pen pen, int r)
        {
            rectangle = new Rectangle(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height);
            g.DrawPath(pen, GetRoundRectangle(rectangle, r));
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Pen pen = new Pen(Color.Blue, 3);
            pen.DashStyle = DashStyle.Solid;
            Rectangle rectangle = new Rectangle(1, 1, this.Width - 2, this.Height - 2);
            FillRoundRectangle(e.Graphics, rectangle, pen, 14);
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            if (this.WindowState == FormWindowState.Normal)
            {
                SetWindowRegion();
            }
            else
            {
                this.Region = null;
            }
            

        }

       

    }
}

我只想將上面在一個類中工作的代碼分開並調用該類的屬性,以便它們可以應用於項目中的任何形式。 關於如何做到這一點的任何提示? 我已經嘗試創建和調用方法,甚至使用公共方法,但什么也沒有,唯一的結果是在表單中創建到 sender ,並且在 Onpaint 中,即使這樣它也只會在表單中生成結果,而不是在它的角落里。

另一種方法(“作弊贏得”LOL)是使用Form.TransparencyKey屬性,其中:

在此處輸入圖像描述

加上這個:

透明鍵

運行如下:

應用了透明鍵

是的,“這就是我學到的。”

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM