활성 접근성 및 Windows Vista 화면 크기 조정

Windows Vista를 사용하면 화면의 대부분의 UI 요소가 더 크게 표시되도록 dpi(인치당 점 수) 설정을 변경할 수 있습니다. 이 기능은 오랫동안 Microsoft Windows에서 사용할 수 있었지만 이전 버전에서는 애플리케이션에서 크기 조정을 구현해야 했습니다. Windows Vista에서 데스크톱 창 관리자는 자체 크기 조정을 처리하지 않는 모든 애플리케이션에 대해 기본 크기 조정을 수행합니다. Microsoft Active Accessibility 클라이언트 애플리케이션은 이 기능을 고려해야 합니다.

Windows Vista에서 크기 조정

기본 dpi 설정은 96이며, 96픽셀이 1인치의 추상적 너비 또는 높이를 차지한다는 의미입니다. "인치"의 정확한 측정값은 모니터의 크기와 실제 해상도에 따라 달라집니다. 예를 들어, 12인치 너비의 모니터에서 1280픽셀의 수평 해상도의 경우 96픽셀의 가로줄은 1인치의 약 9/10입니다.

dpi 설정을 변경하는 것은 화면 해상도를 변경하는 것과 같지 않습니다. dpi 스케일링을 통해, 화면의 실제 픽셀 수는 동일하게 유지됩니다. 하지만 스케일링은 UI 요소의 크기와 위치에 적용됩니다. 크기를 조정하지 말라는 메시지가 명시적으로 표시되지 않는 데스크톱 및 애플리케이션에 대해서는 바탕 화면 창 관리자가 이 크기 조정을 자동으로 수행할 수 있습니다.

실제로, 사용자가 배율 인수를 120dpi로 설정하면 화면의 가로 또는 세로 인치가 25% 커집니다. 그에 따라 모든 치수가 적절하게 조정됩니다. 화면의 위쪽 및 왼쪽 가장자리에서 창 오프셋이 25% 증가합니다. 창의 크기는 포함된 모든 UI 요소의 오프셋 및 크기와 함께 동일한 비율로 증가합니다.

기본적으로 DWM은 사용자가 dpi를 120으로 설정하면 비 dpi 인식 애플리케이션에 대해 크기 조정을 수행하지 않지만 dpi가 144 이상의 사용자 지정 값으로 설정되면 크기 조정을 수행합니다. 그러나 사용자는 기본 동작을 재정의할 수 있습니다.

화면 크기 조정 어떤 방식으로든 화면 좌표와 관련된 애플리케이션에 대한 새로운 문제를 만듭니다. 이제 화면에는 물리적 좌표와 논리적 좌표 두 개가 포함됩니다. 점의 물리적 좌표는 원점의 왼쪽 상단에서의 픽셀 단위의 실제 오프셋입니다. 논리적 좌표는 픽셀 자체의 크기가 조정된 경우 발생되는 오프셋입니다.

좌표 (100, 48)에서 단추가 있는 대화 상자를 설계한다고 가정해 보세요. 이 대화 상자가 기본 96dpi에서 표시되면 단추는 물리적 좌표 (100, 48)에 위치합니다. 120dpi에서 표시되면 단추는 물리적 좌표 (125, 60)에 위치합니다. 하지만 논리적 좌표는 모든 dpi 설정에서 (100, 48)로 동일합니다.

논리적 좌표는 dpi 설정과 관계없이 운영 체제와 애플리케이션의 동작을 일관적으로 유지하기 때문에 중요합니다. 예를 들어 System.Windows.Forms.Cursor.Position 은 일반적으로 논리 좌표를 반환합니다. 대화 상자에서 요소 위에 커서를 놓으면 dpi 설정과 관계 없이 동일한 좌표가 반환됩니다. 좌표 (100, 100)에서 컨트롤을 그리면 논리적 좌표로 그려지고 모든 dpi 설정에서 동일한 상대적 위치를 차지합니다.

활성 접근성 클라이언트에서 크기 조정

Microsoft Active Accessibility는 논리 좌표를 사용하지 않습니다. 다음 메서드와 함수는 물리적 좌표를 반환하거나 매개 변수로 사용합니다.

기본적으로 96dpi가 아닌 환경에서 실행되는 Microsoft Active Accessibility 클라이언트 애플리케이션은 이러한 호출에서 올바른 결과를 얻을 수 없습니다. 예를 들어 커서 위치가 논리적 좌표에 있으므로 클라이언트는 이러한 좌표를 AccessibleObjectFromPoint 에 전달하여 커서 아래에 있는 요소를 가져올 수 없습니다.

또한 포커스가 있는 UI 요소를 강조 표시하는 접근성 애플리케이션과 같이 클라이언트 영역 외부에 창을 만드는 애플리케이션은 창이 IAccessible::accLocation에서 반환된 물리적 좌표가 아닌 논리 좌표에 배치되므로 올바른 화면 위치에 창을 만들지 않습니다.

솔루션은 다음 두 부분으로 구성됩니다.

  • 클라이언트 애플리케이션을 "dpi 인식"으로 만듭니다. 이렇게 하려면 시작 시 SetProcessDPIAware 함수를 호출합니다. 이 함수를 사용하면 전체 프로세스 dpi가 인식되므로 프로세스에 속하는 모든 창이 실제 크기로 유지됩니다.
  • dpi를 인식하는 함수를 사용합니다. 예를 들어 커서 좌표를 얻으려면 GetPhysicalCursorPos 함수를 호출합니다 . GetCursorPos를 사용하지 마세요. dpi 인식 애플리케이션의 동작은 정의되지 않았습니다.

애플리케이션이 비 dpi 인식 애플리케이션과 직접 프로세스 간 통신을 수행하는 경우 PhysicalToLogicalPoint 및LogicalToPhysicalPoint 함수를 사용하여 논리 좌표와 물리적 좌표 간에 변환했을 수 있습니다.