メッセージのWM_DPICHANGED

ウィンドウの有効ドット/インチ (dpi) が変更されたときに送信されます。 DPI は、ウィンドウのスケール ファクターです。 DPI が変更される可能性がある複数のイベントがあります。 DPI の変更の考えられる原因を次の一覧に示します。

  • ウィンドウは、別の DPI を持つ新しいモニターに移動されます。
  • ウィンドウをホストしているモニターの DPI が変更されます。

ウィンドウの現在の DPI は、常に WM_DPICHANGEDによって送信された最後の DPI と等しくなります。 これは、DPI の変更を認識しているスレッドに対してウィンドウをスケーリングする必要があるスケール ファクターです。

#define WM_DPICHANGED       0x02E0

パラメーター

wParam

wParamHIWORD には、ウィンドウの新しい dpi の Y 軸の値が含まれています。 wParamLOWORD には、ウィンドウの新しい 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_AWARENESSDPI_AWARENESS」を参照してください。 以前のバージョンのWindowsでは、DPI 認識をアプリケーションのレベルで関連付ける必要があります。 これらのアプリは PROCESS_DPI_AWARENESSを使用します。 現在、DPI 認識は、アプリケーション全体ではなく、スレッドと個々のウィンドウに関連付けられています。 これらのアプリでは 、DPI_AWARENESSが使用されます。

X 軸または Y 軸の値は同じであるため、アプリケーションのスケーリング時にのみ使用する必要があります。

このメッセージを正しく処理するには、 lParamSetWindowPos を使用して提供される提案に基づいて、ウィンドウのサイズを変更し、位置を変更する必要があります。 これを行わないと、新しいモニター上の他のすべてに関してウィンドウが拡大または縮小されます。 たとえば、ユーザーが複数のモニターを使用していて、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% (96 DPI) から 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 [デスクトップ アプリのみ]
Header
WinUser.h

こちらもご覧ください

DPI_AWARENESS

PROCESS_DPI_AWARENESS