Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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# 韩国PC上的错误缩放_C#_Winforms - Fatal编程技术网

C# 韩国PC上的错误缩放

C# 韩国PC上的错误缩放,c#,winforms,C#,Winforms,形势 我们正在向世界各地的客户销售Windows窗体应用程序。 我们在欧洲和美国的几个国家安装了它。没问题。 上周我们在韩国安装了我们的软件,发现了一个奇怪的行为 问题只发生在客户的办公电脑上,但在所有电脑上都会发生。 有些有Windows7ProfessionalK,有些有WindowsXP 客户购买了一台安装了Windows7 Ultimate的新电脑。 在这台电脑上,没有问题 功能 我们应用程序中的所有元素都是从提供特殊功能的“父用户控件”派生的。 这些功能之一是“自动调整大小和定位”。

形势

我们正在向世界各地的客户销售Windows窗体应用程序。 我们在欧洲和美国的几个国家安装了它。没问题。 上周我们在韩国安装了我们的软件,发现了一个奇怪的行为

问题只发生在客户的办公电脑上,但在所有电脑上都会发生。 有些有Windows7ProfessionalK,有些有WindowsXP

客户购买了一台安装了Windows7 Ultimate的新电脑。 在这台电脑上,没有问题

功能

我们应用程序中的所有元素都是从提供特殊功能的“父用户控件”派生的。 这些功能之一是“自动调整大小和定位”。 当父对象更改大小时,将调用所有子对象的此函数

当应用程序启动时,我们存储“ClientSize”:

每当应用程序的大小发生变化时,我们都会计算比例因子并引发一个事件:

void myFormSizeChanged(object sender, EventArgs e)
{
    this.m_xFactor = (float)this.ClientSize.Width / (float)this.m_actSize.Width;
    this.m_yFactor = (float)this.ClientSize.Height / (float)this.m_actSize.Height;
    if (this.m_MyOnResize != null)
        this.m_MyOnResize(this.m_xFactor, this.m_yFactor);
}
现在,订阅的每个子级都会执行自动调整大小和定位:

void MyParentUserControl_MyOnResize(float v_xFactor, float v_yFactor)

    {
        this.Location = new Point((int)(this.m_actLocation.X * v_xFactor), (int)(this.m_actLocation.Y * v_yFactor));
        this.Size = new Size((int)(this.m_actSize.Width * v_xFactor), (int)(this.m_actSize.Height * v_yFactor));
    }
问题

当我们的应用程序在韩国的客户PC上启动时,宽度大约为20%到更小。 这意味着,在右侧是一个区域,其中只有一个灰色背景。 高度约为10%至更高。 这意味着,位于应用程序底部的项目位于屏幕之外。

修复程序

首先,我们认为问题来自Windows DPI设置。 当我将笔记本电脑设置为125%时,它看起来很相似。 但是,客户的个人电脑都设置为100%

然后,我们考虑了屏幕分辨率。 都有不同的,有些和我的笔记本电脑一样

都有不同的grafic适配器

都有.NET4.5.1

解决问题的唯一办法是一个奇怪的办法:

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ScrollBar;
this.ClientSize = new System.Drawing.Size(1016, 734);
在“Designer”文件中,手动将ClientSize从(1016734)更改为大约(900800)。 这使它在大多数客户PC上看起来不错,但并非在所有PC上都如此

问题

这个问题的真正解决办法是什么?
它从何而来?

如果在每个包含控件上使用
AutoScaleMode.Dpi
AutoScaleMode.None
而不是
AutoScaleMode.Font
,那么在同一台计算机上是否存在相同的问题

如果这解决了您的问题,以下是我认为您的问题可能与使用
AutoScaleMode.Font

在较高的级别上,
AutoScaleMode.Font
的效果是控件将“相对于类使用的字体的尺寸进行缩放,,这通常是系统字体”(Emphasis mine)

我深入研究了一下源代码。方法
PerformAutoScale
在控件的
OnLayout
事件期间进行。如果
AutoScaleMode
设置为
Font
,则
GetFontAutoScaleDimensions
OnLayout
间接调用。解释如何实现
AutoScaleMode.Font

// We clone the Windows scaling function here as closely as
// possible.  They use textmetric for height, and textmetric
// for width of fixed width fonts.  For variable width fonts
// they use GetTextExtentPoint32 and pass in a long a-Z string.
// We must do the same here if our dialogs are to scale in a
// similar fashion.
因此,该方法获取一个“长”字符串,将其发送给GDI,并询问“该字符串的尺寸是多少?”值得注意的是,该方法考虑了控件的字体“通常是系统字体”

你知道韩语字母(韩语)吗?(直到我研究了这个答案,我才发现!)你的系统字体(比如Tahoe或Arial)与你在韩国的客户的字体不同,这是非常合理的。两种不同的字体将以不同的高度和宽度显示相同的字符串也是有意义的。因此,我敢打赌问题发生在系统字体与您的系统字体不同的工作站上

因此,如果您做了一些测试,发现
AutoScaleMode.Font
确实是罪魁祸首,那么您有几个选择:

  • 不要使用
    AutoScaleMode.Font

  • 显式设置所有包含控件的字体 明确地这将确保
    集装箱控制的字体
    不默认为计算机的系统字体

  • 无论你做什么,确保你所有的容器设置。混搭和搭配会让人头疼


    祝你好运

    一个很好的问题。很遗憾,我没有答案给你。这可能值得一看(韩国本地化的UI截断问题):@Steven,谢谢你的链接。当我试图修改Windows DPI而没有结果时,我认为这不是DPI问题。当我将安装了Windows7Ultimate的新PC设置为韩语(Windows、键盘、本地化)时,问题就没有出现。最后,我无法在我的工作场所(德国)重现这个问题。它只出现在韩国的客户电脑上(现在是晚上7点)。程序员以很难诊断的方式陷入dpiAware问题。您需要记住XP支持一个蹩脚的技巧,您可以在不更改DPI设置的情况下增加系统字体的大小。在东亚非常流行,阅读lowres屏幕上复杂的符号并不容易。你不能在你的开发机器上重新编程,这个技巧已经停止了。粗略的诊断是,您帮助太多了,Winforms已经补偿了增加的系统字体大小,您又在这样做了。@HansPassant谢谢您,hans,您是对的!没有必要进行内置扩展,因为我们是在父用户控件中进行的。感谢您的详细研究和回答。我将软件中的所有“AutoScaleMode.Font”修改为“AutoScaleMode.None”,无法识别任何负面视觉效果。因此,下一步将是在韩国进行测试。由于我必须等待一个时间段,客户的生产允许进行测试,因此可能需要几天时间才能知道它是否有效。我一知道就告诉你。好的,我刚在韩国在线测试过,效果非常好!!谢谢!!
    // We clone the Windows scaling function here as closely as
    // possible.  They use textmetric for height, and textmetric
    // for width of fixed width fonts.  For variable width fonts
    // they use GetTextExtentPoint32 and pass in a long a-Z string.
    // We must do the same here if our dialogs are to scale in a
    // similar fashion.