2009-01-23 14 views

답변

7

비디오 장치에서이 질문에 대한 대답은 대개 정확하지 않습니다. 이것이 왜 그런지를 알아보기 위해 사용하는 가장 쉬운 예는 프로젝터입니다. 출력 해상도는 말하자면 1024x768이지만 DPI는 스크린이 프로젝터와 얼마나 멀리 떨어져 있는지에 따라 다릅니다. 예를 들어, WPF는 항상 비디오 장치에서 96 DPI를 가정합니다.

정확도에 관계없이 여전히 대답이 필요하고 그래픽 개체가없는 경우 일부 P/Invoke를 사용하여 화면에서 하나를 만들고 답변을 얻을 수 있습니다.

Single xDpi, yDpi; 

IntPtr dc = GetDC(IntPtr.Zero); 

using(Graphics g = Graphics.FromHdc(dc)) 
{ 
    xDpi = g.DpiX; 
    yDpi = g.DpiY; 
} 

if (ReleaseDC(IntPtr.Zero) != 0) 
{ 
    // GetLastError and handle... 
} 


[DllImport("user32.dll")] 
private static extern IntPtr GetDC(IntPtr hwnd);  
[DllImport("user32.dll")] 
private static extern Int32 ReleaseDC(IntPtr hwnd); 
+0

사용자가 무엇을 요구했는지에 따라 허용 된 대답이어야합니다. – epotter

6

실제적으로 DPI를 알지 못하면 실제 방법이 없습니다. 픽셀은 분리되어 있습니다. 인치는 아닙니다. DPI를 계산하려면 모니터에서 인치라고 말하면 해상도 (및 픽셀 종횡비)와 보이는 모니터 영역의 크기를 알아야합니다 (최소). . 일반적으로 해상도는 어딘가에 가져올 수 있습니다 (저는 C#이나 .NET 프로그래머가 아니기 때문에 거기서 도울 수는 없지만). 모니터의 크기는 일반적으로 사용할 수 없습니다. 추정이 좋다면 충분히 한 후 사용자가 DPI에 대한 모니터 (어떤 즉, 21 "이상)의 크기를 입력하고 해결할 수 있습니다

(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2 

주는

(당신은 대각선과 해상도를 알고 가정)

DPI = sqrt(resX^2+resY^2)/screenDiagonal 

모니터는 정확히 21 인치 (.. 또는 무엇이든) 결코 아니며 픽셀 종횡비는 거의 정확히 1 : 1입니다.

종이로 말하는 경우, 당연히 프린터의 DPI (또는 더 정확하게는 현재 프린터 설정)를 알아야합니다.

+0

그래서 Graphics 개체에 액세스 할 수 없다는 가정하에 DPI를 어떻게 계산합니까? – AngryHacker

+0

나머지를 알고 있다고 가정하고 DPI에 대한 방정식을 푸십시오. – falstro

+0

모니터의 대각선 길이는 어떻게 알 수 있습니까? 내 앱은 제어 할 수없는 컴퓨터에서 실행됩니다. – AngryHacker

1

this.CreateGraphics() (또는 더 일반적으로는 Control.CreateGraphics())을 호출하여 Graphics 객체를 만든 다음 알고있는 것처럼 DpiX 및 DpiY 속성을 사용할 수 있습니다. 그래픽 객체를 생성 한 후에는 그 객체를 처리해야합니다 (이상적으로는 Using 문 사용).

WinForms을 사용하고 있지 않다면 어떤 종류의 응용 프로그램인지 알려주십시오.

+0

할 수 없습니다. ActiveReports 보고서 시트의 코드 숨김 파일에 코드를 작성하고 있습니다. 이러한 속성은 없습니다. – AngryHacker

+0

그는 WinForms가 아닌 WPF를 사용하고 있다고 말했습니다. 이 둘을 함께 사용하면 심각한 두통을 유발할 수 있습니다. – mmr

+0

@ mmr : 아니요, 그는 WPF를 사용하고 있다고 말하지 않았습니다. 실제로 '그래픽'에 대한 참조는 WinForms를 강하게 의미하는 것으로 보입니다. 어쨌든 투표를 해 주셔서 감사합니다. – Noldorin