4

我对标准数据驱动Winform应用程序有一个有趣的问题。Winform应用程序不同Win 7与Win 8

该应用程序最初是在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?

+2

更改视频适配器的点每英寸设置复制,要么机器上。控制面板+显示,在Win8上“更改所有项目的大小”。您需要确保您的表单可以正确自动缩放。 –

+0

我也注意到这个问题,主要是使用Win7的笔记本电脑,他们的Windows文本大小默认为125%。切换到100%似乎为我解决了这个问题。 –

回答

0

我有类似的问题。为了解决这个问题,我检查了当前的DPI设置,并在需要的地方水平和垂直缩放尺寸。这个辅助类给出了水平和垂直比例:HDpiScale,VDpiScale。

用法:

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

这使得差别只有当字体大小是×1.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, 
}