Bagikan melalui


Tentang Kontrol Tab

Kontrol tab dianalogikan dengan pembagi dalam buku catatan atau label dalam kabinet file. Dengan menggunakan kontrol tab, aplikasi dapat menentukan beberapa halaman untuk area jendela atau kotak dialog yang sama. Setiap halaman terdiri dari jenis informasi tertentu atau sekelompok kontrol yang ditampilkan aplikasi saat pengguna memilih tab yang sesuai.

Cuplikan layar berikut ini memperlihatkan kontrol tab sederhana yang berisi tab untuk hari dalam seminggu. Tab Selasa telah dipilih.

cuplikan layar lembar properti dengan lima tab, satu untuk setiap hari dalam seminggu

Topik ini mencakup bagian berikut.

Membuat Kontrol Tab

Anda dapat membuat kontrol tab dengan memanggil fungsiCreateWindowEx, menentukan kelas jendela WC_TABCONTROL. Kelas jendela ini didaftarkan ketika DLL kontrol umum dimuat. Untuk memastikan bahwa DLL dimuat, gunakan fungsi InitCommonControlsEx.

Di Microsoft Visual Studio, Anda dapat membuat kontrol tab dengan menggunakan Kotak Alat.

Anda mengirim pesan ke kontrol tab untuk menambahkan tab dan memengaruhi tampilan dan perilaku kontrol. Setiap pesan memiliki makro terkait yang dapat Anda gunakan alih-alih mengirim pesan secara eksplisit. Anda tidak dapat menonaktifkan tab individual dalam kontrol tab. Namun, Anda dapat menonaktifkan kontrol tab di lembar properti dengan menonaktifkan halaman yang sesuai.

Gaya Kontrol Tab

Anda dapat menerapkan karakteristik tertentu ke kontrol tab dengan menentukan gaya kontrol tab saat kontrol dibuat. Misalnya, Anda dapat menentukan perataan dan tampilan umum tab dalam kontrol tab.

Anda dapat menyebabkan tab terlihat seperti tombol dengan menentukan gaya TCS_BUTTONS. Tab dalam jenis kontrol tab ini harus melayani fungsi yang sama dengan kontrol tombol; artinya, mengklik tab harus melakukan perintah alih-alih menampilkan halaman. Karena area tampilan dalam kontrol tab tombol biasanya tidak digunakan, tidak ada batas yang digambar di sekitarnya.

Anda dapat menyebabkan tab menerima fokus input saat diklik dengan menentukan gaya TCS_FOCUSONBUTTONDOWN. Gaya ini biasanya hanya digunakan dengan gaya TCS_BUTTONS. Anda dapat menentukan bahwa tab tidak menerima fokus input saat diklik dengan menggunakan gaya TCS_FOCUSNEVER.

Secara default, kontrol tab hanya menampilkan satu baris tab. Jika tidak semua tab dapat ditampilkan sekaligus, kontrol tab menampilkan kontrol naik turun sehingga pengguna dapat menggulir tab tambahan ke tampilan. Anda dapat menyebabkan kontrol tab menampilkan beberapa baris tab, jika perlu, dengan menentukan gaya TCS_MULTILINE. Dengan gaya ini, semua tab dapat ditampilkan sekaligus. Tab diratakan kiri dalam setiap baris kecuali Anda menentukan gaya TCS_RIGHTJUSTIFY. Dalam hal ini, lebar setiap tab ditingkatkan sehingga setiap baris tab mengisi seluruh lebar kontrol tab.

Kontrol tab secara otomatis mengukur setiap tab agar pas dengan ikonnya, jika ada, dan labelnya. Untuk memberi semua tab lebar yang sama, Anda dapat menentukan gaya TCS_FIXEDWIDTH. Kontrol mengukur semua tab agar pas dengan label terluas, atau Anda dapat menetapkan lebar dan tinggi tertentu dengan menggunakan pesan TCM_SETITEMSIZE. Dalam setiap tab, kontrol akan mempusatkan ikon dan label, menempatkan ikon di sebelah kiri label. Anda dapat memaksa ikon ke kiri, meninggalkan label di tengah, dengan menentukan gaya TCS_FORCEICONLEFT. Anda dapat meratakan kiri ikon dan label dengan menggunakan gaya TCS_FORCELABELLEFT. Anda tidak dapat menggunakan gaya TCS_FIXEDWIDTH dengan gaya TCS_RIGHTJUSTIFY.

Anda dapat menentukan bahwa jendela induk menggambar tab dalam kontrol dengan menggunakan gaya TCS_OWNERDRAWFIXED. Untuk informasi selengkapnya, lihat tab Owner-Drawn.

Anda dapat mengatur bahwa kontrol tab akan membuat kontrol tooltip dengan menggunakan gaya TCS_TOOLTIPS. Untuk informasi selengkapnya tentang ini, lihat Tooltip Kontrol Tab.

Tab dan Atribut Tab

Setiap tab dalam kontrol tab terdiri dari ikon, label, dan data yang ditentukan aplikasi. Informasi ini ditentukan oleh strukturTCITEM. Anda dapat menambahkan tab ke kontrol tab, mengambil jumlah tab, mengambil dan mengatur konten tab, dan menghapus tab. Tab diidentifikasi berdasarkan indeks yang dimulai dari nol.

Untuk menambahkan tab ke kontrol tab, gunakan pesan TCM_INSERTITEM, dengan menentukan posisi item dan alamat dari struktur TCITEM. Anda dapat mengambil dan mengatur konten tab yang sudah ada dengan menggunakan pesan TCM_GETITEM dan TCM_SETITEM. Untuk setiap tab, Anda dapat menentukan ikon, label, atau keduanya. Anda juga dapat menentukan data yang ditentukan aplikasi untuk dikaitkan dengan tab .

Anda dapat mengambil jumlah tab saat ini dengan menggunakan pesan TCM_GETITEMCOUNT, menghapus tab dengan menggunakan pesan TCM_DELETEITEM, dan menghapus semua tab dalam kontrol tab dengan menggunakan pesan TCM_DELETEALLITEMS.

Anda dapat mengaitkan data yang ditentukan aplikasi dengan setiap tab. Misalnya, Anda dapat menyimpan informasi tentang setiap halaman dengan tab yang sesuai. Secara default, kontrol tab mengalokasikan empat byte tambahan per tab untuk data yang ditentukan aplikasi. Anda dapat mengubah jumlah byte tambahan per tab dengan menggunakan pesan TCM_SETITEMEXTRA. Anda hanya dapat menggunakan pesan ini ketika kontrol tab kosong.

Data yang ditentukan aplikasi ditentukan oleh lParam anggota strukturTCITEM. Jika Anda menggunakan lebih dari 4 byte data yang ditentukan oleh aplikasi, Anda perlu menentukan struktur Anda sendiri dan menggunakannya sebagai pengganti TCITEM. Anda dapat mengambil dan mengatur data yang ditentukan aplikasi dengan cara yang sama seperti Anda mengambil dan mengatur informasi lain tentang tab—dengan menggunakan pesan TCM_GETITEM dan TCM_SETITEM.

Anggota pertama dari struktur Anda harus merupakan struktur TCITEMHEADER, dan anggota yang tersisa harus menentukan data yang ditentukan aplikasi. TCITEMHEADER identik dengan TCITEM, kecuali tidak memiliki anggota lParam . Perbedaan antara ukuran struktur Anda dan ukuran TCITEMHEADER harus sama dengan jumlah byte tambahan per tab.

Area Tampilan

Area tampilan kontrol tab adalah area tempat aplikasi menampilkan halaman saat ini. Biasanya, aplikasi membuat jendela atau kotak dialog anak, mengatur ukuran dan posisi jendela agar pas dengan area tampilan. Mengingat persegi panjang jendela untuk kontrol tab, Anda dapat menghitung persegi panjang batas area tampilan dengan menggunakan pesan TCM_ADJUSTRECT.

Terkadang area tampilan harus berukuran tertentu—misalnya, ukuran kotak dialog child modeless. Mengingat persegi panjang pembatas untuk area tampilan, Anda dapat menggunakan TCM_ADJUSTRECT untuk menghitung persegi panjang jendela yang sesuai untuk kontrol tab.

Pilihan Tab

Saat pengguna memilih tab, kontrol tab mengirimkan kode pemberitahuan jendela induknya dalam bentuk pesan WM_NOTIFY. Kode pemberitahuan TCN_SELCHANGING dikirim sebelum pilihan berubah, dan kode pemberitahuan TCN_SELCHANGE dikirim setelah pilihan berubah.

Anda dapat memproses TCN_SELCHANGING untuk menyimpan status halaman keluar. Anda dapat mengembalikan TRUE untuk mencegah pilihan berubah. Misalnya, Anda mungkin tidak ingin beralih dari kotak dialog anak di mana kontrol memiliki pengaturan yang tidak valid.

Anda harus memproses TCN_SELCHANGE untuk menampilkan halaman masuk di area tampilan. Ini mungkin hanya memerlukan perubahan informasi yang ditampilkan di jendela anak. Lebih sering, setiap halaman terdiri dari jendela anak atau kotak dialog. Dalam hal ini, aplikasi mungkin memproses pemberitahuan ini dengan menghancurkan atau menyembunyikan jendela atau kotak dialog anak keluar dan dengan membuat atau memperlihatkan jendela atau kotak dialog anak masuk.

Anda dapat mengambil dan mengatur pilihan saat ini dengan menggunakan pesan TCM_GETCURSEL dan TCM_SETCURSEL.

Daftar Gambar Kontrol Tab

Setiap tab dapat memiliki ikon yang terkait dengannya, yang ditentukan oleh indeks dalam daftar gambar untuk kontrol tab. Saat kontrol tab dibuat, tab tersebut tidak memiliki daftar gambar yang terkait dengannya. Aplikasi dapat membuat daftar gambar dengan menggunakan fungsi ImageList_Create lalu menetapkannya ke kontrol tab dengan menggunakan pesan TCM_SETIMAGELIST.

Anda dapat menambahkan gambar ke daftar gambar kontrol tab seperti yang Anda lakukan ke daftar gambar lainnya. Namun, aplikasi harus menghapus gambar dengan menggunakan pesan TCM_REMOVEIMAGE alih-alih fungsi ImageList_Remove. Pesan ini memastikan bahwa setiap tab tetap terkait dengan gambar yang sama seperti sebelumnya.

Menghancurkan kontrol tab tidak menghancurkan daftar gambar yang terkait dengannya. Anda harus menghancurkan daftar gambar secara terpisah. Ini berguna jika Anda ingin menetapkan daftar gambar yang sama ke beberapa kontrol tab.

Untuk mengambil handle ke daftar gambar yang saat ini terkait dengan kontrol tabulasi, Anda dapat menggunakan pesan TCM_GETIMAGELIST.

Ukuran dan Posisi Tab

Setiap tab dalam kontrol tab memiliki ukuran dan posisi. Anda dapat mengatur ukuran tab, mengambil persegi panjang pembatas tab, atau menentukan tab mana yang berada pada posisi tertentu.

Untuk tab kontrol dengan lebar tetap dan gambar yang digambar oleh pemilik, Anda dapat mengatur lebar dan tinggi tab secara tepat dengan menggunakan pesan TCM_SETITEMSIZE. Di kontrol tab lain, ukuran setiap tab dihitung berdasarkan ikon dan label untuk tab. Kontrol tab menyertakan ruang untuk batas dan margin tambahan. Anda dapat mengatur ketebalan margin dengan menggunakan pesan TCM_SETPADDING.

Anda dapat menentukan persegi panjang pembatas saat ini untuk tab dengan menggunakan pesan TCM_GETITEMRECT. Anda dapat menentukan tab mana, jika ada, berada di lokasi tertentu dengan menggunakan pesan TCM_HITTEST.

Dalam kontrol tab dengan gaya TCS_MULTILINE, Anda dapat menentukan jumlah baris tab saat ini dengan menggunakan pesan TCM_GETROWCOUNT.

Tabs Owner-Drawn

Jika kontrol tab memiliki gaya TCS_OWNERDRAWFIXED, jendela induk harus menggambar tab dengan memproses pesan WM_DRAWITEM. Kontrol tab mengirim pesan ini setiap kali tab perlu dicat. Parameter lParam menentukan alamat strukturDRAWITEMSTRUCT, yang berisi indeks tab, persegi panjang pembatasnya, dan konteks perangkat (DC) tempat menggambar.

Secara default, anggota itemData dari DRAWITEMSTRUCT berisi nilai dari anggota lParam dalam struktur TCITEM. Namun, jika Anda mengubah jumlah data yang ditentukan aplikasi per tab, itemData berisi alamat data sebagai gantinya. Anda dapat mengubah jumlah data yang ditentukan aplikasi per tab dengan menggunakan pesan TCM_SETITEMEXTRA.

Untuk menentukan ukuran item dalam kontrol tab, jendela induk harus memproses pesan WM_MEASUREITEM. Karena semua tab dalam kontrol tab yang digambar pemilik berukuran sama, pesan ini dikirim hanya sekali. Tidak ada gaya kontrol tab untuk tab yang digambar oleh pemilik dengan ukuran yang bervariasi. Anda juga dapat mengatur lebar dan tinggi tab dengan menggunakan pesan TCM_SETITEMSIZE.

TipsAlat Kontrol Tab

