Rounded corners

The rounded corners of the WinForm form are not easy to set or draw. I searched the Internet for many solutions and finally found a perfect solution.

Redraw the corners of the window is commonly used in online information. But the way you do it is different and the end result is different and the amount of code that comes with manual labor is different.

The first option is to override OnPaint or redraw the form’s Paint event.

An obvious disadvantage of this scheme is that the Windows will flicker when the software runs. The rounded corners drawn by this scheme have certain wrinkles and thorns, and the rounded corners are not smooth.

The second scheme: using Win32 API redraw

This scheme is a more perfect scheme, without the shortcomings of scheme 1. Here’s the code.

public partial class FrmLogin : Form.ILoginView
    {
        private ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        public FrmLogin()
        {
            InitializeComponent();
            Load += FrmLogin_Load;
            SetFormRoundRectRgn(this.5);	// Set rounded corners
        }
 
        private void FrmLogin_Load(object sender, EventArgs e)
        {
            this.BackColor = ColorTranslator.FromHtml("#FF5DB3AB"); / / 171, 179, 93
            BackgroundImage = ImageHelper.GetImage("Login\\login_bg.png");
        }}
Copy the code
/// <summary>
        ///Sets the rounded rectangle for the form
        /// </summary>
        /// <param name="form">The form that needs to be set</param>
        /// <param name="rgnRadius">The radius of the rounded rectangle</param>
        public static void SetFormRoundRectRgn(Form form, int rgnRadius)
        {
            int hRgn = 0;
            hRgn = Win32.CreateRoundRectRgn(0.0, form.Width + 1, form.Height + 1, rgnRadius, rgnRadius);
            Win32.SetWindowRgn(form.Handle, hRgn, true);
            Win32.DeleteObject(hRgn);
        }
Copy the code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
 
namespace UClass.View.Login
{
    public class Win32
    {
        #region Window Const
 
        public const int WM_ERASEBKGND = 0x0014;
        public const int WM_LBUTTONDOWN = 0x0201;
        public const int WM_LBUTTONUP = 0x0202;
        public const int WM_LBUTTONDBLCLK = 0x0203;
        public const int WM_WINDOWPOSCHANGING = 0x46;
        public const int WM_PAINT = 0xF;
        public const int WM_CREATE = 0x0001;
        public const int WM_ACTIVATE = 0x0006;
        public const int WM_NCCREATE = 0x0081;
        public const int WM_NCCALCSIZE = 0x0083;
        public const int WM_NCPAINT = 0x0085;
        public const int WM_NCACTIVATE = 0x0086;
        public const int WM_NCLBUTTONDOWN = 0x00A1;
        public const int WM_NCLBUTTONUP = 0x00A2;
        public const int WM_NCLBUTTONDBLCLK = 0x00A3;
        public const int WM_NCMOUSEMOVE = 0x00A0;
 
        public const int WM_NCHITTEST = 0x0084;
 
        public const int HTLEFT = 10;
        public const int HTRIGHT = 11;
        public const int HTTOP = 12;
        public const int HTTOPLEFT = 13;
        public const int HTTOPRIGHT = 14;
        public const int HTBOTTOM = 15;
        public const int HTBOTTOMLEFT = 0x10;
        public const int HTBOTTOMRIGHT = 17;
        public const int HTCAPTION = 2;
        public const int HTCLIENT = 1;
 
        public const int WM_FALSE = 0;
        public const int WM_TRUE = 1;
 
 
 
        #endregion
 
        #region Public extern methods
 
        [DllImport("gdi32.dll")]
        public static extern int CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3);
 
        [DllImport("user32.dll")]
        public static extern int SetWindowRgn(IntPtr hwnd, int hRgn, Boolean bRedraw);
 
        [DllImport("gdi32.dll", EntryPoint = "DeleteObject", CharSet = CharSet.Ansi)]
        public static extern int DeleteObject(int hObject);
 
        [DllImport("user32.dll")]
        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
 
        [DllImport("user32.dll")]
        public static extern bool ReleaseCapture();
 
        #endregion}}Copy the code

Forms and controls stroke

Create a rectangle that is 1 larger than the existing form and control. The width and color of the stroke can be set by pen. The specific code is as follows

private void FrmFirstView_Paint(object sender, PaintEventArgs e)
        {
            ControlBorder_Paint(sender,e.Graphics,ColorTranslator.FromHtml("#D1D1D1"));
        }
Copy the code
private void ControlBorder_Paint(object sender, Graphics g, Color color)
        {
            Pen pen = new Pen(Color.FromArgb(255, color), 1f);
            foreach (System.Windows.Forms.Control ctr in this.pnlContent.Controls)
            {
                if (ctr is Control.Controls.TextBoxs.TextBoxEx || ctr is ComboBox)
                {
                    g.DrawRectangle(pen, new Rectangle(new Point(ctr.Location.X - 1, ctr.Location.Y - 1), new Size(ctr.Size.Width + 1, ctr.Size.Height + 1)));
                }
            }
            pen.Dispose();
        }
Copy the code

Reproduced in: blog.csdn.net/wangzl1163/…