Bagikan melalui


Tentang Kotak Kombo

Kotak kombo menggabungkan kotak edit atau teks statis dan daftar.

Topik ini berisi bagian berikut.

Jenis dan Gaya Kotak Kombo

Kotak kombo terdiri dari daftar dan bidang pilihan. Daftar menyajikan opsi yang dapat dipilih pengguna, dan bidang pilihan menampilkan pilihan saat ini. Jika bidang pilihan adalah kontrol edit, pengguna dapat memasukkan informasi yang tidak tersedia dalam daftar; jika tidak, pengguna hanya dapat memilih item dalam daftar.

Pustaka kontrol umum menyertakan tiga gaya utama kotak kombo, seperti yang diperlihatkan dalam tabel berikut.

Jenis kotak kombo Konstanta gaya Deskripsi
Sederhana CBS_SIMPLE Menampilkan daftar setiap saat, dan memperlihatkan item terpilih dalam kontrol edit.
Drop-down CBS_DROPDOWN Menampilkan daftar ketika ikon diklik, dan memperlihatkan item terpilih dalam kontrol edit.
Daftar drop-down (daftar drop) CBS_DROPDOWNLIST Menampilkan daftar ketika ikon diklik, dan memperlihatkan item terpilih dalam kontrol statis.

 

Cuplikan layar berikut masing-masing memperlihatkan tiga jenis kotak kombo seperti yang mungkin muncul di Windows Vista. Dalam cuplikan layar pertama, pengguna telah memilih item dalam kotak kombo sederhana. Pengguna juga dapat mengetikkan nilai baru dalam kotak edit kontrol ini. Daftar telah berukuran di editor sumber daya Microsoft Visual Studio dan hanya cukup besar untuk mengakomodasi dua item.

screen shot showing an item selected in a simple combo box

Dalam cuplikan layar kedua, pengguna telah mengetik teks baru dalam kontrol edit kotak kombo drop-down. Pengguna juga dapat memilih item yang sudah ada. Kotak daftar diperluas untuk mengakomodasi item sebanyak mungkin.

screen shot showing text typed into a drop-down combo box

Dalam cuplikan layar ketiga, pengguna telah membuka kotak kombo daftar drop-down. Kotak daftar diperluas untuk mengakomodasi item sebanyak mungkin. Pengguna tidak dapat memasukkan teks baru.

screen shot showing an item selected in a drop-down list combo box

Ada juga sejumlah gaya kotak kombo yang menentukan properti tertentu. Gaya kotak kombo menentukan properti tertentu dari kotak kombo. Anda dapat menggabungkan gaya; namun, beberapa gaya hanya berlaku untuk jenis kotak kombo tertentu. Untuk tabel gaya kotak kombo, lihat Gaya Kotak Kombo.

Catatan

Untuk menggunakan gaya visual dengan kotak kombo, aplikasi harus menyertakan manifes dan harus memanggil InitCommonControls di awal program. Untuk informasi tentang gaya visual, lihat Gaya Visual. Untuk informasi tentang manifes, lihat Mengaktifkan Gaya Visual.

 

Daftar Kotak Kombo

Daftar adalah bagian dari kotak kombo yang menampilkan item yang dapat dipilih pengguna. Biasanya, aplikasi menginisialisasi konten daftar saat membuat kotak kombo. Item daftar apa pun yang dipilih oleh pengguna adalah pilihan saat ini. Beberapa item tidak dapat dipilih. Dalam kotak kombo sederhana dan drop-down, pengguna dapat mengetik di bidang pilihan alih-alih memilih item daftar. Dalam kasus ini, tidak ada pilihan saat ini, dan aplikasi bertanggung jawab untuk menambahkan item ke daftar dan menjadikannya pilihan saat ini, jika sesuai untuk melakukannya.

Bagian ini membahas topik berikut:

Pilihan Saat Ini

Pilihan saat ini adalah item daftar yang telah dipilih pengguna; teks yang dipilih muncul di bidang pilihan kotak kombo. Namun, dalam kasus kotak kombo sederhana atau kotak kombo drop-down, pilihan saat ini hanyalah satu bentuk input pengguna yang mungkin dalam kotak kombo. Pengguna juga dapat mengetik teks di bidang pilihan.

Pilihan saat ini diidentifikasi oleh indeks berbasis nol dari item daftar yang dipilih. Aplikasi dapat mengatur dan mengambilnya kapan saja. Prosedur jendela induk atau kotak dialog menerima pemberitahuan ketika pengguna mengubah pilihan saat ini untuk kotak kombo. Jendela induk atau kotak dialog tidak diberi tahu ketika aplikasi mengubah pilihan.

