¿Cómo mover y cambiar el tamaño de un formulario sin un borde?

¿Alguien sabe cómo puedo cambiar el tamaño de un winform cuando no tiene borde? No quiero el borde predeterminado que tiene Windows, así que cambié la propiedad “FormBorderStyle” a “None”. Esto eliminó el borde, aunque ahora no se puede cambiar el tamaño. He descubierto cómo mover el formulario, solo necesito saber cómo redimensionarlo.

Algunos ejemplos de código que permiten mover y cambiar el tamaño del formulario:

public partial class Form1 : Form { public Form1() { InitializeComponent(); this.FormBorderStyle = FormBorderStyle.None; this.DoubleBuffered = true; this.SetStyle(ControlStyles.ResizeRedraw, true); } private const int cGrip = 16; // Grip size private const int cCaption = 32; // Caption bar height; protected override void OnPaint(PaintEventArgs e) { Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip); ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc); rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption); e.Graphics.FillRectangle(Brushes.DarkBlue, rc); } protected override void WndProc(ref Message m) { if (m.Msg == 0x84) { // Trap WM_NCHITTEST Point pos = new Point(m.LParam.ToInt32()); pos = this.PointToClient(pos); if (pos.Y < cCaption) { m.Result = (IntPtr)2; // HTCAPTION return; } if (pos.X >= this.ClientSize.Width - cGrip && pos.Y >= this.ClientSize.Height - cGrip) { m.Result = (IntPtr)17; // HTBOTTOMRIGHT return; } } base.WndProc(ref m); } } 

Aquí hay un ejemplo completo de un formulario personalizado con los 8 puntos de cambio de tamaño:

 public partial class Form1 : Form { public Form1() { InitializeComponent(); this.FormBorderStyle = FormBorderStyle.None; // no borders this.DoubleBuffered = true; this.SetStyle(ControlStyles.ResizeRedraw, true); // this is to avoid visual artifacts } protected override void OnPaint(PaintEventArgs e) // you can safely omit this method if you want { e.Graphics.FillRectangle(Brushes.Green, Top); e.Graphics.FillRectangle(Brushes.Green, Left); e.Graphics.FillRectangle(Brushes.Green, Right); e.Graphics.FillRectangle(Brushes.Green, Bottom); } private const int HTLEFT = 10, HTRIGHT = 11, HTTOP = 12, HTTOPLEFT = 13, HTTOPRIGHT = 14, HTBOTTOM = 15, HTBOTTOMLEFT = 16, HTBOTTOMRIGHT = 17; const int _ = 10; // you can rename this variable if you like Rectangle Top { get { return new Rectangle(0, 0, this.ClientSize.Width, _); } } Rectangle Left { get { return new Rectangle(0, 0, _, this.ClientSize.Height); } } Rectangle Bottom { get { return new Rectangle(0, this.ClientSize.Height - _, this.ClientSize.Width, _); } } Rectangle Right { get { return new Rectangle(this.ClientSize.Width - _, 0, _, this.ClientSize.Height); } } Rectangle TopLeft { get { return new Rectangle(0, 0, _, _); } } Rectangle TopRight { get { return new Rectangle(this.ClientSize.Width - _, 0, _, _); } } Rectangle BottomLeft { get { return new Rectangle(0, this.ClientSize.Height - _, _, _); } } Rectangle BottomRight { get { return new Rectangle(this.ClientSize.Width - _, this.ClientSize.Height - _, _, _); } } protected override void WndProc(ref Message message) { base.WndProc(ref message); if (message.Msg == 0x84) // WM_NCHITTEST { var cursor = this.PointToClient(Cursor.Position); if (TopLeft.Contains(cursor)) message.Result = (IntPtr)HTTOPLEFT; else if (TopRight.Contains(cursor)) message.Result = (IntPtr)HTTOPRIGHT; else if (BottomLeft.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMLEFT; else if (BottomRight.Contains(cursor)) message.Result = (IntPtr)HTBOTTOMRIGHT; else if (Top.Contains(cursor)) message.Result = (IntPtr)HTTOP; else if (Left.Contains(cursor)) message.Result = (IntPtr)HTLEFT; else if (Right.Contains(cursor)) message.Result = (IntPtr)HTRIGHT; else if (Bottom.Contains(cursor)) message.Result = (IntPtr)HTBOTTOM; } }} 

Eche un vistazo aquí:

Cambiar el tamaño de la ventana sin bordes en la esquina inferior derecha

“Sizer” es el panel azul claro en la esquina inferior derecha, introduzca la descripción de la imagen aquí

  int Mx; int My; int Sw; int Sh; bool mov; void SizerMouseDown(object sender, MouseEventArgs e) { mov = true; My = MousePosition.Y; Mx = MousePosition.X; Sw = Width; Sh = Height; } void SizerMouseMove(object sender, MouseEventArgs e) { if (mov == true) { Width = MousePosition.X - Mx + Sw; Height = MousePosition.Y - My + Sh; } } void SizerMouseUp(object sender, MouseEventArgs e) { mov = false; } 

(elaborado: en el comentario 2)

Cambiar el tamaño de “Formulario” de todo lugar y moverlo >>> Código completo <<<<<

// Primero, la mayoría para agregar esta clase

