winforms 显示窗体和控件的缩放比例和大小

yqhsw0fo  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(241)

在我的桌面上,我有一个默认的显示比例因子为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?

lmyy7pcs

lmyy7pcs1#

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

这是一个明智的选择。请注意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事件触发之前是这样。

brjng4g3

brjng4g32#

我想我已经找到答案了。将窗体属性“AutoScaleMode”从“Font”更改为“DPI”就可以做到这一点。
编辑:注意汉斯的回答,DPI设置会有一些副作用。

相关问题