2012-07-27 78 views
1

在我的C#winforms应用程序中,我使用Graphics对象来获取当前的DPI值,以使我的代码可以缩放某些组件。这工作得很好,除非我一旦调用CreateGraphics(),我的winforms应用程序的外观和感觉就会改变。风格从熟悉的“圆形”按钮到更古老的“锐边”按钮。为什么调用CreateGraphics()会改变我的表单的外观?

为什么会发生这种情况,我该怎么做才能防止它发生?

我的代码如下所示:

 Graphics g = this.CreateGraphics(); 
     try 
     { 
      if (g.DpiX == 120.0f) 
      { 
       // scale the components appropriately 
      } 
     } 
     finally 
     { 
      g.Dispose(); 
     } 

其实我可以通过调用的createGraphics,然后立即它处置重现该问题。

任何帮助或洞察力非常感谢!

另一个问题是:是否有无需要创建一个Graphics对象来获取DPI设置?

回答

0

前段时间,当一位同事开始使用高DPI显示器时,我正在处理DPI问题。

我的apporach是问桌面,而不是Dpi的特定窗口。当我遇到一些麻烦,我想出了这个代码(不漂亮,但对我来说相当奏效):

/// <summary> 
    /// Assesses the Systems Primary Monitor's DPI value 
    /// </summary> 
    public static double DPI { 
     get { 
      Graphics g = Graphics.FromHwnd(IntPtr.Zero); 
      IntPtr desktop = g.GetHdc(); 
      int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES); 
      int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES); 

      float ScreenScalingFactor = (float)PhysicalScreenHeight/(float)LogicalScreenHeight; 

      // dpi1 answers correctly if application is "dpiaware=false" 
      int dpi1 = (int)(96.0 * ScreenScalingFactor); 
      // dpi2 answers correctly if application is "dpiaware=true" 
      int dpi2 = GetDeviceCaps(desktop, (int)DeviceCap.LOGPIXELSX); 

      return Math.Max(dpi1, dpi2); 
     } 
    } 

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

    private enum DeviceCap { 
     VERTRES = 10, 
     DESKTOPVERTRES = 117, 
     LOGPIXELSX = 88, 

     // http://pinvoke.net/default.aspx/gdi32/GetDeviceCaps.html 
    } 

我特别不喜欢使用Math.Max(dpi1, dpi2)破解,但现在我发现没有解决方案更好

至于你原来的问题,在Win10上我看不到任何视觉上的变化。对不起,这里不知道。

相关问题