【问题标题】:Winform App different Win 7 versus Win 8Winform App 不同于 Win 7 与 Win 8
【发布时间】:2012-12-31 20:39:53
【问题描述】:

我在使用标准数据驱动的 Winform 应用程序时遇到了一个有趣的问题。

该应用程序最初是在 Windows 7 和 Visual Studio 2010 上开发的。然后我用 Windows 8 和 Visual Studio 2010 构建了一个新的开发机器。我发布了一个新版本的 Winform 应用程序,它是在 Windows 8 机器上构建的。没有源代码更改,相同的 .NET 4.0 框架目标。在 Windows 7 上运行 Winform 应用程序的客户端 PC 现在会遇到表单呈现问题。在 Windows 7 上,控件似乎有些变形,在视觉上改变了表单,在某些情况下,呈现功能被破坏(由于呈现问题,控件脱离屏幕)。

我已经升级到 VS2012,并以 .NET 4.5 为目标。同样的问题仍然存在。

我需要做些什么才能在 Windows 7 和 Windows 8 之间获得一致的表单呈现吗?

【问题讨论】:

  • 更改视频适配器的每英寸点数设置以在任一机器上重现该设置。控制面板+显示,Win8上的“更改所有项目的大小”。您需要确保您的表单正确地自动缩放。
  • 我也注意到了这个问题,主要是在装有 Win7 的笔记本电脑上,它们的 Windows 文本大小默认为 125%。将其切换为 100% 似乎解决了我的问题。

标签: winforms visual-studio-2010 windows-7 windows-8 visual-studio-2012


【解决方案1】:

我有类似的问题。为了修复它,我检查了当前的 DPI 设置并在需要的地方水平和垂直缩放尺寸。该帮助类提供水平和垂直比例:HDpiScale、VDpiScale。

用法:

MyControl.Height = (int) (MyControl.Height * util.VDpiScale);
MyControl.Width = (int) (MyControl.Width * util.HDpiScale);

只有字体大小为 x1.25 时才有意义

public class PresentationUtils : IPresentationUtils
{
    private double vDpiScale = -1;
    private double hDpiScale = -1;

    public double HDpiScale
    {
        get
        {
            if (hDpiScale < 0)
                SetDpiScales();
            return hDpiScale;
        }
    }

    public double VDpiScale
    {
        get
        {
            if (vDpiScale < 0)
                SetDpiScales();
            return vDpiScale;
        }
    }

    private void SetDpiScales()
    {
        vDpiScale = 1;
        hDpiScale = 1;

        IntPtr dc = GetDC(IntPtr.Zero);
        try
        {
            int hPixels = GetDeviceCaps(dc, (int) DeviceCap.LOGPIXELSX);
            int vPixels = GetDeviceCaps(dc, (int) DeviceCap.LOGPIXELSY);
            vDpiScale = vPixels/96.0;
            hDpiScale = hPixels/96.0;
        }
        finally
        {
            ReleaseDC(IntPtr.Zero, dc);
        }
    }

    [DllImport("gdi32.dll")]
    public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr GetDC(IntPtr hWnd);

    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool ReleaseDC(IntPtr hWnd, IntPtr hDC);
}

public enum DeviceCap
{
    /// <summary>
    ///     Logical pixels inch in X
    /// </summary>
    LOGPIXELSX = 88,

    /// <summary>
    ///     Logical pixels inch in Y
    /// </summary>
    LOGPIXELSY = 90,
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2018-11-18
    • 2013-09-09
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多