Bagikan melalui


Tentang Kelas Jendela

Setiap kelas jendela memiliki prosedur jendela terkait yang dibagikan oleh semua jendela dari kelas yang sama. Prosedur jendela memproses pesan untuk semua jendela kelas tersebut dan karenanya mengontrol perilaku dan tampilannya. Untuk informasi selengkapnya, lihat Prosedur Jendela.

Proses harus mendaftarkan kelas jendela sebelum dapat membuat jendela kelas tersebut. Mendaftarkan kelas jendela mengaitkan prosedur jendela, gaya kelas, dan atribut kelas lainnya dengan nama kelas. Saat proses menentukan nama kelas dalam fungsi CreateWindow atau CreateWindowEx , sistem membuat jendela dengan prosedur jendela, gaya, dan atribut lain yang terkait dengan nama kelas tersebut.

Bagian ini membahas topik berikut.

Jenis Kelas Jendela

Ada tiga jenis kelas jendela:

Jenis-jenis ini berbeda dalam cakupan dan kapan dan bagaimana mereka didaftarkan dan dihancurkan.

Kelas Sistem

Kelas sistem adalah kelas jendela yang didaftarkan oleh sistem. Banyak kelas sistem tersedia untuk semua proses untuk digunakan, sementara yang lain hanya digunakan secara internal oleh sistem. Karena sistem mendaftarkan kelas-kelas ini, proses tidak dapat menghancurkannya.

Sistem mendaftarkan kelas sistem untuk proses pertama kalinya salah satu utasnya memanggil fungsi Pengguna atau Antarmuka Perangkat Grafis Windows (GDI).

Setiap aplikasi menerima salinan kelas sistemnya sendiri. Semua aplikasi berbasis Windows 16-bit di kelas sistem berbagi VDM yang sama, seperti yang mereka lakukan pada Windows 16-bit.

Tabel berikut menjelaskan kelas sistem yang tersedia untuk digunakan oleh semua proses.

Kelas Deskripsi
Tombol Kelas untuk tombol.
ComboBox Kelas untuk kotak kombo.
Edit Kelas untuk kontrol edit.
ListBox Kelas untuk kotak daftar.
MDIClient Kelas untuk jendela klien MDI.
ScrollBar Kelas untuk bilah gulir.
Statis Kelas untuk kontrol statis.

 

Tabel berikut menjelaskan kelas sistem yang hanya tersedia untuk digunakan oleh sistem. Mereka terdaftar di sini demi kelengkapan.

Kelas Deskripsi
Kotak Kombo Kelas untuk kotak daftar yang terkandung dalam kotak kombo.
DDEMLEvent Kelas untuk peristiwa Dynamic Data Exchange Management Library (DDEML).
Pesan Kelas untuk jendela khusus pesan.
#32768 Kelas untuk menu.
#32769 Kelas untuk jendela desktop.
#32770 Kelas untuk kotak dialog.
#32771 Kelas untuk jendela sakelar tugas.
#32772 Kelas untuk judul ikon.

 

Kelas Global Aplikasi

Kelas global aplikasi adalah kelas jendela yang didaftarkan oleh executable atau DLL yang tersedia untuk semua modul lain dalam proses. Misalnya, .dll Anda dapat memanggil fungsi RegisterClassEx untuk mendaftarkan kelas jendela yang mendefinisikan kontrol kustom sebagai kelas global aplikasi sehingga proses yang memuat .dll dapat membuat instans kontrol kustom.

Untuk membuat kelas yang dapat digunakan dalam setiap proses, buat kelas jendela di .dll dan muat .dll di setiap proses. Untuk memuat .dll di setiap proses, tambahkan namanya ke nilai AppInit_DLLs dalam kunci registri berikut:

\ HKEY_LOCAL_MACHINE Perangkat lunak\Microsoft\Windows NT\CurrentVersion\Windows

Setiap kali proses dimulai, sistem memuat .dll yang ditentukan dalam konteks proses yang baru dimulai sebelum memanggil fungsi titik masuknya. .dll harus mendaftarkan kelas selama prosedur inisialisasinya dan harus menentukan gaya CS_GLOBALCLASS . Untuk informasi selengkapnya, lihat Gaya Kelas.

Untuk menghapus kelas global aplikasi dan membebaskan penyimpanan yang terkait dengannya, gunakan fungsi UnregisterClass .

Kelas Lokal Aplikasi

Kelas lokal aplikasi adalah kelas jendela apa pun yang dapat dieksekusi atau .dll mendaftar untuk penggunaan eksklusifnya. Meskipun Anda dapat mendaftarkan sejumlah kelas lokal, biasanya hanya mendaftar satu. Kelas jendela ini mendukung prosedur jendela jendela utama aplikasi.

Sistem menghancurkan kelas lokal ketika modul yang mendaftarkannya ditutup. Aplikasi juga dapat menggunakan fungsi UnregisterClass untuk menghapus kelas lokal dan membebaskan penyimpanan yang terkait dengannya.

Cara Sistem Menemukan Kelas Jendela

Sistem ini mempertahankan daftar struktur untuk masing-masing dari tiga jenis kelas jendela. Saat aplikasi memanggil fungsi CreateWindow atau CreateWindowEx untuk membuat jendela dengan kelas tertentu, sistem menggunakan prosedur berikut untuk menemukan kelas .

  1. Cari daftar kelas lokal aplikasi untuk kelas dengan nama yang ditentukan yang handel instansnya cocok dengan handel instans modul. (Beberapa modul dapat menggunakan nama yang sama untuk mendaftarkan kelas lokal dalam proses yang sama.)
  2. Jika nama tidak ada dalam daftar kelas lokal aplikasi, cari daftar kelas global aplikasi.
  3. Jika nama tidak ada dalam daftar kelas global aplikasi, cari daftar kelas sistem.

Semua jendela yang dibuat oleh aplikasi menggunakan prosedur ini, termasuk jendela yang dibuat oleh sistem atas nama aplikasi, seperti kotak dialog. Dimungkinkan untuk mengambil alih kelas sistem tanpa memengaruhi aplikasi lain. Artinya, aplikasi dapat mendaftarkan kelas lokal aplikasi yang memiliki nama yang sama dengan kelas sistem. Ini menggantikan kelas sistem dalam konteks aplikasi tetapi tidak mencegah aplikasi lain menggunakan kelas sistem.

Mendaftarkan Kelas Jendela

Kelas jendela menentukan atribut jendela, seperti gaya, ikon, kursor, menu, dan prosedur jendelanya. Langkah pertama dalam mendaftarkan kelas jendela adalah mengisi struktur WNDCLASSEX dengan informasi kelas jendela. Untuk informasi selengkapnya, lihat Elemen Kelas Jendela. Selanjutnya, teruskan struktur ke fungsi RegisterClassEx . Untuk informasi selengkapnya, lihat Menggunakan Kelas Jendela.

Untuk mendaftarkan kelas global aplikasi, tentukan gaya CS_GLOBALCLASS dalam anggota gaya struktur WNDCLASSEX . Saat mendaftarkan kelas lokal aplikasi, jangan tentukan gaya CS_GLOBALCLASS .

Jika Anda mendaftarkan kelas jendela menggunakan versi ANSI dari RegisterClassEx, RegisterClassExA, aplikasi meminta agar sistem meneruskan parameter teks pesan ke jendela kelas yang dibuat menggunakan set karakter ANSI; jika Anda mendaftarkan kelas menggunakan versi Unicode RegisterClassEx, RegisterClassExW, aplikasi meminta agar sistem meneruskan parameter teks pesan ke jendela kelas yang dibuat menggunakan set karakter Unicode. Fungsi IsWindowUnicode memungkinkan aplikasi untuk mengkueri sifat setiap jendela. Untuk informasi selengkapnya tentang fungsi ANSI dan Unicode, lihat Konvensi untuk Prototipe Fungsi.

