c# - 在 C# 中调整大小时保留表单纵横比

标签 c# winforms aspect-ratio

如何使表单具有在调整大小时保持不变的固定纵横比?

我知道这可以通过覆盖 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;
    }
}

关于c# - 在 C# 中调整大小时保留表单纵横比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391394/

相关文章:

jquery - 如何在fengyuanchen/cropper JS(裁剪头像)中更改宽高比

c# - 使用成员变量代替 C# 中的索引访问类数组的项

c# - 在 .NET 3.5 中使用 WCF DataContractJsonSerializer

android - 具有固定纵横比的 ConstraintLayout 链

c# - INotifyPropertyChanged - 更改 PropertyName 没有效果

c# - 从其事件处理程序访问控制

r - plotly 3d surface - 将立方体更改为矩形空间

c# - 如何将一个控件绑定(bind)到另一个?

c# - 创建 Linq XML 文档时为 "Non white space characters cannot be added to content"

C# 线程 - 父访问问题