Handler untuk Pesan Windows Standar
Handler default untuk pesan Windows standar (WM_) telah ditentukan sebelumnya di kelas CWnd
. Pustaka kelas mendasarkan nama untuk handler ini pada nama pesan. Misalnya, handler untuk pesan WM_PAINT dinyatakan sebagai CWnd
:
afx_msg void OnPaint();
Kata kunci afx_msg menyarankan efek kata kunci C++ virtual
dengan membedakan penangan dari fungsi anggota lain CWnd
. Namun, perhatikan bahwa fungsi-fungsi ini sebenarnya tidak virtual; sebaliknya diimplementasikan melalui peta pesan. Peta pesan hanya bergantung pada makro praprosesor standar, bukan pada ekstensi apa pun ke bahasa C++. Kata kunci afx_msg diselesaikan ke spasi kosong setelah praproses.
Untuk mengambil alih handler yang ditentukan dalam kelas dasar, cukup tentukan fungsi dengan prototipe yang sama di kelas turunan Anda dan untuk membuat entri peta pesan untuk handler. Handler Anda "mengambil alih" handler dengan nama yang sama di salah satu kelas dasar kelas Anda.
Dalam beberapa kasus, handler Anda harus memanggil handler yang ditimpa di kelas dasar sehingga kelas dasar dan Windows dapat beroperasi pada pesan. Di mana Anda memanggil handler kelas dasar dalam penimpaan Anda tergantung pada keadaannya. Terkadang Anda harus memanggil handler kelas dasar terlebih dahulu dan terkadang terakhir. Terkadang Anda memanggil handler kelas dasar secara kondisional, jika Anda memilih untuk tidak menangani pesan sendiri. Terkadang Anda harus memanggil handler kelas dasar, lalu menjalankan kode handler Anda sendiri secara kondisional, tergantung pada nilai atau status yang dikembalikan oleh handler kelas dasar.
Perhatian
Tidak aman untuk memodifikasi argumen yang diteruskan ke handler jika Anda ingin meneruskannya ke handler kelas dasar. Misalnya, Anda mungkin tergoda untuk memodifikasi argumen nChar handler OnChar
(untuk dikonversi ke huruf besar, misalnya). Perilaku ini cukup tidak jelas, tetapi jika Anda perlu mencapai efek ini, gunakan fungsi SendMessage
anggota sebagai gantinyaCWnd
.
Bagaimana Anda menentukan cara yang tepat untuk mengambil alih pesan tertentu Ketika Wizard Kelas menulis kerangka fungsi handler untuk pesan tertentu — OnCreate
handler untuk WM_CREATE, misalnya — sketsa dalam bentuk fungsi anggota yang ditimpa yang direkomendasikan. Contoh berikut merekomendasikan agar handler terlebih dahulu memanggil handler kelas dasar dan hanya melanjutkan dengan syarat tidak mengembalikan -1.
int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}
Menurut konvensi, nama-nama handler ini dimulai dengan awalan "Aktif." Beberapa handler ini tidak mengambil argumen, sementara yang lain mengambil beberapa. Beberapa juga memiliki jenis pengembalian selain void
. Handler default untuk semua pesan WM_ didokumentasikan dalam Referensi MFC sebagai fungsi anggota kelas CWnd
yang namanya dimulai dengan "Aktif." Deklarasi fungsi anggota di diawali CWnd
dengan afx_msg.