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を返します。

解説

このメッセージは、 _ モニターごとの _ _ dpi _ 対応アプリケーションあたりのプロセス 、または _ _ _ モニター _ 対応のスレッドごとの dpi 認識 にのみ関連します。 最上位のウィンドウまたはプロセスが dpi 非対応または システム DPI 対応 として実行されている場合、特定の dpi 変更で受信されることがありますが、そのような状況では無視しても安全です。 さまざまな種類の認識の詳細については、「 プロセス _ dpi _ 認識dpi _ 認識」を参照してください。 以前のバージョンの Windows では、アプリケーションのレベルで DPI 認識が必要でした。 これらのアプリは、 プロセス _ DPI _ 認識 を使用します。 現在、DPI 認識は、アプリケーション全体ではなく、スレッドと個々のウィンドウに関連付けられています。 これらのアプリは、 DPI _ 認識 を使用します。

アプリケーションをスケーリングするときは、X 軸と Y 軸の両方の値を使用する必要があります。これらは同じであるためです。

このメッセージを正しく処理するには、 lParamSetWindowPosを使用して提供される提案に基づいて、ウィンドウのサイズと位置を変更する必要があります。 この操作を行わないと、新しいモニター上の他のすべてに対して、ウィンドウが拡大または縮小します。 たとえば、ユーザーが複数のモニターを使用しており、ウィンドウを 96 DPI モニターから 192 DPI モニターにドラッグしている場合、そのウィンドウは、192 DPI モニターの他の項目に関して、半分のサイズで表示されます。

DPI の基本値は、96に設定されている ユーザーの _ 既定の画面の _ _ dpi として定義されます。 モニターのスケールファクターを決定するには、DPI 値を取得し、 ユーザーの _ 既定の _ 画面 _ 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 [ デスクトップアプリのみ]
ヘッダー
WinUser. h

関連項目

DPI _ 認識

プロセス _ DPI _ 認識