Bagikan melalui


Tentang Kontrol Tab

Kontrol tab dianalogikan dengan pembagi di buku catatan atau label di lemari arsip. Dengan menggunakan kontrol tab, aplikasi dapat menentukan beberapa halaman untuk area yang sama dari jendela atau kotak dialog. 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.

screen shot of a property sheet with five tabs, one for each day of the week

Topik ini mencakup bagian berikut.

Membuat Kontrol Tab

Anda dapat membuat kontrol tab dengan memanggil fungsi CreateWindowEx, 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 Gambar Pemilik.

Anda dapat menentukan bahwa kontrol tab akan membuat kontrol tipsalat dengan menggunakan gaya TCS_TOOLTIPS. Untuk informasi selengkapnya tentang ini, lihat TipsAlat Kontrol Tab.

Tab dan Atribut Tab

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

Untuk menambahkan tab ke kontrol tab, gunakan pesan TCM_INSERTITEM, menentukan posisi item dan alamat 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 anggota lParam dari struktur TCITEM . Jika Anda menggunakan lebih dari 4 byte data yang ditentukan aplikasi, Anda perlu menentukan struktur Anda sendiri dan menggunakannya alih-alih 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 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 anak tanpa mode. 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 perubahan pilihan. 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, kontrol 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 handel ke daftar gambar yang saat ini terkait dengan kontrol tab, 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 kontrol tab lebar tetap dan gambar pemilik, Anda dapat mengatur lebar dan tinggi tab yang 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.

Tab Yang Digambar Pemilik

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

Secara default, itemData anggota DRAWITEMSTRUCT berisi nilai anggota lParam dari 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 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 tipsalat untuk memberikan deskripsi singkat tentang setiap tab dalam kontrol tab. Kontrol tab yang memiliki gaya TCS_TOOLTIPS membuat kontrol tipsalat saat dibuat dan menghancurkan kontrol tipsalat saat dihancurkan. Anda juga dapat membuat kontrol tipsalat dan menetapkannya ke kontrol tab.

Jika Anda menggunakan kontrol tipsalat dengan kontrol tab, jendela induk harus memproses kode pemberitahuan TTN_GETDISPINFO untuk memberikan deskripsi setiap tab berdasarkan permintaan.

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 handel ke kontrol tipsalat saat ini kontrol tab dengan menggunakan pesan TCM_GETTOOLTIPS. Jika Anda membuat kontrol tipsalat Anda sendiri, Anda tidak boleh menggunakan gaya TCS_TOOLTIPS.

Pemrosesan Pesan Kontrol Tab Default

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 tipsalat 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 handel 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 tipsalat, jika ada, dan mengubah pilihan jika pengguna mengklik tab. Jika pengguna mengklik tombol, kontrol akan menggambar ulang tombol untuk memberikan tampilan tenggelam dan mengambil mouse. Jika pengguna mengklik tab atau tombol dan gaya TCS_FOCUSONBUTTONDOWN ditentukan, kontrol mengatur fokus ke dirinya 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 tipsalat, 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 tipsalat.
WM_PAINT Menggambar batas di sekitar area tampilan (kecuali gaya TCS_BUTTONS ditentukan) dan melukis tab apa pun yang beririsan persegi panjang yang tidak valid. Untuk setiap tab, tab menggambar isi tab (atau mengirim pesan WM_DRAWITEM ke jendela induk) lalu menggambar batas di sekitar tab. Jika parameter wParam non-NULL, kontrol mengasumsikan bahwa nilainya adalah 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.