【发布时间】: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(可以不同)。即,当您调整表单的大小时,它的边界会被该度量膨胀。