繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM