Search code examples
c#resizecustom-controlswndproc

C# disable resize custom control on WncProc


With form1, when i hold bottom-left to resize, it's is limit at MinumumSize(300, 300). But although set MinimumSize = new Size(50, 50), Width and Height of MyControl still can less than 50. Do you know how to make MyControl like Form? Thank in advance!

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

Solution

  • ohm, i found WM_SIZING <0x214>, which happened before resized!

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