Executable atau DLL yang mendaftarkan kelas adalah pemilik kelas. Sistem menentukan kepemilikan kelas dari anggota hInstance dari struktur WNDCLASSEX yang diteruskan ke fungsi RegisterClassEx ketika kelas terdaftar. Untuk DLL, anggota hInstance harus menangani instans .dll.

Kelas tidak dihancurkan ketika .dll yang memilikinya dibongkar. Oleh karena itu, jika sistem memanggil prosedur jendela untuk jendela kelas tersebut, itu akan menyebabkan pelanggaran akses, karena .dll yang berisi prosedur jendela tidak lagi dalam memori. Proses harus menghancurkan semua jendela menggunakan kelas sebelum .dll dibongkar dan memanggil fungsi UnregisterClass .

Elemen Dari Kelas Jendela

Elemen kelas jendela menentukan perilaku default jendela milik kelas . Aplikasi yang mendaftarkan kelas jendela menetapkan elemen ke kelas dengan mengatur anggota yang sesuai dalam struktur WNDCLASSEX dan meneruskan struktur ke fungsi RegisterClassEx . Fungsi GetClassInfoEx dan GetClassLong mengambil informasi tentang kelas jendela tertentu. Fungsi SetClassLong mengubah elemen kelas lokal atau global yang telah didaftarkan aplikasi.

Meskipun kelas jendela lengkap terdiri dari banyak elemen, sistem hanya mengharuskan aplikasi menyediakan nama kelas, alamat prosedur jendela, dan handel instans. Gunakan elemen lain untuk menentukan atribut default untuk jendela kelas, seperti bentuk kursor dan konten menu untuk jendela. Anda harus menginisialisasi anggota struktur WNDCLASSEX yang tidak digunakan ke nol atau NULL. Elemen kelas jendela seperti yang ditunjukkan dalam tabel berikut.

Elemen Tujuan
Nama Kelas Membedakan kelas dari kelas terdaftar lainnya.
Alamat Prosedur Jendela Arahkan ke fungsi yang memproses semua pesan yang dikirim ke jendela di kelas dan menentukan perilaku jendela.
Instance Handle Mengidentifikasi aplikasi atau .dll yang mendaftarkan kelas.
Kursor Kelas Menentukan kursor mouse yang ditampilkan sistem untuk jendela kelas.
Ikon Kelas Menentukan ikon besar dan ikon kecil.
Kuas Latar Belakang Kelas Menentukan warna dan pola yang mengisi area klien saat jendela dibuka atau dicat.
Menu Kelas Menentukan menu default untuk windows yang tidak secara eksplisit menentukan menu.
Gaya Kelas Menentukan cara memperbarui jendela setelah memindahkan atau mengubah ukurannya, cara memproses klik ganda mouse, cara mengalokasikan ruang untuk konteks perangkat, dan aspek lain dari jendela.
Memori Kelas Ekstra Menentukan jumlah memori tambahan, dalam byte, yang harus dicadangkan sistem untuk kelas . Semua jendela di kelas berbagi memori tambahan dan dapat menggunakannya untuk tujuan yang ditentukan aplikasi apa pun. Sistem menginisialisasi memori ini ke nol.
Memori Jendela Ekstra Menentukan jumlah memori tambahan, dalam byte, yang harus dicadangkan sistem untuk setiap jendela milik kelas. Memori tambahan dapat digunakan untuk tujuan yang ditentukan aplikasi apa pun. Sistem menginisialisasi memori ini ke nol.

 

Nama Kelas

Setiap kelas jendela memerlukan Nama Kelas untuk membedakan satu kelas dari kelas lainnya. Tetapkan nama kelas dengan mengatur anggota lpszClassName dari struktur WNDCLASSEX ke alamat string null-terminated yang menentukan nama. Karena kelas jendela bersifat spesifik proses, nama kelas jendela harus unik hanya dalam proses yang sama. Selain itu, karena nama kelas menempati ruang dalam tabel atom privat sistem, Anda harus menyimpan string nama kelas sesingkat mungkin.

Fungsi GetClassName mengambil nama kelas tempat jendela tertentu berada.

Alamat Prosedur Jendela

Setiap kelas memerlukan alamat prosedur jendela untuk menentukan titik masuk prosedur jendela yang digunakan untuk memproses semua pesan untuk jendela di kelas. Sistem meneruskan pesan ke prosedur ketika mengharuskan jendela untuk melakukan tugas, seperti melukis area kliennya atau merespons input dari pengguna. Proses menetapkan prosedur jendela ke kelas dengan menyalin alamatnya ke anggota lpfnWndProc dari struktur WNDCLASSEX . Untuk informasi selengkapnya, lihat Prosedur Jendela.

Instance Handle

Setiap kelas jendela memerlukan handel instans untuk mengidentifikasi aplikasi atau .dll yang mendaftarkan kelas. Sistem memerlukan handel instans untuk melacak semua modul. Sistem menetapkan handel ke setiap salinan executable atau .dll yang sedang berjalan.

Sistem meneruskan handel instans ke fungsi titik entri dari setiap executable (lihat WinMain) dan .dll (lihat DllMain). Executable atau .dll menetapkan handel instans ini ke kelas dengan menyalinnya ke anggota hInstance dari struktur WNDCLASSEX .

Kursor Kelas

Kursor kelas menentukan bentuk kursor saat berada di area klien jendela di kelas. Sistem secara otomatis mengatur kursor ke bentuk yang diberikan ketika kursor memasuki area klien jendela dan memastikannya mempertahankan bentuk tersebut saat tetap berada di area klien. Untuk menetapkan bentuk kursor ke kelas jendela, muat bentuk kursor yang telah ditentukan sebelumnya dengan menggunakan fungsi LoadCursor lalu tetapkan handel kursor yang dikembalikan ke anggota hCursor struktur WNDCLASSEX . Atau, sediakan sumber daya kursor kustom dan gunakan fungsi LoadCursor untuk memuatnya dari sumber daya aplikasi.

Sistem tidak memerlukan kursor kelas. Jika aplikasi menetapkan anggota hCursor dari struktur WNDCLASSEX ke NULL, tidak ada kursor kelas yang ditentukan. Sistem mengasumsikan jendela mengatur bentuk kursor setiap kali kursor berpindah ke jendela. Jendela dapat mengatur bentuk kursor dengan memanggil fungsi SetCursor setiap kali jendela menerima pesan WM_MOUSEMOVE . Untuk informasi selengkapnya tentang kursor, lihat Kursor.

Ikon Kelas

Ikon kelas adalah gambar yang digunakan sistem untuk mewakili jendela kelas tertentu. Aplikasi dapat memiliki dua ikon kelas—satu besar dan satu kecil. Sistem menampilkan ikon kelas besar jendela di jendela sakelar tugas yang muncul saat pengguna menekan ALT+TAB, dan di tampilan ikon besar bilah tugas dan penjelajah. Ikon kelas kecil muncul di bilah judul jendela dan di tampilan ikon kecil bilah tugas dan penjelajah.

Untuk menetapkan ikon besar dan kecil ke kelas jendela, tentukan handel ikon di anggota hIcon dan hIconSm dari struktur WNDCLASSEX . Dimensi ikon harus sesuai dengan dimensi yang diperlukan untuk ikon kelas besar dan kecil. Untuk ikon kelas besar, Anda dapat menentukan dimensi yang diperlukan dengan menentukan nilai SM_CXICON dan SM_CYICON dalam panggilan ke fungsi GetSystemMetrics . Untuk ikon kelas kecil, tentukan nilai SM_CXSMICON dan SM_CYSMICON . Untuk informasi, lihat Ikon.

Jika aplikasi menetapkan anggota hIcon dan hIconSm dari struktur WNDCLASSEX ke NULL, sistem menggunakan ikon aplikasi default sebagai ikon kelas besar dan kecil untuk kelas jendela. Jika Anda menentukan ikon kelas besar tetapi bukan yang kecil, sistem membuat ikon kelas kecil berdasarkan yang besar. Namun, jika Anda menentukan ikon kelas kecil tetapi bukan ikon besar, sistem menggunakan ikon aplikasi default sebagai ikon kelas besar dan ikon yang ditentukan sebagai ikon kelas kecil.

Anda dapat mengganti ikon kelas besar atau kecil untuk jendela tertentu dengan menggunakan pesan WM_SETICON . Anda dapat mengambil ikon kelas besar atau kecil saat ini dengan menggunakan pesan WM_GETICON .

Kuas Latar Belakang Kelas

Kuas latar belakang kelas menyiapkan area klien jendela untuk gambar berikutnya oleh aplikasi. Sistem menggunakan kuas untuk mengisi area klien dengan warna atau pola solid, sehingga menghapus semua gambar sebelumnya dari lokasi tersebut apakah mereka termasuk dalam jendela atau tidak. Sistem memberi tahu jendela bahwa latar belakangnya harus dicat dengan mengirim pesan WM_ERASEBKGND ke jendela. Untuk informasi selengkapnya, lihat Sikat.

Untuk menetapkan kuas latar belakang ke kelas, buat kuas dengan menggunakan fungsi GDI yang sesuai dan tetapkan handel kuas yang dikembalikan ke anggota hbrBackground dari struktur WNDCLASSEX .

Alih-alih membuat kuas, aplikasi dapat mengatur anggota hbrBackground ke salah satu nilai warna sistem standar. Untuk daftar nilai warna sistem standar, lihat SetSysColors.

Untuk menggunakan warna sistem standar, aplikasi harus meningkatkan nilai warna latar belakang satu per satu. Misalnya, COLOR_BACKGROUND + 1 adalah warna latar belakang sistem. Atau, Anda dapat menggunakan fungsi GetSysColorBrush untuk mengambil handel ke kuas yang sesuai dengan warna sistem standar, lalu menentukan handel di anggota hbrBackground dari struktur WNDCLASSEX .

Sistem tidak mengharuskan kelas jendela memiliki kuas latar belakang kelas. Jika parameter ini diatur ke NULL, jendela harus mengecat latar belakangnya sendiri setiap kali menerima pesan WM_ERASEBKGND .

Menu Kelas

Menu kelas menentukan menu default yang akan digunakan oleh jendela di kelas jika tidak ada menu eksplisit yang diberikan saat jendela dibuat. Menu adalah daftar perintah tempat pengguna dapat memilih tindakan untuk dilakukan aplikasi.

Anda dapat menetapkan menu ke kelas dengan mengatur anggota lpszMenuName dari struktur WNDCLASSEX ke alamat string yang dihentikan null yang menentukan nama sumber daya menu. Menu diasumsikan sebagai sumber daya dalam aplikasi tertentu. Sistem secara otomatis memuat menu saat diperlukan. Jika sumber daya menu diidentifikasi oleh bilangan bulat dan bukan dengan nama, aplikasi dapat mengatur anggota lpszMenuName ke bilangan bulat tersebut dengan menerapkan makro MAKEINTRESOURCE sebelum menetapkan nilai.

Sistem tidak memerlukan menu kelas. Jika aplikasi mengatur anggota lpszMenuName dari struktur WNDCLASSEX ke NULL, jendela di kelas tidak memiliki bilah menu. Bahkan jika tidak ada menu kelas yang diberikan, aplikasi masih dapat menentukan bilah menu untuk jendela saat membuat jendela.

Jika menu diberikan untuk kelas dan jendela anak dari kelas tersebut dibuat, menu diabaikan. Untuk informasi selengkapnya, lihat Menu.

Gaya Kelas

Gaya kelas menentukan elemen tambahan dari kelas jendela. Dua gaya atau lebih dapat digabungkan dengan menggunakan operator bitwise OR (|). Untuk menetapkan gaya ke kelas jendela, tetapkan gaya ke anggota gaya struktur WNDCLASSEX . Untuk daftar gaya kelas, lihat Gaya Kelas Jendela.

Kelas dan Konteks Perangkat

Konteks perangkat adalah sekumpulan nilai khusus yang digunakan aplikasi untuk menggambar di area klien jendelanya. Sistem memerlukan konteks perangkat untuk setiap jendela pada layar tetapi memungkinkan beberapa fleksibilitas dalam cara sistem menyimpan dan memperlakukan konteks perangkat tersebut.

Jika tidak ada gaya konteks perangkat yang diberikan secara eksplisit, sistem mengasumsikan setiap jendela menggunakan konteks perangkat yang diambil dari kumpulan konteks yang dikelola oleh sistem. Dalam kasus seperti itu, setiap jendela harus mengambil dan menginisialisasi konteks perangkat sebelum melukis dan membebaskannya setelah pengecatan.

Untuk menghindari pengambilan konteks perangkat setiap kali perlu dicat di dalam jendela, aplikasi dapat menentukan gaya CS_OWNDC untuk kelas jendela. Gaya kelas ini mengarahkan sistem untuk membuat konteks perangkat privat—yaitu, mengalokasikan konteks perangkat unik untuk setiap jendela di kelas. Aplikasi hanya perlu mengambil konteks sekali dan kemudian menggunakannya untuk semua lukisan berikutnya.

Memori Kelas Ekstra

Sistem mempertahankan struktur WNDCLASSEX secara internal untuk setiap kelas jendela dalam sistem. Ketika aplikasi mendaftarkan kelas jendela, aplikasi dapat mengarahkan sistem untuk mengalokasikan dan menambahkan sejumlah byte memori tambahan ke akhir struktur WNDCLASSEX . Memori ini disebut memori kelas tambahan dan dibagikan oleh semua jendela milik kelas . Gunakan memori kelas tambahan untuk menyimpan informasi apa pun yang berkaitan dengan kelas .

Karena memori tambahan dialokasikan dari timbunan lokal sistem, aplikasi harus menggunakan memori kelas ekstra dengan hemat. Fungsi RegisterClassEx gagal jika jumlah memori kelas tambahan yang diminta lebih besar dari 40 byte. Jika aplikasi membutuhkan lebih dari 40 byte, aplikasi harus mengalokasikan memorinya sendiri dan menyimpan pointer ke memori di memori kelas tambahan.

Fungsi SetClassWord dan SetClassLong menyalin nilai ke memori kelas tambahan. Untuk mengambil nilai dari memori kelas tambahan, gunakan fungsi GetClassWord dan GetClassLong . Anggota cbClsExtra dari struktur WNDCLASSEX menentukan jumlah memori kelas tambahan yang akan dialokasikan. Aplikasi yang tidak menggunakan memori kelas tambahan harus menginisialisasi anggota cbClsExtra ke nol.

Memori Jendela Ekstra

Sistem mempertahankan struktur data internal untuk setiap jendela. Saat mendaftarkan kelas jendela, aplikasi dapat menentukan sejumlah byte memori tambahan, yang disebut memori jendela tambahan. Saat membuat jendela kelas, sistem mengalokasikan dan menambahkan jumlah memori jendela tambahan yang ditentukan ke akhir struktur jendela. Aplikasi dapat menggunakan memori ini untuk menyimpan data khusus jendela.

Karena memori tambahan dialokasikan dari timbunan lokal sistem, aplikasi harus menggunakan memori jendela tambahan dengan hemat. Fungsi RegisterClassEx gagal jika jumlah memori jendela tambahan yang diminta lebih besar dari 40 byte. Jika aplikasi membutuhkan lebih dari 40 byte, aplikasi harus mengalokasikan memorinya sendiri dan menyimpan pointer ke memori di memori jendela tambahan.

Fungsi SetWindowLong menyalin nilai ke memori tambahan. Fungsi GetWindowLong mengambil nilai dari memori tambahan. Anggota cbWndExtra dari struktur WNDCLASSEX menentukan jumlah memori jendela tambahan yang akan dialokasikan. Aplikasi yang tidak menggunakan memori harus menginisialisasi cbWndExtra ke nol.