Bagikan melalui


Menulis Prosedur Jendela

Fungsi DispatchMessage memanggil prosedur jendela jendela yang merupakan target pesan. Prosedur jendela memiliki tanda tangan berikut.

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

Ada empat parameter:

  • hwnd adalah handel ke jendela.
  • uMsg adalah kode pesan; misalnya, pesan WM_SIZE menunjukkan jendela diubah ukurannya.
  • wParam dan lParam berisi data tambahan yang berkaitan dengan pesan. Arti yang tepat tergantung pada kode pesan.

LRESULT adalah nilai bilangan bulat yang dikembalikan program Anda ke Windows. Ini berisi respons program Anda terhadap pesan tertentu. Arti dari nilai ini tergantung pada kode pesan. CALLBACK adalah konvensi panggilan untuk fungsi tersebut.

Prosedur jendela umum hanyalah pernyataan pengalihan besar yang beralih pada kode pesan. Tambahkan kasus untuk setiap pesan yang ingin Anda tangani.

switch (uMsg)
{
    case WM_SIZE: // Handle window resizing

    // etc
}

Data tambahan untuk pesan terkandung dalam parameter lParam dan wParam . Kedua parameter adalah nilai bilangan bulat ukuran lebar pointer (32 bit atau 64 bit). Arti masing-masing tergantung pada kode pesan (uMsg). Untuk setiap pesan, Anda harus mencari kode pesan dan melemparkan parameter ke jenis data yang benar. Biasanya data adalah nilai numerik atau penunjuk ke struktur. Beberapa pesan tidak memiliki data apa pun.

Misalnya, dokumentasi untuk pesan WM_SIZE menyatakan bahwa:

  • wParam adalah bendera yang menunjukkan apakah jendela diminimalkan, dimaksimalkan, atau diubah ukurannya.
  • lParam berisi lebar dan tinggi jendela baru sebagai nilai 16-bit yang dikemas ke dalam satu angka 32- atau 64-bit. Anda harus melakukan beberapa pergeseran bit untuk mendapatkan nilai-nilai ini. Untungnya, file header WinDef.h menyertakan makro pembantu yang melakukan ini.

Prosedur jendela yang khas menangani puluhan pesan, sehingga dapat tumbuh cukup panjang. Salah satu cara untuk membuat kode Anda lebih modular adalah dengan menempatkan logika untuk menangani setiap pesan dalam fungsi terpisah. Dalam prosedur jendela, transmisikan parameter wParam dan lParam ke jenis data yang benar, dan teruskan nilai tersebut ke fungsi . Misalnya, untuk menangani pesan WM_SIZE , prosedur jendela akan terlihat seperti ini:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_SIZE:
        {
            int width = LOWORD(lParam);  // Macro to get the low-order word.
            int height = HIWORD(lParam); // Macro to get the high-order word.

            // Respond to the message:
            OnSize(hwnd, (UINT)wParam, width, height);
        }
        break;
    }
}

void OnSize(HWND hwnd, UINT flag, int width, int height)
{
    // Handle resizing
}

Makro LOWORD dan HIWORD mendapatkan nilai lebar dan tinggi 16-bit dari lParam. Prosedur jendela mengekstrak lebar dan tinggi, lalu meneruskan nilai-nilai ini ke OnSize fungsi .

Penanganan Pesan Default

Jika Anda tidak menangani pesan tertentu dalam prosedur jendela Anda, teruskan parameter pesan langsung ke fungsi DefWindowProc. Fungsi ini melakukan tindakan default untuk pesan, yang bervariasi menurut jenis pesan.

return DefWindowProc(hwnd, uMsg, wParam, lParam);

Menghindari Hambatan dalam Prosedur Jendela Anda

Saat prosedur jendela Anda dijalankan, ini memblokir pesan lain untuk windows yang dibuat pada utas yang sama. Oleh karena itu, hindari pemrosesan panjang di dalam prosedur jendela Anda. Misalnya, program Anda membuka koneksi TCP dan menunggu tanpa batas waktu agar server merespons. Jika Anda melakukannya di dalam prosedur jendela, UI Anda tidak akan merespons hingga permintaan selesai. Selama waktu tersebut, jendela tidak dapat memproses input mouse atau keyboard, mengecat ulang dirinya sendiri, atau bahkan menutup.

Sebagai gantinya, Anda harus memindahkan pekerjaan ke utas lain, menggunakan salah satu fasilitas multitugas yang dibangun ke dalam Windows:

  • Buat utas baru.
  • Gunakan kumpulan utas.
  • Gunakan panggilan I/O asinkron.
  • Gunakan panggilan prosedur asinkron.

Berikutnya

Mengecat Jendela