Melukis Jendela
Anda telah membuat jendela Anda. Sekarang Anda ingin menunjukkan sesuatu di dalamnya. Dalam terminologi Windows, ini disebut melukis jendela. Untuk mencampur metafora, jendela adalah kanvas kosong, menunggu Anda mengisinya.
Terkadang program Anda akan memulai lukisan untuk memperbarui tampilan jendela. Di lain waktu, sistem operasi akan memberi tahu Anda bahwa Anda harus mengecat ulang sebagian jendela. Ketika ini terjadi, sistem operasi mengirim jendela pesan WM_PAINT . Bagian jendela yang harus dicat disebut wilayah pembaruan.
Pertama kali jendela ditampilkan, seluruh area klien jendela harus dicat. Oleh karena itu, Anda akan selalu menerima setidaknya satu pesan WM_PAINT ketika Anda menampilkan jendela.
Anda hanya bertanggung jawab untuk melukis area klien. Bingkai di sekitarnya, termasuk bilah judul, secara otomatis dicat oleh sistem operasi. Setelah Anda selesai melukis area klien, Anda menghapus wilayah pembaruan, yang memberi tahu sistem operasi bahwa ia tidak perlu mengirim pesan WM_PAINT lain sampai sesuatu berubah.
Sekarang misalkan pengguna memindahkan jendela lain sehingga mengaburkan sebagian jendela Anda. Ketika bagian yang dikaburkan terlihat lagi, bagian tersebut ditambahkan ke wilayah pembaruan, dan jendela Anda menerima pesan WM_PAINT lain.
Wilayah pembaruan juga berubah jika pengguna membentangkan jendela. Dalam diagram berikut, pengguna membentangkan jendela ke kanan. Area yang baru diekspos di sisi kanan jendela ditambahkan ke wilayah pembaruan:
Dalam program contoh pertama kami, rutinitas melukis sangat sederhana. Ini hanya mengisi seluruh area klien dengan warna solid. Namun, contoh ini cukup untuk menunjukkan beberapa konsep penting.
switch (uMsg)
{
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
// All painting occurs here, between BeginPaint and EndPaint.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
EndPaint(hwnd, &ps);
}
return 0;
}
Mulai operasi pengecatan dengan memanggil fungsi BeginPaint . Fungsi ini mengisi struktur PAINTSTRUCT dengan informasi tentang permintaan repaint. Wilayah pembaruan saat ini diberikan di anggota rcPaintdari PAINTSTRUCT. Wilayah pembaruan ini didefinisikan relatif terhadap area klien:
Dalam kode lukisan, Anda memiliki dua opsi dasar:
- Cat seluruh area klien, terlepas dari ukuran wilayah pembaruan. Apa pun yang berada di luar wilayah pembaruan dipotong. Artinya, sistem operasi mengabaikannya.
- Optimalkan dengan melukis hanya bagian jendela di dalam wilayah pembaruan.
Jika Anda selalu melukis seluruh area klien, kode akan lebih sederhana. Namun, jika Anda memiliki logika lukisan yang rumit, mungkin lebih efisien untuk melewati area di luar wilayah pembaruan.
Baris kode berikut mengisi wilayah pembaruan dengan satu warna, menggunakan warna latar belakang jendela yang ditentukan sistem (COLOR_WINDOW). Warna aktual yang ditunjukkan oleh COLOR_WINDOW tergantung pada skema warna pengguna saat ini.
FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1));
Detail FillRect tidak penting untuk contoh ini, tetapi parameter kedua memberikan koordinat persegi panjang untuk diisi. Dalam hal ini, kami melewati seluruh wilayah pembaruan (anggota rcPaint dari PAINTSTRUCT). Pada pesan WM_PAINT pertama, seluruh area klien perlu dicat, sehingga rcPaint akan berisi seluruh area klien. Pada pesan WM_PAINT berikutnya, rcPaint mungkin berisi persegi panjang yang lebih kecil.
Fungsi FillRect adalah bagian dari Graphics Device Interface (GDI), yang telah mendukung grafis Windows untuk waktu yang sangat lama. Di Windows 7, Microsoft memperkenalkan mesin grafis baru, bernama Direct2D, yang mendukung operasi grafis berkinerja tinggi, seperti akselerasi perangkat keras. Direct2D juga tersedia untuk Windows Vista melalui Pembaruan Platform untuk Windows Vista dan untuk Windows Server 2008 melalui Pembaruan Platform untuk Windows Server 2008. (GDI masih didukung penuh.)
Setelah Anda selesai melukis, panggil fungsi EndPaint . Fungsi ini menghapus wilayah pembaruan, yang memberi sinyal ke Windows bahwa jendela telah menyelesaikan pengecatan itu sendiri.