[英]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解決方案(我在您當前的代碼中看到IntPtr
、 NCHITTEST
等),您可以嘗試WM_GETMINMAXINFO消息。 首先,我們需要MINMAXINFO
和POINT
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.