문제

C#으로 WPF에서 맵 컨트롤을 개발하고 있습니다. EG 2,000MX 1,000m의 맵 영역이 할당 된 캔버스 제어 EG 400 X 200을 사용하고 있습니다.

지도의 척도는 다음과 같습니다. canvas_size_in_meters / real_size_in_meters.

Canvas_size_in_meters를 찾고 싶습니다.

canvas.actualwidth는 DIU의 너비를 제공합니다 (장치 독립 단위). 400 DIU는 400/96 = 4,17 인치입니다. 제공물리적 인 내 모니터의 해상도는 96 DPI입니다.

그러나 통치자를 사용하여 모니터의 물리적 해상도는 87 DPI임을 알았습니다. (실제로 96 물리적 DPI를 가진 모니터는 거의 없습니다)

이 DPI 차이 (10%)는 화면의 실제 맵 제어 폭에서 +10% 차이를 해석합니다.

화면 해상도 및 DPI 설정에 관계없이 WPF 컨트롤의 크기를 인치 단위로 어떻게 측정합니까?

도움이 되었습니까?

해결책

화면 해상도 및 DPI 설정에 관계없이 WPF 컨트롤의 크기를 인치 단위로 어떻게 측정합니까?

WPF는 작동하기 위해서는 모니터의 해상도 (DPI 측면에서)를 알아야하기 때문에 실제로는 불가능합니다. 이론적으로는 멋지게 들리지만 실제로 Windows는이 정보를 모릅니다. 이것이 Windows 자체가 항상 96dpi를 맹목적으로 가정하는 이유입니다.

수동으로 말할 수있는 방법이 있거나 특정 모니터에 올바른 정보를 Windows에 전달하는 사용자 정의 드라이버가 있더라도 다른 사람의 컴퓨터에서는 작동하지 않으므로 Windows 에이 정보가 전달되지 않습니다. 모든 응용 프로그램에.

당신이 할 수있는 최선은 Google지도와 같은 규모를 그리는 것입니다. 당신은 그것을 알고 있습니다 픽셀 == 1 마일이므로지도에 50 픽셀 라인을 그릴 수 있습니다.

다른 팁

mm 또는 인치로 전류 픽셀 크기를 계산하는 방법이 있습니다. 이전 게시물에서 언급했듯이 고정 값이 아니며 현재 해상도 및 모니터 크기에 따라 다릅니다.

먼저 현재 해상도를 얻으십시오. 1280x1024라고 가정하십시오. 이제 GetDeviceCaps 함수를 사용하여 MM에서 모니터 너비를 얻습니다. 표준 Windows 라이브러리 기능입니다.

int widthmm = getDeviceCaps (deviceContext, horzsize); 내 모니터 너비는 362mm입니다

픽셀 크기 = 362/1280 = 0.282 mm

이 방법의 정확도는 디스플레이 영역이 모니터의 너비를 정확히 다루는 가정에 따라 다릅니다.

따라서 원래 질문에 대답하기 위해 모니터에 표시 될 때 400 x 200 픽셀의 캔버스 크기는 미터의 400 x 200 픽셀 (400 * 0.282/1000) x (200 * 0.282/1000)입니다.

신속한 답장을 보내 주셔서 감사합니다.

나는 완전히 동의하지만, 처음에는 그것을 믿고 싶지 않았습니다. 알다시피, 있어야합니다 근사치를 내다 맵 스케일 계산 맵이 맵 데이터의 다른 레이어를 표시하는 데 사용되는 경우 (스케일 종속). 대부분의 응용 프로그램은 "스케일"을 설정하기 위해 10 개의 개별 맵 레벨을 갖춘 예를 들어 슬라이더 컨트롤을 사용합니다.

절대 스케일을 갖는 것은 응용 프로그램에 중요하지 않으며 표시 1 : 15,000과 같은 척도.

추가 변수에는 절대 스케일이 필요합니다 MonitorPhysicalDPI (처음에는 96으로 설정) 사용이 변경되면 선택하면 약간 더 나은 스케일링을 제공 할 수 있습니다 (다시는 중요하지 않습니다). 맵 컨트롤의 크기는 다음과 같습니다.

map.actualwidth * (96/MonitorPhysicalDpi) * inchesperdiu, 인치 스퍼 디에는 1/96입니다

다시 이것은 화장품입니다. Windows가 실제 컨트롤의 크기를 알고 있다면 좋지 않습니까? (사용자는 OS 설정에서 화면 차원에 대한 정보를 제공하거나 모니터 INF 파일을 설치해야합니다)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top