Anda dapat menggunakan kontrol tooltip untuk memberikan deskripsi singkat tentang setiap tab dalam kontrol tab. Kontrol tab yang memiliki gaya TCS_TOOLTIPS akan membuat kontrol tooltip ketika dibuat dan akan menghapus kontrol tooltip ketika dihapus. Anda juga dapat membuat kontrol tooltip dan menetapkannya ke kontrol tab.

Jika Anda menggunakan kontrol tooltip dengan kontrol tab, jendela induk harus memproses kode pemberitahuan TTN_GETDISPINFO untuk memberikan deskripsi setiap tab saat diminta.

Untuk menggunakan kontrol tipsalat yang sama dengan lebih dari satu kontrol tab, buat kontrol tipsalat sendiri dan tetapkan ke kontrol tab dengan menggunakan pesan TCM_SETTOOLTIPS. Anda dapat mengambil handle ke kontrol tooltip dari kontrol tab saat ini dengan menggunakan pesan TCM_GETTOOLTIPS. Jika Anda membuat kontrol tooltip Anda sendiri, Anda tidak boleh menggunakan gaya TCS_TOOLTIPS.

Pemrosesan Pesan Pengendalian Tab Bawaan

Bagian ini menjelaskan pemrosesan pesan yang dilakukan oleh kontrol tab. Pesan khusus untuk kontrol tab dibahas di bagian lain dari dokumentasi ini.

Pesan Pemrosesan dilakukan
WM_CAPTURECHANGED Tidak melakukan apa pun jika kontrol tab melepaskan tangkapan mouse itu sendiri. Jika jendela lain menangkap mouse dan tombol ditahan, perintah akan melepaskan tombol.
WM_CREATE Mengalokasikan dan menginisialisasi struktur data internal. Kontrol membuat kontrol tooltip jika gaya TCS_TOOLTIPS ditentukan.
WM_DESTROY Membebaskan sumber daya yang dialokasikan selama pemrosesan WM_CREATE.
WM_GETDLGCODE Mengembalikan kombinasi nilai DLGC_WANTARROWS dan DLGC_WANTCHARS.
WM_GETFONT Mengembalikan handle ke font yang digunakan untuk label.
WM_KEYDOWN Memproses kunci arah dan mengubah pilihan, jika sesuai.
WM_KILLFOCUS Membatalkan validasi tab yang memiliki fokus sehingga akan dicat ulang untuk mencerminkan status yang tidak fokus.
WM_LBUTTONDOWN Meneruskan pesan ke kontrol tooltip, jika ada, dan mengubah pilihan jika pengguna mengklik tab. Jika pengguna mengklik tombol, kontrol akan mengubah tampilan tombol untuk memberikan efek terdorong dan mengendalikan mouse. Jika pengguna mengklik tab atau tombol dan gaya TCS_FOCUSONBUTTONDOWN ditentukan, fokus akan diarahkan ke kontrol itu sendiri.
WM_LBUTTONUP Melepaskan tetikus jika tombol ditekan. Jika kursor berada di atas tombol dan sedang ditahan, kontrol mengubah pilihan yang sesuai dan menggambar ulang tombol.
WM_MOUSEMOVE Meneruskan pesan ke kontrol tooltip, jika ada. Jika gaya TCS_BUTTONS ditentukan dan tombol mouse ditahan setelah mengklik, kontrol juga dapat menggambar ulang tombol yang terpengaruh untuk memberinya tampilan terangkat atau tenggelam.
WM_NOTIFY Meneruskan kode pemberitahuan yang dikirim oleh kontrol tooltip.
WM_PAINT Menggambar batas di sekitar area tampilan (kecuali gaya TCS_BUTTONS ditentukan) dan menggambar tab apa pun yang berpotongan dengan persegi panjang tidak valid. Untuk setiap tab, kontrol ini menggambar isi tab (atau mengirimkan pesan WM_DRAWITEM ke jendela induknya) dan kemudian menggambar batas di sekeliling tab. Jika parameter wParam tidak bernilai NULL, kontrol menganggap bahwa nilainya adalah sebuah HDC dan melukis menggunakan konteks perangkat tersebut.
WM_RBUTTONDOWN Mengirim kode pemberitahuan NM_RCLICK ke jendela induk.
WM_SETFOCUS Membatalkan validasi tab yang memiliki fokus sehingga akan dicat ulang untuk mencerminkan status terfokus.
WM_SETFONT Mengatur font yang digunakan untuk label.
WM_SETREDRAW Mengatur status bendera internal yang menentukan apakah kontrol dicat ulang saat item disisipkan dan dihapus, saat font diubah, dan sebagainya.
WM_SIZE Menghitung ulang posisi tab dan dapat membatalkan bagian kontrol tab untuk memaksa pengecatan ulang beberapa atau semua tab.