2012-07-27 2 views
1

내 C# winforms 응용 프로그램에서 그래픽 구성 요소를 사용하여 현재 구성 요소의 크기를 조정할 수 있도록 현재 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 문제에 대해 연구하고있었습니다.

내 주변 장치는 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에서 영상에는 변화가 없습니다. 죄송합니다, 여기에 아무 생각이 없습니다.

관련 문제