Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置较小的窗体宽度会产生意外的结果_C#_Forms - Fatal编程技术网

C# 设置较小的窗体宽度会产生意外的结果

C# 设置较小的窗体宽度会产生意外的结果,c#,forms,C#,Forms,我正在开发一个有时需要在桌面上显示小错误消息的应用程序。由于某种我还不能确定的原因,我无法创建一个宽度小于136px的窗口(但在任何更大的宽度下都可以正常工作) 我正在运行VS Community2019,v16.4.5;使用.NET Framework 4.8(.NET Framework 4.6.2具有相同的结果)。下面是一个小代码示例,它再现了我的问题: using System; using System.Windows.Forms; using System.Drawing; usin

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

我正在运行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*
宽度更改为请求的值,但随后以某种方式(??)更改为136px,但仅当请求的值小于136px时。 正如调试输出所显示的,SizeChanged事件针对不希望的大小执行了两次,但我看不出任何原因。
有人知道我最终会错过什么吗?

可能是在表单呈现初始化期间,有人将大小更改回所需的最小大小。(似乎没有考虑缺失的边界)。
但是,您可以简单地在表单加载事件处理程序中更改大小,然后新值将得到尊重

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

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

我不确定表单初始呈现过程中到底发生了什么,但是如果您在表单中设置了新的大小。Load event然后它将完全按照您的意愿保持不变,谢谢您--在表单中调整大小。Load event成功了;我现在正在我的“真实”代码中尝试这种解决方法。关于原因,请阅读此处的注释:@Jimi:因为FormBorderStyle是“无”,所以我们应该始终使用Form.Size与Form.ClientSize完全相同。我已经验证了Form.MinimumSize是{0;0}。不是吗?(我同意Steve的观点,我的好奇心并不是深入研究源代码的充分理由)(…)包括当前边框、标题和调整表单大小时应用的微妙内部填充(…)。微妙的明喻填充是围绕表单绘制的不可见边框。此大小由
SystemInformation.FrameBorderSize.Width*2*2
返回(请参阅该度量值与什么相关)
FrameBorderSize.Width*2
通常为
8
(可以不同)。也就是说,当你调整一个表单的大小时,它的边界就被这个尺度放大了。谢谢。只是出于好奇,我用VS19的标准视觉编辑器做了同样的小样本,结果显示表单宽度低于136px时也出现了同样意想不到的大小。添加负载事件也会执行相同的大小调整技巧。我现在很好,但我仍然想知道是什么导致了这种奇怪的(?)行为。我对创建类(new)和第一个有意义的事件(Load)之间发生的过程没有清楚的理解。有些东西改变了那里的大小。我们可以通过查看源代码来理解,但我发现,当您可以轻松避开这些复杂的问题时,它永远不值得花费时间