簡體   English   中英

如何在調整大小時將默認值設置為表單的最小尺寸?

[英]How do I set default to the minimum size my form on resize?

對不起,因為我的英語很糟糕!

我使用WM_SIZE消息調整表單大小,如何設置表單的最小大小 我希望表單的最小尺寸200x100這是我的代碼:

protected override void WndProc(ref Message m)
    {
        const int RESIZE_HANDLE_SIZE = 10;

        switch (m.Msg)
        {
            case 0x0084/*NCHITTEST*/ :
                base.WndProc(ref m);

                if ((int)m.Result == 0x01/*HTCLIENT*/)
                {
                    Point screenPoint = new Point(m.LParam.ToInt32());
                    Point clientPoint = this.PointToClient(screenPoint);
                    if (clientPoint.Y <= RESIZE_HANDLE_SIZE)
                    {
                        if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                            m.Result = (IntPtr)13/*HTTOPLEFT*/ ;
                        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                            m.Result = (IntPtr)12/*HTTOP*/ ;
                        else
                            m.Result = (IntPtr)14/*HTTOPRIGHT*/ ;
                    }
                    else if (clientPoint.Y <= (Size.Height - RESIZE_HANDLE_SIZE))
                    {
                        if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                            m.Result = (IntPtr)10/*HTLEFT*/ ;
                        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                            m.Result = (IntPtr)2/*HTCAPTION*/ ;
                        else
                            m.Result = (IntPtr)11/*HTRIGHT*/ ;
                    }
                    else
                    {
                        if (clientPoint.X <= RESIZE_HANDLE_SIZE)
                            m.Result = (IntPtr)16/*HTBOTTOMLEFT*/ ;
                        else if (clientPoint.X < (Size.Width - RESIZE_HANDLE_SIZE))
                            m.Result = (IntPtr)15/*HTBOTTOM*/ ;
                        else
                            m.Result = (IntPtr)17/*HTBOTTOMRIGHT*/ ;
                    }
                }
                return;
        }
        base.WndProc(ref m);
    }

如果您想要pInvoke解決方案(我在您當前的代碼中看到IntPtrNCHITTEST等),您可以嘗試WM_GETMINMAXINFO消息。 首先,我們需要MINMAXINFOPOINT struct s:

  using System.Runtime.InteropServices;

  ...

  [StructLayout(LayoutKind.Sequential)]
  internal struct POINT {
    public int X;
    public int Y;

    public POINT(int x, int y) {
      X = x;
      Y = y;
    }
  }

  [StructLayout(LayoutKind.Sequential)]
  internal struct MINMAXINFO {
    public POINT ptReserved;
    public POINT ptMaxSize;
    public POINT ptMaxPosition;
    public POINT ptMinTrackSize;
    public POINT ptMaxTrackSize;
  }   

然后

protected override void WndProc(ref Message m) {
  ... 

  switch (m.Msg) {
    ...
    case 0x0024: { // WM_GETMINMAXINFO 
      MINMAXINFO info = Marshal.PtrToStructure<MINMAXINFO>(m.LParam);

      info.ptMinTrackSize = new POINT(
        Math.Max(200, info.ptMinTrackSize.X),  // smallest X (width)
        Math.Max(100, info.ptMinTrackSize.Y)); // smallest Y (height)

      Marshal.StructureToPtr(info, m.LParam, true);

      break;
    }
    ...
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM