在我的桌面上,我有一个默认的显示比例因子为100%。当我创建一个表单大小为400 x200的简单应用程序,并使用3个大小为75 x23的图片框时,它会按预期显示(图1)。
当我在显示比例因子为125%的笔记本电脑上运行该程序时,它没有按预期显示(图2)。
形状不成比例。它现在是530 x244,宽度是1.33x400,高度是1.22x200。
红色的图片框也不成比例,它是100 x28。水平尺寸为1.33x75,垂直尺寸为1.25x23。
绿色和蓝色图片框的大小是在代码中设置的。
public Form1()
{
InitializeComponent();
double factor = CreateGraphics().DpiX / 96f;
pictureBox2.Size = new Size((int)(75 * factor), (int)(23 * factor));
pictureBox3.Size = new Size(75, 23);
label1.Text = String.Format("Form:{0}-{1} DpiX:{2} DpiY:{3}",
this.Size.Width,
this.Size.Height,
CreateGraphics().DpiX,
CreateGraphics().DpiY
);
label2.Text = String.Format("{0}-{1}", pictureBox1.Size.Width, pictureBox1.Size.Height);
label3.Text = String.Format("{0}-{1}", pictureBox2.Size.Width, pictureBox2.Size.Height);
label4.Text = String.Format("{0}-{1}", pictureBox3.Size.Width, pictureBox3.Size.Height);
}
窗体和picturebox的初始大小是在InitializeComponent函数中确定的。
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.pictureBox2 = new System.Windows.Forms.PictureBox();
this.pictureBox3 = new System.Windows.Forms.PictureBox();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.label4 = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).BeginInit();
this.SuspendLayout();
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(35, 13);
this.label1.TabIndex = 0;
this.label1.Text = "label1";
//
// pictureBox1
//
this.pictureBox1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
this.pictureBox1.Location = new System.Drawing.Point(14, 32);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(75, 23);
this.pictureBox1.TabIndex = 8;
this.pictureBox1.TabStop = false;
//
// pictureBox2
//
this.pictureBox2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(192)))));
this.pictureBox2.Location = new System.Drawing.Point(14, 61);
this.pictureBox2.Name = "pictureBox2";
this.pictureBox2.Size = new System.Drawing.Size(75, 23);
this.pictureBox2.TabIndex = 11;
this.pictureBox2.TabStop = false;
//
// pictureBox3
//
this.pictureBox3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(192)))), ((int)(((byte)(255)))), ((int)(((byte)(255)))));
this.pictureBox3.Location = new System.Drawing.Point(14, 90);
this.pictureBox3.Name = "pictureBox3";
this.pictureBox3.Size = new System.Drawing.Size(75, 23);
this.pictureBox3.TabIndex = 15;
this.pictureBox3.TabStop = false;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(96, 41);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(35, 13);
this.label2.TabIndex = 16;
this.label2.Text = "label2";
//
// label3
//
this.label3.AutoSize = true;
this.label3.Location = new System.Drawing.Point(96, 71);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(35, 13);
this.label3.TabIndex = 17;
this.label3.Text = "label3";
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(96, 100);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(35, 13);
this.label4.TabIndex = 18;
this.label4.Text = "label4";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScroll = true;
this.ClientSize = new System.Drawing.Size(384, 162);
this.Controls.Add(this.label4);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.pictureBox3);
this.Controls.Add(this.pictureBox2);
this.Controls.Add(this.pictureBox1);
this.Controls.Add(this.label1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox3)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Label label1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.PictureBox pictureBox2;
private System.Windows.Forms.PictureBox pictureBox3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label4;
}
当缩放设置为100%时,DpiX将为96 f。当设置为125%时,DpiX将为120 f。绿色图片框使用缩放因子,大小为93 x28,正如预期的那样(75120/96=93和23120/96=28)。作为参考,蓝色图片框显示原始尺寸为75 x23。
谁能帮我解释一下为什么表格和红色图片框的比例超出了设计比例?如何解释因子1.33和1.22?
2条答案
按热度按时间lmyy7pcs1#
这是一个明智的选择。请注意AutoScaleMode属性的备选选项,您也可以选择AutoScaleMode.Dpi。这就是你希望发生的事情。
但它没有,您为Form和pictureBox1获得的自动缩放是基于AutoScaleMode.Font.什么是很难看到,但你可以注意到,如果你仔细看,是你没有得到相同的字体在第二个截图。默认设置是“Microsoft Sans Serif”,它在较新的Windows版本上已退役,您将获得替代品。应该是Segoe Windows中的部分机制,使旧的UI设计在较新的操作系统版本上看起来很新鲜。请注意它的平均字符宽度要高出很多。它补偿了这点,这就是为什么你得到了1.33而不是1.25
你可以选择AutoScaleMode.dpi,然后你会得到你喜欢的数字。但要冒着文本不再适合控件的风险。考虑使用两台机器上都可用的字体,如Tahoma,使其更具可预测性。
您得到1.22,因为窗体自动缩放其ClientSize属性,而不是Size。边框大小相同,因此整体大小增加小于1.25。如果用户修改主题以显示更大的标题文本和按钮,则会有更大的不同。只有ClientSize重要,它是确保窗口内容适合的重要属性。
请注意使用CreateGraphics(),它有太多的副作用。此方法只能通过首先创建本机窗口来工作。这会导致自动缩放生效,比正常情况下早得多。因此,您正在修改已经重新缩放的大小,从而大大增加了混乱。这里更安全的版本是
Graphics.FromHwnd(IntPtr.Zero)
,现在您可以使用原始的设计指标来修改大小,至少在Load事件触发之前是这样。brjng4g32#
我想我已经找到答案了。将窗体属性“AutoScaleMode”从“Font”更改为“DPI”就可以做到这一点。
编辑:注意汉斯的回答,DPI设置会有一些副作用。