Saat kotak kombo dibuat, tidak ada pilihan saat ini. Ini juga berlaku untuk kotak kombo sederhana atau drop-down, jika pengguna telah mengedit konten bidang pilihan. Untuk mengatur pilihan saat ini, aplikasi mengirim pesan CB_SETCURSEL ke kotak kombo. Aplikasi juga dapat menggunakan pesan CB_SELECTSTRING untuk mengatur pilihan saat ini ke item daftar yang stringnya dimulai dengan string tertentu. Untuk menentukan pilihan saat ini, aplikasi mengirim pesan CB_GETCURSEL ke kotak kombo. Jika tidak ada pilihan saat ini, pesan ini mengembalikan CB_ERR.

Saat pengguna mengubah pilihan saat ini dalam kotak kombo, jendela induk atau prosedur kotak dialog menerima pesan WM_COMMAND dengan kode pemberitahuan CBN_SELCHANGE dalam kata berurutan tinggi dari parameter wParam. Kode pemberitahuan ini tidak dikirim ketika pilihan saat ini diatur menggunakan pesan CB_SETCURSEL.

Kotak kombo drop-down atau kotak daftar drop-down mengirimkan kode pemberitahuan CBN_CLOSEUP ke jendela induk atau prosedur kotak dialog saat daftar drop-down ditutup. Jika pengguna mengubah pilihan saat ini, kotak kombo juga mengirim kode pemberitahuan CBN_SELCHANGE saat daftar drop-down ditutup. Untuk menjalankan proses tertentu setiap kali pengguna memilih item daftar, Anda dapat menangani kode pemberitahuan CBN_SELCHANGE atau CBN_CLOSEUP. Biasanya, Anda akan menunggu kode pemberitahuan CBN_CLOSEUP sebelum memproses perubahan dalam pilihan saat ini. Ini bisa sangat penting jika diperlukan sejumlah besar pemrosesan.

Aplikasi juga dapat memproses kode pemberitahuan CBN_SELENDOK dan CBN_SELENDCANCEL . Sistem mengirim CBN_SELENDOK saat pengguna memilih item daftar, atau memilih item lalu menutup daftar. Ini menunjukkan bahwa pengguna telah selesai, dan bahwa pilihan harus diproses. CBN_SELENDCANCEL dikirim saat pengguna memilih item, tetapi kemudian memilih kontrol lain, menekan ESC saat daftar drop-down terbuka, atau menutup kotak dialog. Ini menunjukkan bahwa pilihan pengguna harus diabaikan. CBN_SELENDOK dikirim sebelum setiap pesan CBN_SELCHANGE .

Dalam kotak kombo sederhana, sistem mengirim kode pemberitahuan CBN_DBLCLK saat pengguna mengklik dua kali item daftar. Dalam kotak kombo turun bawah atau daftar drop-down, satu klik menyembunyikan daftar, sehingga tidak dimungkinkan untuk mengklik dua kali item.

Pemberitahuan dan pesan tertentu hanya berlaku untuk kotak kombo yang berisi daftar drop-down. Saat daftar drop-down terbuka atau tertutup, jendela induk kotak kombo menerima pemberitahuan dalam bentuk pesan WM_COMMAND. Jika daftar sedang dibuka, kata urutan tinggi wParam adalah CBN_DROPDOWN. Jika daftar sedang ditutup, daftar tersebut CBN_CLOSEUP.

Aplikasi dapat membuka daftar kotak kombo drop-down atau kotak daftar drop-down dengan menggunakan pesan CB_SHOWDROPDOWN. Ini dapat menentukan apakah daftar terbuka dengan menggunakan pesan CB_GETDROPPEDSTATE dan dapat menentukan koordinat daftar drop-down dengan menggunakan pesan CB_GETDROPPEDCONTROLRECT. Aplikasi juga dapat meningkatkan lebar daftar drop-down dengan menggunakan pesan CB_SETDROPPEDWIDTH.

Konten Daftar

Saat aplikasi membuat kotak kombo, biasanya menginisialisasi kotak kombo dengan menambahkan satu atau beberapa item ke daftar. Nantinya, aplikasi dapat menambahkan atau menghapus item daftar, menginisialisasi ulang daftar, atau mengambil informasi item darinya.

Aplikasi menambahkan item daftar ke kotak kombo dengan mengirim pesan CB_ADDSTRING ke dalamnya. Item yang ditentukan ditambahkan ke akhir daftar atau, dalam kotak kombo yang diurutkan, dalam posisi yang diurutkan dengan benar berdasarkan string item. Dalam kotak kombo yang tidak diurutkan, aplikasi dapat menggunakan pesan CB_INSERTSTRING untuk menyisipkan item pada posisi tertentu. Setelah ditambahkan, item daftar diidentifikasi oleh posisinya.

Dengan menggunakan pesan CB_FINDSTRING atau CB_FINDSTRINGEXACT, aplikasi dapat menentukan posisi item daftar. CB_FINDSTRING menemukan item yang stringnya dimulai dengan string yang ditentukan. CB_FINDSTRINGEXACT menemukan item yang stringnya cocok dengan string dengan tepat. Tidak ada pesan yang peka huruf besar/kecil.

Aplikasi dapat menghapus item daftar dengan menggunakan pesan CB_DELETESTRING. Jika aplikasi perlu menginisialisasi ulang daftar kotak kombo, aplikasi tersebut dapat terlebih dahulu menghapus seluruh kontennya dengan menggunakan pesan CB_RESETCONTENT. Saat menambahkan beberapa item ke daftar setelah kotak kombo ditampilkan, aplikasi dapat menghapus bendera redraw untuk mencegah kotak kombo dicat ulang setelah setiap item ditambahkan. Untuk informasi selengkapnya tentang penggalian ulang, lihat deskripsi pesan WM_SETREDRAW .

Untuk mengambil string yang terkait dengan item daftar, aplikasi dapat menggunakan pesan CB_GETLBTEXT. String item disalin ke buffer yang ditentukan oleh aplikasi. Untuk memastikan bahwa buffer cukup besar untuk menerima string, aplikasi dapat terlebih dahulu menggunakan pesan CB_GETLBTEXTLEN untuk menentukan panjang string. Untuk mendapatkan jumlah item daftar dalam kotak kombo, aplikasi dapat menggunakan pesan CB_GETCOUNT.

Edit Bidang Pilihan Kontrol

Aplikasi dapat mengambil atau mengatur konten bidang pilihan dan dapat menentukan atau mengatur pilihan edit. Aplikasi juga dapat membatasi jumlah teks yang dapat di ketik pengguna di bidang pilihan. Ketika konten bidang pilihan berubah, sistem mengirim pesan pemberitahuan ke jendela induk atau prosedur kotak dialog.

Untuk mengambil konten bidang pilihan, aplikasi dapat mengirim pesan WM_GETTEXT ke kotak kombo. Untuk mengatur konten bidang pilihan dari kotak kombo sederhana atau drop-down, aplikasi dapat mengirim pesan WM_SETTEXT ke kotak kombo.

Pilihan edit adalah rentang teks yang dipilih, jika ada, di bidang pilihan kotak kombo sederhana atau turun bawah. Aplikasi dapat menentukan posisi karakter awal dan akhir dari pilihan saat ini dengan menggunakan pesan CB_GETEDITSEL. Ini juga dapat memilih karakter dalam pilihan edit dengan menggunakan pesan CB_SETEDITSEL.

Awalnya, jumlah teks yang dapat di ketik pengguna ke dalam bidang pilihan dibatasi oleh ukuran bidang pilihan. Namun, jika kotak kombo memiliki gaya CBS_AUTOHSCROLL , teks dapat berlanjut di luar ukuran bidang pilihan. Aplikasi dapat menggunakan pesan CB_LIMITTEXT untuk membatasi jumlah teks yang dapat diketik pengguna ke dalam bidang pilihan, terlepas dari apakah kontrol memiliki gaya CBS_AUTOHSCROLL.

Saat pengguna mengedit konten bidang pilihan, jendela induk atau prosedur kotak dialog menerima pesan pemberitahuan. Kode pemberitahuan CBN_EDITUPDATE dikirim terlebih dahulu, menunjukkan bahwa teks di bidang pilihan telah diedit. Setelah teks yang diubah ditampilkan, sistem mengirim CBN_EDITCHANGE. Ketika isi bidang pilihan berubah sebagai hasil dari item daftar yang dipilih, pesan ini tidak dikirim.

Kotak Kombo Yang Digambar Pemilik

Aplikasi dapat membuat kotak kombo yang digambar pemilik untuk bertanggung jawab atas pengecatan item daftar. Jendela induk kotak kombo yang digambar pemilik (pemiliknya) menerima pesan WM_DRAWITEM ketika sebagian kotak kombo perlu dicat. Kotak kombo yang digambar pemilik dapat mencantumkan informasi selain, atau selain string teks. Kotak kombo yang digambar pemilik bisa dari jenis apa pun. Namun, kontrol edit dalam kotak kombo sederhana atau turun bawah hanya dapat menampilkan teks, sementara pemilik melukis bidang pilihan dalam kotak daftar drop-down.

Pemilik kotak kombo yang digambar pemilik harus memproses pesan WM_DRAWITEM. Pesan ini dikirim setiap kali sebagian kotak kombo harus digambar ulang. Pemilik mungkin perlu memproses pesan lain, tergantung pada gaya yang ditentukan untuk kotak kombo.

