2017-09-28 4 views
0

직경이 3 인치 인 원 모양의 실제 개체가 있습니다. 내 응용 프로그램은이 원 모양을 화면에 표시하여 사용자가 원형 객체에서 응용 프로그램에 보이는 내용을 시각적으로 확인할 수 있도록합니다. 내가 가진 문제는 직경이 3 인치이고 모든 모니터 유형과 모든 해상도에서 같은 크기로 표시되는 원 객체가 필요하다는 것입니다.모든 해상도에서 동그라미 지름 WPF (해상도 독립성)

이것이 가능합니까? 나는 WPF를 사용하여 이미 이런 일을하고있다 :

예상대로
public class InchesToIndependentUnitsConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo cultureInfo) 
    { 
     int diameterDIU = 0; 
     if ((double)value > 0) 
     { 
      using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) 
      { 
       diameterDIU = (int)((g.DpiX/96) * value); 
      } 
     } 
     return diameterDIU; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo cultureInfo) 
    { 
     throw new NotImplementedException(); 
    } 

, 이것은 1920 x 1200 고해상도 말에 아주 잘 작동 : DIU 변환기

<Window.Resources> 
    <behaviors:InchesToIndependentUnitsConverter x:Key="InchesToDeviceIndependentUnits" /> 
</Window.Resources> 
... 
<Ellipse x:Name="MyCircle" Height="{Binding RelativeSource={RelativeSource Self}, Path=ActualWidth}" Width="{Binding CircleDiameter, Converter={StaticResource InchesToDeviceIndependentUnits}}" Margin="0,0,0,20" Fill="White" BorderBrush="Black" BorderThickness="1" VerticalAlignment="Top" HorizontalAlignment="Center"></Ellipse> 
... 

내 인치 이런 식으로 뭔가를 보이는 모니터하지만, 내가 더 낮아지기 시작하면 자연히 모든 것이 더 커 보인다. 나는 내 <Ellipse> 태그의 지름이 사람의 모니터가 어떤 해상도인지에 관계없이 항상 3 인치가 필요합니다.

감사합니다.

+0

저는 몇 년 동안이 기능을 사용하지 않았지만 기본적으로 WPF는 크기 단위로 인치를 지원한다고 생각합니다. 너비와 높이를'3in'으로 설정하면 어떻게됩니까? Windows DPI 설정이 모니터의 실제 해상도를 거의 반영하지 않기 때문에 거의 완벽하지는 않습니다. –

+0

WPF에 물리적 UOM이 있다는 것을 알지 못해서 귀하의 의견을 읽을 때 흥분했습니다. 나는 그것을 시험해 보았고 내 1920x1200 해상도 모니터에서 훌륭하게 작동했지만 불행히도 작은 해상도로 3 인치와 동등하지 않았다. –

+0

내가 말했듯이, 모니터가 오래 동안 96dpi를보고했기 때문에 실제 피치가 종종 120dpi에 가까울 때도 마찬가지입니다. 불행하게도 실제 픽셀 크기가 무엇인지 알 수있는 방법이 없습니다. 가까이 다가 갈 수는 있지만 정확하지는 않습니다. 슬픈 사태는 DPI 가치 Windows 보고서가 현실과 거의 유사하지 않은 경향이 있다는 것입니다. –

답변

1

나는 좋은 소식과 나쁜 소식이 있습니다.

좋은 소식은 기본적으로 WPF가 크기 단위로 인치를 지원한다는 것입니다. EllipseWidthHeight3in으로 설정하면 WPF의 최적 근사치를 얻을 수 있습니다.

나쁜 소식은 WPF가 Windows에서보고 한 DPI 설정에 따라 실제 픽셀을 실제 픽셀로 변환한다는 것입니다. 이는 종종 현실과 거의 유사하지 않습니다. 예를 들어, Windows는 오랫동안 내 구형 ThinkPad의 디스플레이가 96dpi의 피치를 가지고 있다고 믿었지만 실제로는 120dpi에 가깝습니다. 특히 모바일 화면은 픽셀 밀도를 과소 또는 과소보고하는 경향이 있습니다.

는 디스플레이의 물리적 크기를 반환하는 few unmanaged APIs 가능한 그 취지가 있으며, 이러한 더 신뢰할 수있는 반면, 나는 결과가 여전히 엉터리 될 것입니다 생각한다. 가장 유망한 것은 SetupAPI를 사용하여 레지스트리에서 디스플레이의 EDID 블록을 찾는 것 같습니다. 총에 맞을만한 가치가 있을지도 모릅니다. 충분히 신뢰할 만하다면 수평 및 수직 픽셀 수를보고 된 실제 치수로 나누고 필요한 미터 간 변환 (1 in = 2.54 cm)을 수행하여 유효 DPI를 수동으로 계산할 수 있습니다.