【问题标题】:Setting Small Form Width Has Unexpected Results设置小窗体宽度产生意外结果
【发布时间】:2020-02-28 07:47:14
【问题描述】:

我正在开发一个有时需要在桌面上显示小错误消息的应用程序。由于某种我还无法确定的原因,我无法创建一个宽度小于 136 像素的窗口(但对于任何更大的宽度都可以正常工作)。

我正在运行 VS Community2019,v16.4.5;使用 .NET Framework 4.8(.Net Framework 4.6.2 具有相同的结果)。这是一个重现我的问题的小代码示例:

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Diagnostics;

namespace TestWndSize
{
    public static class Program
    {
        public static Form MyForm1;
        public static int RqWidth = 120;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            MyForm1 = new Form();
            MyForm1.MouseEnter += MyForm1_MouseEnter;
            MyForm1.SizeChanged += MyForm1_SizeChanged;
            MyForm1.AutoSize = false;
            MyForm1.FormBorderStyle = FormBorderStyle.None;
            MyForm1.StartPosition = FormStartPosition.Manual;
            MyForm1.Location = new Point(1400, 100);
            Debug.WriteLine("---  Changing Width to " + RqWidth.ToString());
            MyForm1.Size = new Size(RqWidth, 100);
            Debug.WriteLine("---  Width should be now " + RqWidth.ToString()+"; is "+MyForm1.Width.ToString());
            MyForm1.BackColor = Color.LightBlue;

            Application.Run(MyForm1);
        }

        private static void MyForm1_SizeChanged(object sender, EventArgs e)
        {
            Debug.WriteLine("*** SizeChanged to Width=" + MyForm1.Width.ToString());
        }

        private static void MyForm1_MouseEnter(object sender, EventArgs e)
        {
            Debug.WriteLine("§§§  Current Width is " + MyForm1.Width.ToString());
        }
    }
}

调试输出是

*** SizeChanged to Width=300
---  Changing Width to 120
*** SizeChanged to Width=120
---  Width should be now 120; is 120
*** SizeChanged to Width=136        !!??!!
*** SizeChanged to Width=136        !!??!!
§§§  Current Width is 136       *Execution of MouseEnter*

宽度更改为请求的值,但随后以某种方式 (???) 更改为 136 像素,但前提是请求的值小于 136 像素。 由于调试输出显示 SizeChanged 事件针对不需要的大小执行了两次,但我看不出有任何原因。 有人知道我最终会错过什么吗?

【问题讨论】:

  • 我不确定表单初始渲染过程中究竟发生了什么,但是如果您在 Form.Load 事件中设置新大小,那么它会完全按照您的意愿保持
  • 是的,谢谢——在 Form.Load 事件中调整大小可以解决问题;我现在正在我的“真实”代码中尝试这种解决方法。
  • 关于为什么,请阅读此处的注释:Create Form.MinimumClientSize Property
  • @Jimi:由于 FormBorderStyle 为“无”,我们应该始终让 Form.Size 完全等于 Form.ClientSize。我已经验证了 Form.MinimumSize 是 {0;0}。不是这样吗? (我同意史蒂夫的观点,我的好奇心不足以成为深入研究源代码的充分理由)
  • (...)包括当前边框、标题和调整窗体大小时应用的细微内部填充(...)subtle 明喻填充是围绕表单绘制的不可见边框。此大小由SystemInformation.FrameBorderSize.Width * 2 * 2 返回(查看该度量与什么相关)。 FrameBorderSize.Width * 2 通常是 8(可以不同)。即,当您调整表单的大小时,它的边界会被该度量膨胀

标签: c# forms


【解决方案1】:

可能在表单呈现初始化期间,某些东西会将大小更改回所需的最小大小。 (似乎没有考虑缺少的边界)。
但是,您可以在 Form Load 事件处理程序中简单地更改您的大小,然后尊重新值

private static void MyForm1_Load(object sender, EventArgs e)
{
    Debug.WriteLine("*** FormLoad to Width=" + MyForm1.Width.ToString());
    MyForm1.Size = new Size(RqWidth, 100);
}

当然需要手动添加事件处理程序

【讨论】:

  • 嗨,史蒂夫,我在我的原始代码中试过了,它工作正常。谢谢。
  • 出于好奇,我用我的 VS19 的标准可视化编辑器做了同样的小样本,它显示了对于 136 像素以下的表单宽度同样出乎意料的大小。添加 Load 事件执行相同的大小调整技巧。我现在很好,但我仍然想知道是什么导致了这种奇怪的(?)行为。
  • 我对创建类(new)和第一个有意义的事件(Load)之间发生的过程没有清楚的了解。有些东西改变了那里的大小。我们可以查看源代码来理解,但是当您可以轻松回避这些复杂性时,我发现它不值得花费时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-06
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多