WM_DPICHANGED 메시지
창의 유효 dpi(인치당 점)가 변경된 경우 전송됩니다. DPI는 창의 배율 인수입니다. DPI가 변경될 수 있는 여러 이벤트가 있습니다. 다음 목록은 DPI 변경의 가능한 원인을 나타냅니다.
- 창이 다른 DPI가 있는 새 모니터로 이동됩니다.
- 창을 호스팅하는 모니터의 DPI가 변경됩니다.
창의 현재 DPI는 항상 WM_DPICHANGED 보낸 마지막 DPI와 같습니다. 이는 DPI 변경 내용을 알고 있는 스레드에 대해 창의 크기를 조정해야 하는 배율 인수입니다.
#define WM_DPICHANGED 0x02E0
매개 변수
-
wParam
-
wParam의 HIWORD에는 창의 새 dpi의 Y축 값이 포함됩니다. wParam의 LOWORD에는 창의 새 DPI의 X축 값이 포함됩니다. 예를 들어 96, 120, 144 또는 192입니다. X축과 Y축의 값은 Windows 앱에서 동일합니다.
-
lParam
-
새 DPI에 대해 크기가 조정된 현재 창의 제안된 크기와 위치를 제공하는 RECT 구조체에 대한 포인터입니다. 앱은 이 메시지를 처리할 때 lParam에서 제공하는 제안에 따라 창의 위치를 변경하고 크기를 조정합니다.
반환 값
애플리케이션이 이 메시지를 처리하면 0을 반환해야 합니다.
설명
이 메시지는 PROCESS_PER_MONITOR_DPI_AWARE 애플리케이션 또는 DPI_AWARENESS_PER_MONITOR_AWARE 스레드에만 관련됩니다. 최상위 창 또는 프로세스가 DPI를 인식하지 못하거나 시스템 DPI 인식으로 실행되는 경우 특정 DPI 변경 내용에서 수신될 수 있지만 이러한 상황에서는 무시해도 됩니다. 다양한 유형의 인식에 대한 자세한 내용은 PROCESS_DPI_AWARENESS 및 DPI_AWARENESS 참조하세요. 이전 버전의 Windows에서는 애플리케이션 수준에서 DPI 인식을 연결해야 했습니다. 이러한 앱은 PROCESS_DPI_AWARENESS 사용합니다. 현재 DPI 인식은 전체 애플리케이션이 아닌 스레드 및 개별 창에 연결됩니다. 이러한 앱은 DPI_AWARENESS 사용합니다.
애플리케이션의 크기가 동일하므로 X축 또는 Y축 값만 사용해야 합니다.
이 메시지를 올바르게 처리하려면 lParam에서 제공하고 SetWindowPos를 사용하여 제공한 제안에 따라 창의 크기를 조정하고 위치를 변경해야 합니다. 이 작업을 수행하지 않으면 새 모니터의 다른 모든 항목과 관련하여 창이 커지거나 축소됩니다. 예를 들어 사용자가 여러 모니터를 사용하고 96 DPI 모니터에서 192 DPI 모니터로 창을 끌면 192 DPI 모니터의 다른 항목과 관련하여 창이 절반으로 커집니다.
DPI의 기본 값은 96으로 설정된 USER_DEFAULT_SCREEN_DPI 정의됩니다. 모니터의 배율 인수를 확인하려면 DPI 값을 가져와서 USER_DEFAULT_SCREEN_DPI 나눕니다. 다음 표에서는 몇 가지 샘플 DPI 값 및 관련 배율 인수를 제공합니다.
DPI 값 | 비율 |
---|---|
96 | 100% |
120 | 125% |
144 | 150% |
192 | 200% |
다음 예제에서는 샘플 DPI 변경 처리기를 제공합니다.
case WM_DPICHANGED:
{
g_dpi = HIWORD(wParam);
UpdateDpiDependentFontsAndResources();
RECT* const prcNewWindow = (RECT*)lParam;
SetWindowPos(hWnd,
NULL,
prcNewWindow ->left,
prcNewWindow ->top,
prcNewWindow->right - prcNewWindow->left,
prcNewWindow->bottom - prcNewWindow->top,
SWP_NOZORDER | SWP_NOACTIVATE);
break;
}
다음 코드는 100%(96DPI)에서 g_dpi 정의된 임의 DPI로 값을 선형적으로 확장합니다.
INT iBorderWidth100 = 5;
iBorderWidth = MulDiv(iBorderWidth100, g_dpi, USER_DEFAULT_SCREEN_DPI);
값을 스케일링하는 또 다른 방법은 DPI 값을 배율 인수로 변환하고 사용하는 것입니다.
INT iBorderWidth100 = 5;
FLOAT fscale = (float) g_dpi / USER_DEFAULT_SCREEN_DPI;
iBorderWidth = iBorderWidth100 * fscale;
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 |
Windows 8.1 [데스크톱 앱만 해당] |
지원되는 최소 서버 |
Windows Server 2012 R2 [데스크톱 앱만 해당] |
헤더 |
|