gpt4 book ai didi

c# - 切换到 VS 2012,现在窗体不能正确调整大小?

转载 作者:太空狗 更新时间:2023-10-29 21:05:11 24 4
gpt4 key购买 nike

我昨天从 VS 2010 切换到 VS 2012,除此之外一切似乎都很顺利。

我的表单上有一个按钮,按下该按钮会扩展表单的宽度以显示其他控件。再次按下按钮,它会减小宽度以隐藏这些控件。现在,所有这些在 VS 2010 中运行良好,在 VS 2012 中调试时也运行良好,但一旦我发布或编译项目并打开 .exe,当您单击按钮时,它会像 5 一样增加宽度而不是100+ 它需要。我再次单击它,然后它会像它应该的那样将其更改为 372 并显示我的所有控件。我再次单击它以隐藏控件,它会部分隐藏控件(转到 188 + 神秘的 5)我希望所有这些都有意义,并且希望有更好的方法来运行我需要的过程。

这是我目前正在使用的代码,在从 2010 年切换到 2012 年期间我没有做任何更改。事实上,如果我在 2010 年打开相同的解决方案并发布,一切正常。

    private void button1_Click(object sender, EventArgs e)
{
if (this.Width == 188)
{
this.Width = 372;
this.Height = 540;
progressBar.Value = 100;
copied_status.Text = ("Output View Enabled");
}
else
{
progressBar.Value = 100;
copied_status.Text = ("Output View Disabled");
this.Width = 188;
this.Height = 540;
}

if (this.Width == 372)
{
button1.Text = "<<";
}
else
button1.Text = ">>";

}

最佳答案

您的表单宽度已经很久没有达到 188 像素了。现在有了 VS2012,Windows 终于不再撒谎了。

问题在于 Aero 中的宽窗口边框。在 Vista 中引入该功能时,它们是一个极端的应用程序兼容性问题。非常必要,因为这两个像素很难用鼠标点击。但是与应用程序创建窗口的方式完全不兼容。它要求特定的窗口大小、外部大小、CreateWindow() 函数的 nWidth 和 nHeight 参数。但真正重要的是客户区的大小,即边界内的窗口部分。如果 Microsoft 不采取措施解决这个问题,旧的应用程序最终会以一个太小的客户区告终。这看起来很糟糕,窗口内容不再适合。例如,表单底部或右侧的控件不会完全显示。

因此,Aero 偷偷摸摸地通过宽边框的额外宽度使窗口变大。当应用程序询问窗口大小时,它偷偷说它小了相同的增加宽度。该应用程序并不知道它仍然以与在 XP 上相同的窗口大小运行。这工作得很好,但并不完全理想。例如,很难让窗口边缘与那个谎言正确对齐。

Aero 是否会谎报窗口大小取决于 EXE header 中记录的目标操作系统。当它看到早于 6.00 的版本(Vista 版本号)时,它会假定您的 EXE 是不知道宽边框功能的遗留程序。所以需要被骗。您已经将目标版本号设置为 4.00 运行了很长时间,它是由 .NET 编译器在构建您的程序时编写的。您可以使用 dumpbin.exe/headers yourapp.exe 查看它。

这最终在 VS2012 和 .NET 4.5 中改变了。这是 .NET 版本,在 XP 中不可用。编译器最终可以硬性假设 XP 已成为历史,并且您将在支持 Aero 的 Windows 版本上运行。因此它将 EXE header 中的目标 Windows 版本设置为 6.00。相应地,Aero 现在将不再谎报窗口大小。您买到的是真货,不是假货。

因此,快速解决方法是将目标 .NET 框架版本更改为 4.0。这在 XP 上可用,所以你会再次被骗。

当然最好修复你的代码。永远不要使用 Size、Width 或 Height 属性,它们将不可避免地取决于边框和标题的大小。请改用 ClientSize 属性,这是一个稳定的属性,也是您真正关心的属性。但也要注意该属性,当表单在其视频适配器设置为每英寸 96 点以上的机器上运行时,它可能会重新缩放。在 Vista 及更高版本中非常容易访问的另一个功能。重新缩放会根据 DPI 设置按比例更改 ClientSize。

真正的解决方法是使用一个 bool 字段来代替跟踪窗口状态。并根据要隐藏或显示的控件的位置设置 ClientSize 属性。所以大致:

private bool enlarged;

private void button1_Click(object sender, EventArgs e)
{
enlarged = !enlarged;
int width = someControl.Left - 5;
if (enlarged) width = someControl.Right + 5;
this.ClientSize = new Size(width, this.ClientSize.Height);
}

将此代码中的 someControl 替换为您的控件名称。

关于c# - 切换到 VS 2012,现在窗体不能正确调整大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15982028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com