如何移动和调整没有边框的表单?

有没有人知道如何在没有边框的情况下调整winform的大小。 我不想要Windows的默认边框,所以我将属性“FormBorderStyle”更改为“None”。 这删除了边框,虽然现在无法resize。 我已经弄清楚如何移动表单,我只需要知道如何调整它。

一些允许移动和调整表单大小的示例代码:

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); } } 

以下是自定义表单的完整示例,其中包含所有8个resize的点:

 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; } }} 

“Sizer”是右下角的浅蓝色面板,在此处输入图像描述

  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; } 

看看这里:

调整右下角的无边框窗口大小

(详细说明:评论2)

从所有地方调整“表格”并移动>>>完整代码<<<<<

//首先,你要添加这个类

  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 ""; } } 

然后表格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); } } 

如果删除边框,还会删除内置function以调整框架大小。 有办法绕过它,但你必须建立自己的function来拖动和调整边框的大小。