如何使表单具有在调整大小时保留的固定纵横比?
我知道它可以通过覆盖OnSizeChanged
和手动修改 [new] 高度/宽度来完成,但这会导致闪烁,因为它在事件被调用之前被调整一次(大小与纵横比不匹配),然后再次调整大小(到正确的纵横比)。有没有更好的办法?
如何使表单具有在调整大小时保留的固定纵横比?
我知道它可以通过覆盖OnSizeChanged
和手动修改 [new] 高度/宽度来完成,但这会导致闪烁,因为它在事件被调用之前被调整一次(大小与纵横比不匹配),然后再次调整大小(到正确的纵横比)。有没有更好的办法?
一些代码可以帮助您入门。关键是响应 WM_SIZING 消息,它允许你改变窗口矩形。这个示例很粗略,你真的要注意用户正在拖动哪个角或边缘,可从 m.WParam 获得。用户界面永远不会很棒,当用户拖动角落时,您无法真正做任何合理的事情。使表单的布局足够灵活,以便您不关心纵横比是真正的解决方案。当内容不太适合时显示滚动条可以让用户自动做正确的事情。
using System.Runtime.InteropServices;
// etc..
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
protected override void WndProc(ref Message m) {
if (m.Msg == 0x216 || m.Msg == 0x214) { // WM_MOVING || WM_SIZING
// Keep the window square
RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT));
int w = rc.Right - rc.Left;
int h = rc.Bottom - rc.Top;
int z = w > h ? w : h;
rc.Bottom = rc.Top + z;
rc.Right = rc.Left + z;
Marshal.StructureToPtr(rc, m.LParam, false);
m.Result = (IntPtr)1;
return;
}
base.WndProc(ref m);
}
[StructLayout(LayoutKind.Sequential)]
public struct RECT {
public int Left;
public int Top;
public int Right;
public int Bottom;
}
}