Bagikan melalui


Tentang Kontrol Header

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.

screen shot of a dialog box with a three-column header control

Anda dapat membuat kontrol header dengan menggunakan fungsi CreateWindowEx, 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 fungsi InitCommonControlsEx. 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 mengetahui kontrol header dan tidak memungkinkan ruang yang diambil oleh header, dengan hasil bahwa item daftar akan muncul di belakang header. Jika Anda ingin menggunakan kontrol header dalam kotak daftar atau kontrol lainnya, kontrol induk harus digambar 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.

Ukuran dan Posisi Kontrol Header

Biasanya, Anda harus mengatur ukuran dan posisi kontrol header agar pas dalam batas persegi panjang tertentu, seperti area klien 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 struktur HDLAYOUT yang berisi koordinat persegi panjang yang akan ditempati kontrol header dan menyediakan penunjuk ke struktur WINDOWPOS. Kontrol mengisi struktur WINDOWPOS dengan nilai ukuran dan posisi yang sesuai untuk memosisikan kontrol di sepanjang bagian atas persegi panjang yang ditentukan. Nilai tinggi adalah jumlah tinggi batas horizontal kontrol dan tinggi rata-rata karakter dalam font yang saat ini dipilih ke dalam konteks perangkat kontrol.

Jika Anda ingin menggunakan HDM_LAYOUT untuk mengatur ukuran awal dan posisi kontrol header, atur status visibilitas awal kontrol sehingga tersembunyi. Setelah mengirim HDM_LAYOUT untuk mengambil nilai ukuran dan posisi, Anda dapat menggunakan fungsi SetWindowPos untuk 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 mencakup alamat struktur HDITEM. Struktur ini menentukan properti item header, yang dapat mencakup string, gambar bitmapped, ukuran awal, dan nilai LPARAM yang ditentukan aplikasi.

Anggota fmt dari struktur HDITEM item dapat menyertakan bendera HDF_STRING atau HDF_BITMAP untuk menunjukkan apakah kontrol menampilkan string item atau bitmap. Jika Anda ingin menampilkan string dan bitmap, buat item yang digambar pemilik dengan mengatur anggota fmt untuk menyertakan bendera 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 Header Yang Digambar Pemilik

Anda dapat menentukan item individual kontrol header menjadi item yang digambar pemilik. Menggunakan teknik ini memberi Anda lebih banyak kontrol daripada yang Anda miliki selama tampilan item header.

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 menyertakan alamat struktur HDITEM, yang harus memiliki anggota fmt yang 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 pesan adalah pengidentifikasi jendela anak dari kontrol header, dan parameter lParam adalah alamat struktur DRAWITEMSTRUCT . Jendela induk menggunakan informasi dalam struktur untuk menggambar item. Untuk item yang digambar pemilik dalam kontrol header, struktur DRAWITEMSTRUCT berisi informasi berikut.

Anggota Deskripsi
CtlType ODT_HEADER jenis kontrol yang digambar pemilik.
CtlID Pengidentifikasi jendela anak kontrol header.
itemID Indeks item yang akan digambar.
itemAction ODA_DRAWENTIRE bendera tindakan gambar.
itemState ODS_SELECTED bendera tindakan gambar jika kursor ada pada item dan tombol mouse tidak berfungsi. Jika tidak, anggota ini nol.
hwndItem Tangani ke kontrol header.
Hdc Menangani konteks perangkat kontrol header.
rcItem Koordinat item header yang akan digambar. Koordinat relatif terhadap sudut kiri atas kontrol header.
itemData Nilai 32-bit yang ditentukan aplikasi yang terkait dengan item.

 

Filter Kontrol Header

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 .

Pesan Pemrosesan dilakukan
WM_CREATE Menginisialisasi kontrol header.
WM_DESTROY Batal menginisialisasi kontrol header.
WM_ERASEBKGND Mengisi latar belakang kontrol header menggunakan warna latar belakang kontrol saat ini.
WM_GETDLGCODE Mengembalikan kombinasi nilai DLGC_WANTTAB dan DLGC_WANTARROWS.
WM_GETFONT Mengembalikan handel ke font saat ini, yang digunakan oleh kontrol header untuk menggambar teksnya.
WM_LBUTTONDBLCLK Menangkap input mouse. Jika kursor mouse berada di pembagi, kontrol mengirimkan kode pemberitahuan HDN_BEGINTRACK dan mulai menyeret pembagi. Jika kursor ada pada item, item ditampilkan dalam status ditekan.
WM_LBUTTONDOWN Sama seperti pesan WM_LBUTTONDBLCLK.
WM_LBUTTONUP Melepaskan 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.
WM_MOUSEMOVE 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.
WM_NCCREATE Mengalokasikan dan menginisialisasi struktur data internal.
WM_NCDESTROY Membebaskan sumber daya yang dialokasikan oleh kontrol header setelah kontrol header tidak diinisialisasi.
WM_PAINT Mengecat wilayah kontrol header yang tidak valid. Jika parameter wParam non-NULL, kontrol mengasumsikan bahwa nilainya adalah HDC dan melukis menggunakan konteks perangkat tersebut.
WM_SETCURSOR Mengatur bentuk kursor, tergantung pada apakah kursor berada pada pembagi atau dalam item header.
WM_SETFONT Memilih handel font baru ke dalam konteks perangkat untuk kontrol header.