用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.Colorhttp://msdn.microsoft.com/en-us/library/system.drawing.color.aspx 枚举之一)。看起来不会完全一样,但会更接近。

【讨论】:

以上是关于用win7编写的winforms app在win xp上看起来不一样。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

vs2010在win10中打包winform程序,无法在win7上运行,win10正常运行。

C# winform 在win7 下界面出错

c# winform程序发布后运行时出现的一个问题

win7 下BCB调用 BCB编写的DLL

在win7系统下开发的C# winform项目 打包后 在windows2003系统下无法打开,总是爆出如图所示

c#winform打印窗体内容 win7下同下编译 xp系统显示问题