C# 禁用 WncProc 上的调整大小自定义控件
C# disable resize custom control on WncProc
对于 form1,当我按住左下角调整大小时,它被限制在 MinumumSize(300, 300)。
但是虽然设置了MinimumSize = new Size(50, 50),MyControl的Width和Height还是可以小于50。
你知道如何让 MyControl 像 Form 一样吗?提前致谢!
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
FormBorderStyle = FormBorderStyle.None;
MinimumSize = new Size(300, 300);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84) //WM_NCHITTEST
{
Point pos = new Point(m.LParam.ToInt32());
pos = this.PointToClient(pos);
if (pos.X >= this.ClientSize.Width - 6 && pos.Y >= this.ClientSize.Height - 6)
{
m.Result = (IntPtr)17;
return;
}
}
base.WndProc(ref m);
}
}
public class MyControl : Control
{
public MyControl()
{
MinimumSize = new Size(50, 50);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84) //WM_NCHITTEST
{
Point pos = new Point(m.LParam.ToInt32());
pos = this.PointToClient(pos);
if (pos.X >= this.ClientSize.Width - 6 && pos.Y >= this.ClientSize.Height - 6)
{
m.Result = (IntPtr)17;
return;
}
return;
}
base.WndProc(ref m);
}
}
哦,我找到了 WM_SIZING <0x214>,这是在调整大小之前发生的!
public struct _RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
public int Width { get => Right - Left; set => Right = value + Left; }
public int Height { get => Bottom - Top; set => Bottom = value + Top; }
public static _RECT FromPointer(IntPtr ptr)
{
return (_RECT)Marshal.PtrToStructure(ptr, typeof(_RECT));
}
public void ToPointer(IntPtr ptr)
{
Marshal.StructureToPtr(this, ptr, true);
}
}
public class MyControl : Control
{
public MyControl()
{
MinimumSize = new System.Drawing.Size(50, 50);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84) //WM_NCHITTEST
{
System.Drawing.Point pos = new System.Drawing.Point(m.LParam.ToInt32());
pos = this.PointToClient(pos);
if (pos.X >= this.ClientSize.Width - 6 && pos.Y >= this.ClientSize.Height - 6)
{
m.Result = (IntPtr)17;
return;
}
}
else if (m.Msg == 0x214) //WM_SIZING
{
_RECT rec = _RECT.FromPointer(m.LParam);
if (rec.Width < MinimumSize.Width)
rec.Width = MinimumSize.Width;
if (rec.Height < MinimumSize.Height)
rec.Height = MinimumSize.Height;
rec.ToPointer(m.LParam);
return;
}
base.WndProc(ref m);
}
}
对于 form1,当我按住左下角调整大小时,它被限制在 MinumumSize(300, 300)。 但是虽然设置了MinimumSize = new Size(50, 50),MyControl的Width和Height还是可以小于50。 你知道如何让 MyControl 像 Form 一样吗?提前致谢!
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
FormBorderStyle = FormBorderStyle.None;
MinimumSize = new Size(300, 300);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84) //WM_NCHITTEST
{
Point pos = new Point(m.LParam.ToInt32());
pos = this.PointToClient(pos);
if (pos.X >= this.ClientSize.Width - 6 && pos.Y >= this.ClientSize.Height - 6)
{
m.Result = (IntPtr)17;
return;
}
}
base.WndProc(ref m);
}
}
public class MyControl : Control
{
public MyControl()
{
MinimumSize = new Size(50, 50);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84) //WM_NCHITTEST
{
Point pos = new Point(m.LParam.ToInt32());
pos = this.PointToClient(pos);
if (pos.X >= this.ClientSize.Width - 6 && pos.Y >= this.ClientSize.Height - 6)
{
m.Result = (IntPtr)17;
return;
}
return;
}
base.WndProc(ref m);
}
}
哦,我找到了 WM_SIZING <0x214>,这是在调整大小之前发生的!
public struct _RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
public int Width { get => Right - Left; set => Right = value + Left; }
public int Height { get => Bottom - Top; set => Bottom = value + Top; }
public static _RECT FromPointer(IntPtr ptr)
{
return (_RECT)Marshal.PtrToStructure(ptr, typeof(_RECT));
}
public void ToPointer(IntPtr ptr)
{
Marshal.StructureToPtr(this, ptr, true);
}
}
public class MyControl : Control
{
public MyControl()
{
MinimumSize = new System.Drawing.Size(50, 50);
}
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x84) //WM_NCHITTEST
{
System.Drawing.Point pos = new System.Drawing.Point(m.LParam.ToInt32());
pos = this.PointToClient(pos);
if (pos.X >= this.ClientSize.Width - 6 && pos.Y >= this.ClientSize.Height - 6)
{
m.Result = (IntPtr)17;
return;
}
}
else if (m.Msg == 0x214) //WM_SIZING
{
_RECT rec = _RECT.FromPointer(m.LParam);
if (rec.Width < MinimumSize.Width)
rec.Width = MinimumSize.Width;
if (rec.Height < MinimumSize.Height)
rec.Height = MinimumSize.Height;
rec.ToPointer(m.LParam);
return;
}
base.WndProc(ref m);
}
}