Bagikan melalui


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 WNDCLASSatau 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 AfxRegisterClassMFC . 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