Bagikan melalui


Pesan WM_PAINT

Biasanya, aplikasi menggambar di jendela sebagai respons terhadap pesan WM_PAINT . Sistem mengirim pesan ini ke prosedur jendela ketika perubahan pada jendela telah mengubah isi area klien. Sistem mengirim pesan hanya jika tidak ada pesan lain dalam antrean pesan aplikasi.

Setelah menerima pesan WM_PAINT , aplikasi dapat memanggil BeginPaint untuk mengambil konteks perangkat tampilan untuk area klien dan menggunakannya dalam panggilan ke fungsi GDI untuk melakukan operasi gambar apa pun yang diperlukan untuk memperbarui area klien. Setelah menyelesaikan operasi menggambar, aplikasi memanggil fungsi EndPaint untuk merilis konteks perangkat tampilan.

Sebelum BeginPaint mengembalikan konteks perangkat tampilan, sistem menyiapkan konteks perangkat untuk jendela yang ditentukan. Pertama-tama mengatur wilayah kliping agar konteks perangkat sama dengan persimpangan bagian jendela yang perlu diperbarui dan bagian yang terlihat oleh pengguna. Hanya bagian jendela yang telah berubah yang digambar ulang. Upaya untuk menggambar di luar wilayah ini terpotong dan tidak muncul di layar.

Sistem juga dapat mengirim WM_NCPAINT dan WM_ERASEBKGND pesan ke prosedur jendela sebelum BeginPaint kembali. Pesan-pesan ini mengarahkan aplikasi untuk menggambar area nonclient dan latar belakang jendela. Area nonclient adalah bagian dari jendela yang berada di luar area klien. Area ini mencakup fitur seperti bilah judul, menu jendela (juga dikenal sebagai menu Sistem ), dan bilah gulir. Sebagian besar aplikasi mengandalkan fungsi jendela default, DefWindowProc, untuk menggambar area ini dan karenanya meneruskan pesan WM_NCPAINT ke fungsi ini. Latar belakang jendela adalah warna atau pola yang diisi jendela sebelum operasi menggambar lainnya dimulai. Latar belakang mencakup gambar apa pun yang sebelumnya ada di jendela atau di layar di bawah jendela. Jika jendela milik kelas jendela memiliki kuas latar belakang kelas, fungsi DefWindowProc akan menggambar latar belakang jendela secara otomatis.

BeginPaint mengisi struktur PAINTSTRUCT dengan informasi seperti dimensi bagian jendela yang akan diperbarui dan bendera yang menunjukkan apakah latar belakang jendela telah digambar. Aplikasi dapat menggunakan informasi ini untuk mengoptimalkan gambar. Misalnya, dapat menggunakan dimensi wilayah pembaruan, yang ditentukan oleh anggota rcPaint , untuk membatasi menggambar hanya pada bagian jendela yang perlu diperbarui. Jika aplikasi memiliki output yang sangat sederhana, aplikasi dapat mengabaikan wilayah pembaruan dan menggambar di seluruh jendela, mengandalkan sistem untuk membuang (klip) output yang tidak diperlukan. Karena gambar klip sistem yang meluas di luar wilayah kliping, hanya gambar yang ada di wilayah pembaruan yang terlihat.

BeginPaint mengatur wilayah pembaruan jendela ke NULL. Ini menghapus wilayah, mencegahnya menghasilkan pesan WM_PAINT berikutnya. Jika aplikasi memproses pesan WM_PAINT tetapi tidak memanggil BeginPaint atau menghapus wilayah pembaruan, aplikasi terus menerima pesan WM_PAINT selama wilayah tersebut tidak kosong. Dalam semua kasus, aplikasi harus menghapus wilayah pembaruan sebelum kembali dari pesan WM_PAINT .

Setelah aplikasi selesai menggambar, aplikasi harus memanggil EndPaint. Untuk sebagian besar jendela, EndPaint merilis konteks perangkat tampilan, membuatnya tersedia untuk jendela lain. EndPaint juga menunjukkan tanda sisipan, jika sebelumnya disembunyikan oleh BeginPaint. BeginPaint menyembunyikan tanda sisipan untuk mencegah operasi menggambar merusaknya.