pesan WM_DPICHANGED

Dikirim ketika titik efektif per inci (dpi) untuk jendela telah berubah. DPI adalah faktor skala untuk jendela. Ada beberapa peristiwa yang dapat menyebabkan DPI berubah. Daftar berikut menunjukkan kemungkinan penyebab perubahan DPI.

  • Jendela dipindahkan ke monitor baru yang memiliki DPI yang berbeda.
  • DPI monitor yang menghosting jendela berubah.

DPI saat ini untuk jendela selalu sama dengan DPI terakhir yang dikirim oleh WM_DPICHANGED. Ini adalah faktor skala bahwa jendela harus menskalakan ke untuk utas yang mengetahui perubahan DPI.

#define WM_DPICHANGED       0x02E0

Parameter

wParam

HIWORD wParam berisi nilai sumbu Y dari dpi baru jendela. LOWORD wParam berisi nilai sumbu X dari DPI baru jendela. Misalnya, 96, 120, 144, atau 192. Nilai sumbu X dan sumbu Y identik untuk aplikasi Windows.

lParam

Penunjuk ke struktur RECT yang menyediakan ukuran dan posisi yang disarankan dari jendela saat ini yang diskalakan untuk DPI baru. Harapannya adalah bahwa aplikasi akan memposisikan ulang dan mengubah ukuran jendela berdasarkan saran yang diberikan oleh lParam saat menangani pesan ini.

Nilai hasil

Jika aplikasi memproses pesan ini, aplikasi harus mengembalikan nol.

Keterangan

Pesan ini hanya relevan untuk aplikasi PROCESS_PER_MONITOR_DPI_AWARE atau utas DPI_AWARENESS_PER_MONITOR_AWARE . Ini mungkin diterima pada perubahan DPI tertentu jika jendela atau proses tingkat atas Anda berjalan karena DPI tidak menyadari atau DPI sistem sadar, tetapi dalam situasi tersebut dapat diabaikan dengan aman. Untuk informasi selengkapnya tentang berbagai jenis kesadaran, lihat PROCESS_DPI_AWARENESS dan DPI_AWARENESS. Versi lama Kesadaran DPI yang diperlukan Windows untuk diikat pada tingkat aplikasi. Aplikasi tersebut menggunakan PROCESS_DPI_AWARENESS. Saat ini, kesadaran DPI terkait dengan utas dan jendela individual daripada seluruh aplikasi. Aplikasi ini menggunakan DPI_AWARENESS.

Anda hanya perlu menggunakan sumbu X atau nilai sumbu Y saat menskalakan aplikasi Anda karena keduanya sama.

Untuk menangani pesan ini dengan benar, Anda harus mengubah ukuran dan memposisikan ulang jendela Anda berdasarkan saran yang diberikan oleh lParam dan menggunakan SetWindowPos. Jika Anda tidak melakukan ini, jendela Anda akan tumbuh atau menyusut sehubungan dengan segala sesuatu yang lain pada monitor baru. Misalnya, jika pengguna menggunakan beberapa monitor dan menyeret jendela Anda dari monitor DPI 96 ke monitor DPI 192, jendela Anda akan tampak setengah besar sehubungan dengan item lain pada monitor DPI 192.

Nilai dasar DPI didefinisikan sebagai USER_DEFAULT_SCREEN_DPI yang diatur ke 96. Untuk menentukan faktor penskalaan untuk monitor, ambil nilai DPI dan bagi dengan USER_DEFAULT_SCREEN_DPI. Tabel berikut ini menyediakan beberapa contoh nilai DPI dan faktor penskalakan terkait.

Nilai DPI Persentase penskalakan
96 100%
120 125%
144 150%
192 200%

Contoh berikut menyediakan contoh penanganan perubahan 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;
    }

Kode berikut secara linier menskalakan nilai dari 100% (96 DPI) ke DPI arbitrer yang ditentukan oleh g_dpi.

    INT iBorderWidth100 = 5;
    iBorderWidth = MulDiv(iBorderWidth100, g_dpi, USER_DEFAULT_SCREEN_DPI);

Cara alternatif untuk menskalakan nilai adalah dengan mengonversi nilai DPI menjadi faktor skala dan menggunakannya.

    INT iBorderWidth100 = 5;
    FLOAT fscale = (float) g_dpi / USER_DEFAULT_SCREEN_DPI;
    iBorderWidth = iBorderWidth100 * fscale;

Persyaratan

Persyaratan Value
Klien minimum yang didukung
Windows 8.1 [hanya aplikasi desktop]
Server minimum yang didukung
Windows Server 2012 R2 [hanya aplikasi desktop]
Header
WinUser.h

Baca juga

DPI_AWARENESS

PROCESS_DPI_AWARENESS