调整大小时扭曲标签文本
Distorted label text when resizing
我有一个带有标签的动态 window。 window 是一个 HUD,根据其父级 window 改变大小。但是,其中一个标签在调整大小时会变形。
标签的字体会根据屏幕大小调整大小,如下所示:
float fontSize = this.Width / 128 /getScalingFactor();
缩放因子计算如下:
//Gets the scaling factor of the current dpi settings
protected float getScalingFactor()
{
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
int logpixelsy = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSY);
float screenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
float dpiScalingFactor = (float)logpixelsy / (float)96;
return dpiScalingFactor; // 1.25 = 125%
//return screenScalingFactor;
}
以及标签的设计者代码。有些标签也包含数字,并且它们使用相同的设置。但是,它们不会变形,但用户名标签会变形。
this.labelUsername.AutoSize = true;
this.tableLayoutPanel1.SetColumnSpan(this.labelUsername, 2);
this.labelUsername.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelUsername.ForeColor = System.Drawing.Color.White;
this.labelUsername.Location = new System.Drawing.Point(3, 0);
this.labelUsername.Name = "labelUsername";
this.labelUsername.Size = new System.Drawing.Size(56, 14);
this.labelUsername.TabIndex = 3;
this.labelUsername.Text = "Username";
this.labelUsername.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
我试过更改一些字体大小和缩放比例。我也尝试过更改设计器代码中的一些设置。不幸的是到目前为止没有成功。
也许有人认识到了这个问题并可以指出导致此问题的原因。我假设可能与标签和 window DPI 不匹配。但这并不能解释为什么数字没有遇到同样的问题。
首先澄清一下。我正在构建一个我不是 100% 熟悉的开源项目。
所以在仔细研究之后,我意识到还有另一个函数也可以控制 HUD 颜色。除非我也在那里为我的标签添加前景色,否则我得到的是看起来扭曲的文字。
我假设每次 window 调整大小时都会调用此方法,并且当我的标签没有更新颜色时,它会变成透明颜色。但是,由于前景色是在启动时设置的,因此它显示为透明文本周围的边框,因为它没有调整大小。
我有一个带有标签的动态 window。 window 是一个 HUD,根据其父级 window 改变大小。但是,其中一个标签在调整大小时会变形。
标签的字体会根据屏幕大小调整大小,如下所示:
float fontSize = this.Width / 128 /getScalingFactor();
缩放因子计算如下:
//Gets the scaling factor of the current dpi settings
protected float getScalingFactor()
{
Graphics g = Graphics.FromHwnd(IntPtr.Zero);
IntPtr desktop = g.GetHdc();
int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
int logpixelsy = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSY);
float screenScalingFactor = (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
float dpiScalingFactor = (float)logpixelsy / (float)96;
return dpiScalingFactor; // 1.25 = 125%
//return screenScalingFactor;
}
以及标签的设计者代码。有些标签也包含数字,并且它们使用相同的设置。但是,它们不会变形,但用户名标签会变形。
this.labelUsername.AutoSize = true;
this.tableLayoutPanel1.SetColumnSpan(this.labelUsername, 2);
this.labelUsername.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.labelUsername.ForeColor = System.Drawing.Color.White;
this.labelUsername.Location = new System.Drawing.Point(3, 0);
this.labelUsername.Name = "labelUsername";
this.labelUsername.Size = new System.Drawing.Size(56, 14);
this.labelUsername.TabIndex = 3;
this.labelUsername.Text = "Username";
this.labelUsername.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
我试过更改一些字体大小和缩放比例。我也尝试过更改设计器代码中的一些设置。不幸的是到目前为止没有成功。
也许有人认识到了这个问题并可以指出导致此问题的原因。我假设可能与标签和 window DPI 不匹配。但这并不能解释为什么数字没有遇到同样的问题。
首先澄清一下。我正在构建一个我不是 100% 熟悉的开源项目。
所以在仔细研究之后,我意识到还有另一个函数也可以控制 HUD 颜色。除非我也在那里为我的标签添加前景色,否则我得到的是看起来扭曲的文字。
我假设每次 window 调整大小时都会调用此方法,并且当我的标签没有更新颜色时,它会变成透明颜色。但是,由于前景色是在启动时设置的,因此它显示为透明文本周围的边框,因为它没有调整大小。