  class ReSize { private bool Above, Right, Under, Left, Right_above, Right_under, Left_under, Left_above; int Thickness=6; //Thickness of border u can cheang it int Area = 8; //Thickness of Angle border ///  /// Constructor ///  /// set thickness of form border public ReSize(int thickness) { Thickness = thickness; } ///  /// Constructor set thickness of form border=1 ///  public ReSize() { Thickness = 10; } //Get Mouse Position public string getMosuePosition(Point mouse, Form form) { bool above_underArea = mouse.X > Area && mouse.X < form.ClientRectangle.Width - Area; /* |\AngleArea(Left_Above)\(=======above_underArea========)/AngleArea(Right_Above)/| */ //Area===>(==) bool right_left_Area = mouse.Y > Area && mouse.Y < form.ClientRectangle.Height - Area; bool _Above=mouse.Y <= Thickness; //Mouse in Above All Area bool _Right= mouse.X >= form.ClientRectangle.Width - Thickness; bool _Under=mouse.Y >= form.ClientRectangle.Height - Thickness; bool _Left=mouse.X <= Thickness; Above = _Above && (above_underArea); if (Above) return "a"; /*Mouse in Above All Area WithOut Angle Area */ Right = _Right && (right_left_Area); if (Right) return "r"; Under = _Under && (above_underArea); if (Under) return "u"; Left = _Left && (right_left_Area); if (Left) return "l"; Right_above =/*Right*/ (_Right && (!right_left_Area)) && /*Above*/ (_Above && (!above_underArea)); if (Right_above) return "ra"; /*if Mouse Right_above */ Right_under =/* Right*/((_Right) && (!right_left_Area)) && /*Under*/(_Under && (!above_underArea)); if (Right_under) return "ru"; //if Mouse Right_under Left_under = /*Left*/((_Left) && (!right_left_Area)) && /*Under*/ (_Under && (!above_underArea)); if (Left_under) return "lu"; //if Mouse Left_under Left_above = /*Left*/((_Left) && (!right_left_Area)) && /*Above*/(_Above && (!above_underArea)); if (Left_above) return "la"; //if Mouse Left_above return ""; } } 

Entonces forma cs

  public partial class FormGDI : Form { ReSize resize = new ReSize(); // ReSize Class "/\" To Help Resize Form  public FormGDI() { InitializeComponent(); this.SetStyle(ControlStyles.ResizeRedraw, true); } private const int cGrip = 16; // Grip size private const int cCaption = 32; // Caption bar height; protected override void OnPaint(PaintEventArgs e) { //this if you want to draw (if) Color theColor = Color.FromArgb(10, 20, 20, 20); theColor = Color.DarkBlue; int BORDER_SIZE = 4; ControlPaint.DrawBorder(e.Graphics, ClientRectangle, theColor, BORDER_SIZE, ButtonBorderStyle.Dashed, theColor, BORDER_SIZE, ButtonBorderStyle.Dashed, theColor, BORDER_SIZE, ButtonBorderStyle.Dashed, theColor, BORDER_SIZE, ButtonBorderStyle.Dashed); Rectangle rc = new Rectangle(this.ClientSize.Width - cGrip, this.ClientSize.Height - cGrip, cGrip, cGrip); ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc); rc = new Rectangle(0, 0, this.ClientSize.Width, cCaption); e.Graphics.FillRectangle(Brushes.DarkBlue, rc); base.OnPaint(e); } //set MinimumSize to Form public override Size MinimumSize { get { return base.MinimumSize; } set { base.MinimumSize = new Size(179, 51); } } // //override WndProc // protected override void WndProc(ref Message m) { //**************************************************************************** int x = (int)(m.LParam.ToInt64() & 0xFFFF); //get x mouse position int y = (int)((m.LParam.ToInt64() & 0xFFFF0000) >> 16); //get y mouse position you can gave (x,y) it from "MouseEventArgs" too Point pt = PointToClient(new Point(x, y)); if (m.Msg == 0x84) { switch (resize.getMosuePosition(pt, this)) { case "l": m.Result = (IntPtr)10; return; // the Mouse on Left Form case "r": m.Result = (IntPtr)11; return; // the Mouse on Right Form case "a": m.Result = (IntPtr)12; return; case "la": m.Result = (IntPtr)13; return; case "ra": m.Result = (IntPtr)14; return; case "u": m.Result = (IntPtr)15; return; case "lu": m.Result = (IntPtr)16; return; case "ru": m.Result = (IntPtr)17; return; // the Mouse on Right_Under Form case "": m.Result = pt.Y < 32 /*mouse on title Bar*/ ? (IntPtr)2 : (IntPtr)1; return; } } base.WndProc(ref m); } } 

Si quita el borde, también elimina la funcionalidad incorporada para cambiar el tamaño del marco. Hay formas de evitarlo, pero tendría que crear su propia funcionalidad para arrastrar y cambiar el tamaño del borde.