TN001: Pendaftaran Kelas Jendela
Catatan ini menjelaskan rutinitas MFC yang mendaftarkan es WNDCLASSkhusus yang diperlukan oleh Microsoft Windows. Atribut tertentu WNDCLASS
yang digunakan oleh MFC dan Windows dibahas.
Masalah
Atribut objek CWnd , seperti HWND
handel di Windows, disimpan di dua tempat: objek jendela dan WNDCLASS
. Nama WNDCLASS
diteruskan ke fungsi pembuatan jendela umum seperti CWnd::Create dan CFrameWnd::Create di parameter lpszClassName .
Ini WNDCLASS
harus didaftarkan melalui salah satu dari empat cara:
Secara implisit dengan menggunakan MFC yang disediakan
WNDCLASS
.Secara implisit dengan subkelas kontrol Windows (atau kontrol lainnya).
Secara eksplisit dengan memanggil MFC AfxRegisterWndClass atau AfxRegisterClass.
Secara eksplisit dengan memanggil RegisterClass rutin Windows.
Bidang WNDCLASS
Struktur WNDCLASS
terdiri dari berbagai bidang yang menggambarkan kelas jendela. Tabel berikut ini memperlihatkan bidang dan menentukan bagaimana bidang tersebut digunakan dalam aplikasi MFC:
Bidang | Deskripsi |
---|---|
lpfnWndProc | window proc, harus berupa AfxWndProc |
cbClsExtra | tidak digunakan (harus nol) |
cbWndExtra | tidak digunakan (harus nol) |
hInstance | diisi secara otomatis dengan AfxGetInstanceHandle |
hIcon | ikon untuk jendela bingkai, lihat di bawah ini |
hCursor | kursor saat mouse melewati jendela, lihat di bawah ini |
hbrBackground | warna latar belakang, lihat di bawah ini |
lpszMenuName | tidak digunakan (harus NULL) |
lpszClassName | nama kelas, lihat di bawah ini |
WNDCLASSes yang disediakan
Versi MFC yang lebih lama (sebelum MFC 4.0), menyediakan beberapa kelas Window yang telah ditentukan sebelumnya. Kelas Jendela ini tidak lagi disediakan secara default. Aplikasi harus digunakan AfxRegisterWndClass
dengan parameter yang sesuai.
Jika aplikasi menyediakan sumber daya dengan ID sumber daya yang ditentukan (misalnya, AFX_IDI_STD_FRAME), MFC akan menggunakan sumber daya tersebut. Jika tidak, itu akan menggunakan sumber daya default. Untuk ikon , ikon aplikasi standar digunakan, dan untuk kursor, kursor panah standar digunakan.
Dua ikon mendukung aplikasi MDI dengan jenis dokumen tunggal: satu ikon untuk aplikasi utama, ikon lainnya untuk dokumen ikon/jendela MDIChild. Untuk beberapa jenis dokumen dengan ikon yang berbeda, Anda harus mendaftarkan es tambahan WNDCLASS
atau menggunakan fungsi CFrameWnd::LoadFrame .
CFrameWnd::LoadFrame
akan mendaftarkan menggunakan ID ikon yang WNDCLASS
Anda tentukan sebagai parameter pertama dan atribut standar berikut:
gaya kelas :
CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
ikon AFX_IDI_STD_FRAME
kursor panah
warna latar belakang COLOR_WINDOW
Nilai untuk warna latar belakang dan kursor untuk CMDIFrameWnd tidak digunakan karena area CMDIFrameWnd
klien sepenuhnya dicakup oleh jendela MDICLIENT. Microsoft tidak mendorong subkelas jendela MDICLIENT , jadi gunakan warna standar dan jenis kursor jika memungkinkan.
Kontrol Subkelas dan Superkelas
Jika Anda subkelas atau superclass kontrol Windows (misalnya, CButton) maka kelas Anda secara otomatis mendapatkan WNDCLASS
atribut yang disediakan dalam implementasi Windows kontrol tersebut.
Fungsi AfxRegisterWndClass
MFC menyediakan fungsi pembantu untuk mendaftarkan kelas jendela. Mengingat sekumpulan atribut (gaya kelas jendela, kursor, kuas latar belakang, dan ikon), nama sintetis dihasilkan, dan kelas jendela yang dihasilkan terdaftar. Contohnya,
const char* AfxRegisterWndClass(UINT nClassStyle,
HCURSOR hCursor,
HBRUSH hbrBackground,
HICON hIcon);
Fungsi ini mengembalikan string sementara dari nama kelas jendela terdaftar yang dihasilkan. Untuk informasi selengkapnya tentang fungsi ini, lihat AfxRegisterWndClass.
String yang dikembalikan adalah penunjuk sementara ke buffer string statis. Ini berlaku sampai panggilan berikutnya ke AfxRegisterWndClass
. Jika Anda ingin menyimpan string ini, simpan dalam variabel CString , seperti dalam contoh ini:
CString strWndClass = AfxRegisterWndClass(CS_DBLCLK, ...);
...
CWnd* pWnd = new CWnd;
pWnd->Create(strWndClass, ...);
...
AfxRegisterWndClass
akan melempar CResourceException jika kelas jendela gagal mendaftar (baik karena parameter buruk, atau kehabisan memori Windows).
Fungsi RegisterClass dan AfxRegisterClass
Jika Anda ingin melakukan sesuatu yang lebih canggih daripada yang AfxRegisterWndClass
disediakan, Anda dapat memanggil WINDOWS API RegisterClass
atau fungsi AfxRegisterClass
MFC . Fungsi CWnd
, CFrameWnd dan CMDIChildWndCreate
mengambil nama string lpszClassName untuk kelas jendela sebagai parameter pertama. Anda dapat menggunakan nama kelas jendela terdaftar apa pun, terlepas dari metode yang Anda gunakan untuk mendaftarkannya.
Penting untuk menggunakan AfxRegisterClass
(atau AfxRegisterWndClass
) dalam DLL di Win32. Win32 tidak secara otomatis membatalkan pendaftaran kelas yang didaftarkan oleh DLL, jadi Anda harus secara eksplisit membatalkan pendaftaran kelas ketika DLL dihentikan. Dengan menggunakan AfxRegisterClass
alih-alih RegisterClass
ini ditangani secara otomatis untuk Anda. AfxRegisterClass
mempertahankan daftar kelas unik yang didaftarkan oleh DLL Anda dan akan secara otomatis membatalkan pendaftarannya saat DLL berakhir. Saat Anda menggunakan RegisterClass
dalam DLL, Anda harus memastikan bahwa semua kelas tidak terdaftar saat DLL dihentikan (dalam fungsi DllMain Anda). Kegagalan untuk melakukannya dapat menyebabkan RegisterClass
kegagalan secara tak terduga ketika aplikasi klien lain mencoba menggunakan DLL Anda.
Baca juga
Catatan Teknis menurut Angka
Catatan Teknis menurut Kategori
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk