Kontrol Kustom
Bagian ini berisi informasi tentang kontrol yang ditentukan aplikasi atau kustom.
Topik berikut dibahas.
- Membuat Kontrol Yang Digambar Pemilik
- Subkelas Kelas Jendela dari Kontrol yang Ada
- Menerapkan Kelas Jendela yang Ditentukan Aplikasi
- Mengirim Pemberitahuan dari Kontrol
- Aksesibilitas
- Topik terkait
Membuat Kontrol Yang Digambar Pemilik
Tombol, menu, kontrol teks statis, kotak daftar, dan kotak kombo dapat dibuat dengan bendera gaya yang digambar pemilik. Ketika kontrol memiliki gaya yang digambar pemilik, sistem menangani interaksi pengguna dengan kontrol seperti biasa, melakukan tugas seperti mendeteksi ketika pengguna telah memilih tombol dan memberi tahu pemilik tombol tentang peristiwa tersebut. Namun, karena kontrol digambar pemilik, jendela induk kontrol bertanggung jawab atas tampilan visual kontrol. Jendela induk menerima pesan setiap kali kontrol harus digambar.
Untuk tombol dan kontrol teks statis, gaya yang digambar pemilik memengaruhi bagaimana sistem menggambar seluruh kontrol. Untuk kotak daftar dan kotak kombo, jendela induk menggambar item dalam kontrol, dan kontrol menggambar kerangkanya sendiri. Misalnya, aplikasi dapat menyesuaikan kotak daftar sehingga menampilkan bitmap kecil di samping setiap item dalam daftar.
Contoh kode berikut menunjukkan cara membuat kontrol teks statis yang digambar pemilik. Asumsikan bahwa Unicode didefinisikan.
// g_myStatic is a global HWND variable.
g_myStatic = CreateWindowEx(0, L"STATIC", L"Some static text",
WS_CHILD | WS_VISIBLE | SS_OWNERDRAW,
25, 125, 150, 20, hDlg, 0, 0, 0);
Dalam contoh berikut, dari prosedur jendela untuk kotak dialog yang berisi kontrol yang dibuat dalam contoh sebelumnya, pesan WM_DRAWITEM ditangani dengan menampilkan teks dalam warna kustom, menggunakan font default. Perhatikan bahwa Anda tidak perlu memanggil BeginPaint dan EndPaint saat menangani WM_DRAWITEM.
case WM_DRAWITEM:
{
LPDRAWITEMSTRUCT pDIS = (LPDRAWITEMSTRUCT)lParam;
if (pDIS->hwndItem == g_myStatic)
{
SetTextColor(pDIS->hDC, RGB(100, 0, 100));
WCHAR staticText[99];
int len = SendMessage(myStatic, WM_GETTEXT,
ARRAYSIZE(staticText), (LPARAM)staticText);
TextOut(pDIS->hDC, pDIS->rcItem.left, pDIS->rcItem.top, staticText, len);
}
return TRUE;
}
Untuk informasi selengkapnya tentang kontrol yang digambar pemilik, lihat Membuat Kotak Daftar yang Digambar Pemilik dan Kotak Kombo Yang Digambar Pemilik.
Subkelas Kelas Jendela dari Kontrol yang Ada
Subkelas kontrol yang ada adalah cara lain untuk membuat kontrol kustom. Prosedur subkelas dapat mengubah perilaku kontrol yang dipilih dengan memproses pesan yang memengaruhi perilaku yang dipilih. Semua pesan lain diteruskan ke prosedur jendela asli untuk kontrol. Misalnya, aplikasi dapat menampilkan bitmap kecil di samping teks dalam kontrol edit baris tunggal baca-saja dengan mensubkelas kontrol dan memproses pesan WM_PAINT. Untuk informasi selengkapnya, lihat Tentang Prosedur Jendela dan Kontrol Subkelas.
Menerapkan Kelas Jendela yang Ditentukan Aplikasi
Untuk membuat kontrol yang tidak secara eksplisit berdasarkan kontrol yang ada, aplikasi harus membuat dan mendaftarkan kelas jendela. Proses untuk mendaftarkan kelas jendela yang ditentukan aplikasi untuk kontrol kustom sama dengan mendaftarkan kelas untuk jendela biasa. Untuk membuat kontrol kustom, tentukan nama kelas jendela di fungsi CreateWindowEx atau dalam templat kotak dialog. Setiap kelas harus memiliki nama unik, prosedur jendela yang sesuai, dan informasi lainnya.
Minimal, prosedur jendela menggambar kontrol. Jika aplikasi menggunakan kontrol untuk membiarkan informasi jenis pengguna, prosedur jendela juga memproses pesan input dari keyboard dan mouse dan mengirim pesan pemberitahuan ke jendela induk. Selain itu, jika kontrol mendukung pesan kontrol, prosedur jendela memproses pesan yang dikirim ke dalamnya oleh jendela induk atau jendela lainnya. Misalnya, kontrol sering memproses pesan WM_GETDLGCODE yang dikirim oleh kotak dialog untuk mengarahkan kotak dialog untuk memproses input keyboard dengan cara tertentu.
Prosedur jendela untuk kontrol yang ditentukan aplikasi harus memproses pesan kontrol yang telah ditentukan sebelumnya dalam tabel berikut jika pesan memengaruhi operasi kontrol.
Pesan | Rekomendasi |
---|---|
WM_GETDLGCODE | Proses jika kontrol menggunakan tombol ENTER, ESC, TAB, atau panah. Fungsi IsDialogMessage mengirim pesan ini ke kontrol dalam kotak dialog untuk menentukan apakah akan memproses kunci atau meneruskannya ke kontrol. |
WM_GETFONT | Proses jika pesan WM_SETFONT juga diproses. |
WM_GETTEXT | Proses jika teks kontrol tidak sama dengan judul yang ditentukan oleh fungsi CreateWindowEx. |
WM_GETTEXTLENGTH | Proses jika teks kontrol tidak sama dengan judul yang ditentukan oleh fungsi CreateWindowEx. |
WM_KILLFOCUS | Proses jika kontrol menampilkan tanda sisipan, persegi panjang fokus, atau item lain untuk menunjukkan bahwa kontrol memiliki fokus input. |
WM_SETFOCUS | Proses jika kontrol menampilkan tanda sisipan, persegi panjang fokus, atau item lain untuk menunjukkan bahwa kontrol memiliki fokus input. |
WM_SETTEXT | Proses jika teks kontrol tidak sama dengan judul yang ditentukan oleh fungsi CreateWindowEx. |
WM_SETFONT | Proses jika kontrol menampilkan teks. Sistem mengirim pesan ini saat membuat kotak dialog yang memiliki gaya DS_SETFONT. |
Pesan kontrol yang ditentukan aplikasi khusus untuk kontrol yang diberikan dan harus secara eksplisit dikirim ke kontrol dengan menggunakan fungsi SendMessage atau SendDlgItemMessage. Nilai numerik untuk setiap pesan harus unik dan tidak boleh bertentangan dengan nilai pesan jendela lainnya. Untuk memastikan bahwa nilai pesan yang ditentukan aplikasi tidak bertentangan, aplikasi harus membuat setiap nilai dengan menambahkan angka unik ke nilai WM_USER.
Mengirim Pemberitahuan dari Kontrol
Kontrol kustom mungkin diperlukan untuk mengirim pemberitahuan peristiwa ke jendela induk sehingga aplikasi host dapat merespons peristiwa ini. Misalnya, tampilan daftar kustom mungkin mengirim pemberitahuan saat pengguna memilih item, dan pemberitahuan lain saat item diklik dua kali.
Pemberitahuan dikirim sebagai pesan WM_COMMAND atau WM_NOTIFY. WM_NOTIFY pesan membawa lebih banyak informasi daripada pesan WM_COMMAND.
Pengidentifikasi kontrol adalah nomor unik yang digunakan aplikasi untuk mengidentifikasi kontrol yang mengirim pesan. Aplikasi mengatur pengidentifikasi untuk kontrol saat membuat kontrol. Aplikasi menentukan pengidentifikasi baik dalam parameter hMenu dari fungsi CreateWindowEx atau di anggota id struktur DLGITEMTEMPLATEEX.
Karena kontrol itu sendiri tidak mengatur pengidentifikasi kontrol, kontrol harus mengambil pengidentifikasi sebelum dapat mengirim pesan pemberitahuan. Kontrol harus menggunakan fungsi GetDlgCtrlID untuk mengambil pengidentifikasi kontrolnya sendiri. Meskipun pengidentifikasi kontrol ditentukan sebagai handel menu saat kontrol dibuat, fungsi GetMenu tidak dapat digunakan untuk mengambil pengidentifikasi. Atau, kontrol dapat mengambil pengidentifikasi dari anggota hMenu dalam struktur CREATESTRUCT saat memproses pesan WM_CREATE.
Contoh berikut, di mana hwndControl adalah handel jendela kontrol dan CN_VALUECHANGED adalah definisi pemberitahuan kustom, menunjukkan dua cara mengirim pemberitahuan khusus kontrol.
// Send as WM_COMMAND.
SendMessage(GetParent(hwndControl),
WM_COMMAND,
MAKEWPARAM(GetDlgCtrlID(hwndControl), CN_VALUECHANGED),
(LPARAM)hwndControl);
// Send as WM_NOTIFY.
NMHDR nmh;
nmh.code = CN_VALUECHANGED;
nmh.idFrom = GetDlgCtrlID(hwndControl);
nmh.hwndFrom = hwndControl;
SendMessage(GetParent(hwndControl),
WM_NOTIFY,
(WPARAM)hwndControl,
(LPARAM)&nmh);
Perhatikan bahwa struktur NMHDR dapat menjadi bagian dari struktur yang ditentukan kontrol yang lebih besar yang berisi informasi tambahan. Dalam contoh, nilai kontrol lama dan baru mungkin terkandung dalam struktur ini. (Struktur yang diperluas tersebut digunakan dengan banyak pemberitahuan standar; misalnya, lihat LVN_INSERTITEM, yang menggunakan struktur NMLISTVIEW.)
Aksesibilitas
Semua kontrol umum mendukung Microsoft Active Accessibility (MSAA), yang memungkinkan akses terprogram oleh aplikasi teknologi yang dapat diakses seperti pembaca layar. MSAA juga memungkinkan Automasi UI, teknologi yang lebih baru, untuk berinteraksi dengan kontrol.
Kontrol kustom harus mengimplementasikan antarmuka IAccessible (untuk mendukung MSAA) atau antarmuka Automation UI, atau keduanya. Jika tidak, produk teknologi yang dapat diakses hanya akan dapat memperoleh informasi yang sangat terbatas tentang jendela kontrol, tidak akan memiliki akses ke properti kontrol, dan tidak akan dapat memicu peristiwa dalam kontrol.
Untuk informasi selengkapnya tentang membuat kontrol Anda dapat diakses, lihat Windows Automation API.
Topik terkait