用win7编写的winforms app在win xp上看起来不一样。为啥?
Posted
技术标签:
【中文标题】用win7编写的winforms app在win xp上看起来不一样。为啥?【英文标题】:winforms app written in win7 looks different on win xp. why?用win7编写的winforms app在win xp上看起来不一样。为什么? 【发布时间】:2011-07-18 21:43:33 【问题描述】:我在 win 7 上用 winforms (.net 4.0) 编写了一个简单的应用程序。应用程序看起来是我想要的,但是当我在 windows xp 上尝试时,一切看起来都不同。
我创建了一个示例来展示它在 win 7 和 xp 上的外观。 我该怎么做才能在两个系统上拥有相同的外观? 问题不仅在于背景和字体颜色,还在于控件。在这里,我展示了 numericupdown 的外观,但表格布局也有问题。
private void InitializeComponent()
this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
this.groupBox1 = new System.Windows.Forms.GroupBox();
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
this.SuspendLayout();
//
// numericUpDown1
//
this.numericUpDown1.DecimalPlaces = 2;
this.numericUpDown1.Increment = new decimal(new int[]
1,
0,
0,
131072);
this.numericUpDown1.Location = new System.Drawing.Point(21, 26);
this.numericUpDown1.Maximum = new decimal(new int[]
1,
0,
0,
0);
this.numericUpDown1.Name = "numericUpDown1";
this.numericUpDown1.Size = new System.Drawing.Size(54, 22);
this.numericUpDown1.TabIndex = 0;
//
// groupBox1
//
this.groupBox1.Location = new System.Drawing.Point(21, 82);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(226, 99);
this.groupBox1.TabIndex = 1;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "groupBox1";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ActiveCaption;
this.ClientSize = new System.Drawing.Size(407, 331);
this.Controls.Add(this.groupBox1);
this.Controls.Add(this.numericUpDown1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
this.ResumeLayout(false);
我没有修改过 xp 颜色主题。 我在两台装有 win xp 的不同计算机上得到了相同的结果。
【问题讨论】:
截图很糟糕,无法调试代码。复制并粘贴 InitializeComponent() 的代码。并记录是否在 XP 上修改了 Windows 主题颜色。 【参考方案1】: this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.SystemColors.ActiveCaption;
这些是给您带来麻烦的陈述。我会先选择简单的,不要让表单的BackColor与标题颜色相同。如果要选择主题颜色,则只需选择“控制”颜色。尽管您通常会将旧战舰变成灰色。选择中性柔和的颜色是您最好的选择,但尊重用户的偏好绝不会给您带来麻烦。
AutoScaleDimensions 属性是根据视频适配器的 DPI 设置自动生成的。这与XP机器不同。您的开发机器上每英寸点数为 120,XP 上为 96 DPI(默认值)。在 Win7 上,这是由看起来像标尺的小部件设置的,控制面板 + 显示,“设置自定义文本大小 (DPI)”。
AutoScaleMode 属性正确设置为字体。这可确保所有控件都自动缩放以适应字体大小。由于更高的 DPI 设置,在您的 Win7 机器上更大。因此,窗体及其控件在 XP 机器上缩小。 NumericUpDown 控件的问题在于它有点错误(不止一种方式),它不能正确缩放向上/向下字形。它们按比例太大,没有为文本部分留下足够的空间。简单地扩大一点就可以解决问题。
自动缩放相当难看,它很少是 100% 完美的。最好的办法是将您的开发机器切换到 96 dpi。一个非常常见的环境,今天仍然如此。放大几乎总是比缩小效果更好。
【讨论】:
【参考方案2】:this.BackColor = System.Drawing.SystemColors.ActiveCaption;
你的问题。颜色将取决于操作系统。 http://msdn.microsoft.com/en-us/library/system.drawing.systemcolors.activecaption.aspx
考虑改为设置一个显式颜色值(例如,System.Drawing.Color
http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx 枚举之一)。看起来不会完全一样,但会更接近。
【讨论】:
以上是关于用win7编写的winforms app在win xp上看起来不一样。为啥?的主要内容,如果未能解决你的问题,请参考以下文章
vs2010在win10中打包winform程序,无法在win7上运行,win10正常运行。