调整大小时标签文本变形

时间:2019-09-01 15:52:40

标签: c# winforms text resize label

我有一个带有标签的动态窗口。该窗口是HUD,并根据其父窗口更改大小。但是,调整大小后,其中一个标签会变形。

Label bug

根据屏幕尺寸调整标签字体,如下所示:

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;

我尝试更改一些字体大小和缩放系数。我也尝试过更改设计器代码中的某些设置。不幸的是到目前为止没有成功。

也许有人意识到了这个问题,可以指出导致问题的原因。我假设标签和窗口DPI可能有些不匹配。但这并不能解释为什么数字没有出现相同的问题。

1 个答案:

答案 0 :(得分:0)

首先要澄清。我正在建立一个并非100%熟悉的开源项目。

因此,在仔细研究之后,我意识到还有另一个功能也可以控制HUD颜色。除非我也在那里在标签上添加了原色,否则我会看到扭曲的文字。

我假设每次调整窗口大小时都会调用此方法,并且当我的标签没有在那里的颜色更新时,它变为透明颜色。但是,由于原色是在启动时设置的,因为未调整大小,所以它在透明文本周围显示为边框。