Aplikasi dapat membuat kotak kombo yang digambar pemilik dengan menentukan gaya CBS_OWNERDRAWFIXED atau CBS_OWNERDRAWVARIABLE. Jika semua item daftar dalam kotak kombo memiliki tinggi yang sama, seperti string atau ikon, aplikasi dapat menggunakan gaya CBS_OWNERDRAWFIXED . Jika item daftar memiliki tinggi yang bervariasi, seperti bitmap dengan ukuran yang berbeda, aplikasi dapat menggunakan gaya CBS_OWNERDRAWVARIABLE .

Pemilik kotak kombo yang digambar pemilik dapat memproses pesan WM_MEASUREITEM untuk menentukan dimensi item daftar dalam kotak kombo. Jika aplikasi membuat kotak kombo dengan menggunakan gaya CBS_OWNERDRAWFIXED, sistem hanya mengirim pesan WM_MEASUREITEM sekali. Dimensi yang ditentukan oleh pemilik digunakan untuk semua item daftar. Jika gaya CBS_OWNERDRAWVARIABLE digunakan, sistem mengirim pesan WM_MEASUREITEM untuk setiap item daftar yang ditambahkan ke kotak kombo. Pemilik dapat menentukan atau mengatur tinggi item daftar kapan saja dengan menggunakan pesan CB_GETITEMHEIGHT dan CB_SETITEMHEIGHT.

Jika informasi yang ditampilkan dalam kotak kombo yang digambar pemilik menyertakan teks, aplikasi dapat melacak teks untuk setiap item daftar dengan menentukan gaya CBS_HASSTRINGS. Kotak kombo dengan gaya CBS_SORT diurutkan berdasarkan teks ini. Jika kotak kombo diurutkan dan bukan gaya CBS_HASSTRINGS, pemilik harus memproses pesan WM_COMPAREITEM.

Dalam kotak kombo yang digambar pemilik, pemilik harus melacak item daftar yang berisi informasi selain atau selain teks. Salah satu cara mudah untuk melakukan ini adalah dengan menyimpan handel ke informasi sebagai data item. Untuk membebaskan objek data yang terkait dengan item dalam kotak kombo, pemilik dapat memproses pesan WM_DELETEITEM.

Kotak Kombo Subkelas

Subkelas adalah prosedur yang memungkinkan aplikasi untuk mencegat dan memproses pesan yang dikirim atau diposting ke jendela. Dengan menggunakan subkelas, aplikasi dapat mengganti pemrosesannya sendiri untuk pesan tertentu, sambil meninggalkan sebagian besar pemrosesan pesan ke prosedur jendela yang ditentukan kelas.

Ketika sistem operasi membuat jendela, sistem operasi menyimpan informasi tentang hal itu dalam struktur data internal yang menyertakan penunjuk ke prosedur jendela. Untuk subkelas jendela, aplikasi memanggil fungsi SetClassLong untuk mengganti penunjuk ke prosedur tersebut dengan penunjuk ke prosedur subkelas yang ditentukan aplikasi. Setelah itu, semua pesan ke jendela dikirim ke prosedur subkelas. Prosedur ini kemudian menggunakan fungsi CallWindowProc untuk meneruskan pesan yang tidak diolah ke prosedur jendela asli. Untuk deskripsi pemrosesan pesan yang dilakukan oleh prosedur jendela kelas COMBOBOX, lihat Perilaku Kotak Kombo Default.

Saat kotak kombo berada di luar kotak dialog, aplikasi tidak dapat memproses tombol TAB, ENTER, dan ESC kecuali menggunakan prosedur subkelas. Saat kotak kombo sederhana atau drop-down menerima fokus input, kotak tersebut segera mengatur fokus ke kontrol pengeditan anaknya. Oleh karena itu, aplikasi harus mensubkelas kontrol edit untuk mencegat input keyboard untuk kotak kombo sederhana atau drop-down. Untuk contoh ini, lihat Subkelas Kotak Kombo.

Jika prosedur subkelas memproses pesan WM_PAINT, prosedur tersebut harus menggunakan fungsi BeginPaint untuk mempersiapkan pengecatan. Sebelum memanggil fungsi EndPaint, ia melewati handel konteks perangkat (DC) sebagai parameter wParam untuk prosedur jendela. Jika EndPaint dipanggil terlebih dahulu, prosedur jendela kelas tidak melakukan pengecatan karena EndPaint memvalidasi seluruh jendela.

Teknik yang terkait dengan subkelas adalah superclassing. Superclass menyerupan kelas lain kecuali bahwa prosedur jendelanya tidak memanggil DefWindowProc untuk menangani pesan yang tidak diproscesikan. Sebaliknya, ini meneruskan pesan yang tidak diproses ke prosedur jendela untuk kelas jendela induk. Ikuti panduan dalam Prosedur Jendela untuk menghindari masalah yang dapat terjadi dengan subkelas dan superkelas.