Kontrol header adalah jendela yang biasanya diposisikan di atas kolom teks atau angka. Ini berisi judul untuk setiap kolom, dan dapat dibagi menjadi beberapa bagian. Pengguna dapat menyeret pembagi yang memisahkan bagian untuk mengatur lebar setiap kolom. Ilustrasi berikut ini memperlihatkan kontrol header yang memiliki kolom berlabel yang memberikan informasi terperinci tentang file dalam direktori.
Anda dapat membuat kontrol header dengan menggunakan fungsiCreateWindowEx, menentukan kelas jendela WC_HEADER dan Gaya Kontrol Header yang sesuai. Kelas jendela ini didaftarkan ketika DLL kontrol umum dimuat. Untuk memastikan bahwa DLL ini dimuat, gunakan fungsiInitCommonControlsEx. Setelah membuat kontrol header, Anda dapat membaginya menjadi beberapa bagian, mengatur teks di setiap bagian, dan mengontrol tampilan jendela dengan menggunakan pesan jendela header.
Kontrol header dapat dibuat sebagai jendela anak dari kontrol lain, seperti kotak daftar. Namun, kontrol induk tidak menyadari kontrol header dan tidak memperhitungkan ruang yang ditempati oleh header, sehingga item daftar akan muncul di belakang header. Jika Anda ingin menggunakan kontrol header dalam kotak daftar atau kontrol lain, kontrol induk harus digambar oleh pemilik sehingga semua item ditampilkan dalam posisi yang benar.
Kontrol tampilan daftar sudah memiliki kontrol header. Alih-alih membuat kontrol header untuk kontrol tampilan daftar, Anda menggunakan LVM_GETHEADER atau ListView_GetHeader untuk mengambil kontrol yang ada.
Biasanya, Anda harus mengatur ukuran dan posisi kontrol header agar sesuai dengan batas persegi panjang tertentu, seperti area klien dari sebuah jendela. Dengan menggunakan pesan HDM_LAYOUT, Anda dapat mengambil nilai ukuran dan posisi yang sesuai dari kontrol header.
Saat mengirim HDM_LAYOUT, Anda menentukan alamat strukturHDLAYOUTyang berisi koordinat persegi panjang yang akan ditempati kontrol header dan menyediakan penunjuk ke strukturWINDOWPOS. Kontrol mengisi struktur WINDOWPOS dengan ukuran dan nilai posisi yang sesuai untuk memosisikan kontrol di sepanjang bagian atas persegi panjang yang telah ditentukan. Nilai tinggi adalah jumlah dari tinggi batas horizontal kontrol dan tinggi rata-rata karakter dalam font yang saat ini digunakan dalam konteks perangkat kontrol.
Jika Anda ingin menggunakan HDM_LAYOUT untuk mengatur ukuran dan posisi awal kontrol header, atur status visibilitas awal kontrol sehingga tersembunyi. Setelah mengirim HDM_LAYOUT untuk mengambil nilai ukuran dan posisi, Anda dapat menggunakan fungsisetWindowPosuntuk mengatur ukuran, posisi, dan status visibilitas baru.
Item
Kontrol header biasanya memiliki beberapa item header yang menentukan kolom kontrol. Anda menambahkan item ke kontrol header dengan mengirim pesan HDM_INSERTITEM ke kontrol. Pesan ini mencakup alamat struktur HDITEM. Struktur ini mendefinisikan properti item header, yang dapat mencakup suatu string, suatu citra bitmapped, ukuran awal, dan nilai LPARAM yang ditentukan aplikasi.
Anggota fmt dalam struktur HDITEM dari sebuah item dapat menyertakan flag HDF_STRING atau HDF_BITMAP untuk menunjukkan apakah kontrol menampilkan string atau bitmap item tersebut. Jika Anda ingin menampilkan string dan bitmap, buat item yang digambar oleh pemilik dengan mengatur anggota fmt untuk menyertakan flag HDF_OWNERDRAW. Struktur HDITEM juga menentukan bendera pemformatan yang memberi tahu kontrol apakah akan memusatkan, meratakan kiri, atau meratakan kanan string atau bitmap dalam persegi panjang item.
HDM_INSERTITEM mengembalikan indeks item yang baru ditambahkan. Anda dapat menggunakan indeks di pesan lain untuk mengatur properti atau mengambil informasi tentang item. Anda dapat menghapus item dengan menggunakan pesan HDM_DELETEITEM, menentukan indeks item yang akan dihapus.
Anda bisa menggunakan pesan HDM_SETITEM untuk mengatur properti item header yang sudah ada dan pesan HDM_GETITEM untuk mengambil properti item saat ini. Untuk mengambil hitungan item dalam kontrol header, gunakan pesan HDM_GETITEMCOUNT.
Kontrol Tajuk Owner-Drawn
Anda dapat menentukan item individu dari kontrol header menjadi item yang digambar oleh pemilik. Menggunakan teknik ini memberi Anda lebih banyak kontrol atas tampilan item header dibandingkan yang Anda miliki tanpa teknik tersebut.
Anda bisa menggunakan pesan HDM_INSERTITEM untuk menyisipkan item yang digambar pemilik baru ke dalam kontrol header atau pesan HDM_SETITEM untuk mengubah item yang sudah ada menjadi item yang digambar pemilik. Kedua pesan mencakup alamat struktur HDITEM, yang seharusnya memiliki anggota fmt diatur ke nilai HDF_OWNERDRAW.
Saat kontrol header harus menggambar item yang digambar pemilik, kontrol header harus mengirim pesan WM_DRAWITEM ke jendela induk. Parameter wParam dari pesan adalah pengidentifikasi jendela anak dari kontrol header, dan parameter lParam adalah alamat dari struktur DRAWITEMSTRUCT. Jendela induk menggunakan informasi dalam struktur untuk menggambar item. Untuk item yang digambar oleh pemilik dalam kontrol header, struktur DRAWITEMSTRUCT berisi informasi berikut.
ODS_SELECTED bendera aksi menggambar jika kursor ada pada item dan tombol mouse ditekan. Jika tidak, elemen ini bernilai nol.
hwndItem
Pegangan pada pengontrol header.
hDC
Tangkai ke konteks perangkat grafis pengendali tajuk.
rcItem
Koordinat item header yang akan digambar. Koordinat relatif terhadap sudut kiri atas kontrol header.
itemData
Nilai 32-bit yang ditetapkan oleh aplikasi dan terkait dengan item.
Kontrol Header Filter
Dengan menentukan gaya jendela HDS_FILTERBAR untuk kontrol header, Anda dapat mengaktifkan penempatan kotak edit filter di bawah judul kolom. Tombol filter muncul di samping kotak edit. Anda dapat menerapkan pemfilteran dengan menanggapi kode pemberitahuan HDN_BEGINFILTEREDIT, HDN_ENDFILTEREDIT, HDN_FILTERBTNCLICK, atau HDN_FILTERCHANGE.
Secara default, kotak edit berisi perintah agar pengguna memasukkan teks. Anda dapat memulihkan kotak edit ke status default ini dengan menggunakan Header_ClearFilter atau Header_ClearAllFilters.
Contoh kode berikut menunjukkan cara mengambil kontrol header dari kontrol tampilan daftar dan menambahkan bilah filter.
// hList is the HWND of the list-view control.
HWND hHeader = ListView_GetHeader(hList);
LONG_PTR styles = GetWindowLongPtr(hHeader, GWL_STYLE);
SetWindowLongPtr(g_hHeader, GWL_STYLE, styles | HDS_FILTERBAR);
Pemrosesan Pesan Kontrol Header Default
Bagian ini menjelaskan pesan jendela yang ditangani oleh prosedur jendela untuk kelas jendela WC_HEADER.
Menangkap masukan mouse. Jika kursor mouse berada di pembagi, kontrol akan mengirim kode pemberitahuan HDN_BEGINTRACK dan mulai menyeret pembagi. Jika kursor ada pada item, item ditampilkan dalam status ditekan.
Lepaskan tangkapan mouse. Jika kontrol melacak gerakan mouse, kontrol akan mengirim kode pemberitahuan HDN_ENDTRACK dan menggambar ulang kontrol header. Jika tidak, kontrol mengirimkan kode pemberitahuan HDN_ITEMCLICK dan menggambar ulang item header yang diklik.
Jika pembagi sedang diseret, kontrol akan mengirim kode pemberitahuan HDN_TRACK dan menampilkan item pada posisi baru. Jika tombol mouse kiri tidak berfungsi dan kursor berada pada item, item ditampilkan dalam status ditekan.
Mengecat wilayah kontrol header yang tidak valid. Jika parameter wParam tidak NULL, kontrol mengasumsikan bahwa nilainya adalah HDC dan menggambar menggunakan konteks perangkat tersebut.
Kontrol header memiliki sejumlah gaya, yang dijelaskan di bagian ini, yang menentukan tampilan dan perilaku kontrol. Anda mengatur gaya awal saat membuat kontrol header.