Cara Menyesuaikan Bilah Alat
Sebagian besar aplikasi berbasis Windows menggunakan kontrol toolbar untuk memberi pengguna akses mudah ke fungsionalitas program. Namun, toolbar statis memiliki beberapa kekurangan—seperti terlalu sedikit ruang untuk menampilkan semua alat yang tersedia secara efektif. Solusi untuk masalah ini adalah membuat toolbar aplikasi Anda dapat disesuaikan pengguna. Kemudian, pengguna dapat memilih untuk hanya menampilkan alat yang mereka butuhkan, dan mereka dapat mengaturnya dengan cara yang sesuai dengan gaya kerja pribadi mereka.
Catatan
Bilah alat dalam kotak dialog tidak dapat dikustomisasi.
Untuk mengaktifkan kustomisasi, sertakan bendera gaya kontrol umum CCS_ADJUSTABLE saat Anda membuat kontrol toolbar. Ada dua pendekatan dasar untuk kustomisasi:
- Kotak dialog kustomisasi. Kotak dialog yang disediakan sistem ini adalah pendekatan paling sederhana. Ini memberi pengguna antarmuka pengguna grafis yang memungkinkan mereka untuk menambahkan, menghapus, atau memindahkan ikon.
- Menyeret dan menjatuhkan alat. Menerapkan fungsionalitas seret dan letakkan memungkinkan pengguna memindahkan alat ke lokasi lain pada toolbar atau menghapusnya dengan menyeretnya dari toolbar. Ini memberi pengguna cara cepat dan mudah untuk mengatur toolbar mereka, tetapi tidak memungkinkan mereka untuk menambahkan alat.
Anda dapat menerapkan pendekatan atau keduanya, tergantung pada kebutuhan aplikasi. Kedua pendekatan penyesuaian ini tidak menyediakan mekanisme bawaan, seperti tombol Batalkan atau Batalkan, untuk mengembalikan toolbar ke keadaan sebelumnya. Anda harus secara eksplisit menggunakan API kontrol toolbar untuk menyimpan status prekustomisasi toolbar. Jika perlu, Anda nantinya dapat menggunakan informasi tersimpan ini untuk memulihkan bilah alat ke status aslinya.
Apa yang perlu Anda ketahui
Teknologi
Prasyarat
- C/C++
- Pemrograman Antarmuka Pengguna Windows
Petunjuk
Kotak Dialog Kustomisasi
Kotak dialog kustomisasi disediakan oleh kontrol toolbar untuk memberi pengguna cara sederhana untuk menambahkan, memindahkan, atau menghapus alat. Pengguna dapat meluncurkannya dengan mengklik dua kali toolbar. Aplikasi dapat meluncurkan kotak dialog kustomisasi secara terprogram dengan mengirim toolbar mengontrol pesan TB_CUSTOMIZE.
Ilustrasi berikut ini memperlihatkan contoh kotak dialog kustomisasi toolbar.
Alat dalam kotak daftar di sebelah kanan adalah alat yang saat ini ada di toolbar. Awalnya, daftar ini akan berisi alat yang Anda tentukan saat Membuat bilah alat. Kotak daftar di sebelah kiri berisi alat yang tersedia untuk ditambahkan ke toolbar. Aplikasi Anda bertanggung jawab untuk mengisi daftar tersebut (selain dengan Pemisah, yang muncul secara otomatis).
Kontrol toolbar memberi tahu aplikasi Anda bahwa ia meluncurkan kotak dialog kustomisasi dengan mengirim jendela induknya kode pemberitahuan TBN_BEGINADJUST diikuti dengan kode pemberitahuan TBN_INITCUSTOMIZE . Dalam kebanyakan kasus, aplikasi tidak perlu menanggapi kode pemberitahuan ini. Namun, jika Anda tidak ingin kotak dialog Kustomisasi Bilah Alat menampilkan tombol Bantuan, tangani TBN_INITCUSTOMIZE dengan mengembalikan TBNRF_HIDEHELP.
Kontrol toolbar kemudian mengumpulkan informasi yang diperlukan untuk menginisialisasi kotak dialog dengan mengirim tiga seri kode pemberitahuan, dalam urutan berikut:
- Kode pemberitahuan TBN_QUERYINSERT untuk setiap tombol pada toolbar untuk menentukan di mana tombol dapat disisipkan. Kembalikan FALSE untuk mencegah tombol disisipkan ke sebelah kiri tombol yang ditentukan dalam pesan pemberitahuan. Jika Anda mengembalikan FALSE ke semua kode pemberitahuan TBN_QUERYINSERT, kotak dialog tidak akan ditampilkan.
- Kode pemberitahuan TBN_QUERYDELETE untuk setiap alat yang saat ini ada di toolbar. Mengembalikan TRUE jika alat dapat dihapus, atau FALSE jika tidak.
- Serangkaian kode pemberitahuan TBN_GETBUTTONINFO untuk mengisi daftar tombol yang tersedia. Untuk menambahkan tombol ke daftar, isi struktur NMTOOLBAR yang diteruskan dengan kode pemberitahuan dan kembalikan TRUE. Ketika Anda tidak memiliki lebih banyak alat untuk ditambahkan, kembalikan FALSE. Perhatikan bahwa Anda dapat mengembalikan informasi untuk tombol yang sudah ada di toolbar; tombol ini tidak akan ditambahkan ke daftar.
Kotak dialog kemudian ditampilkan, dan pengguna dapat mulai mengkustomisasi toolbar.
Saat kotak dialog terbuka, aplikasi Anda dapat menerima berbagai kode pemberitahuan, tergantung pada tindakan pengguna:
- TBN_QUERYINSERT. Pengguna telah mengubah lokasi alat pada toolbar atau menambahkan alat. Kembalikan FALSE untuk mencegah alat dimasukkan di lokasi tersebut.
- TBN_DELETINGBUTTON. Pengguna akan menghapus alat dari toolbar.
- TBN_CUSTHELP. Pengguna telah mengklik tombol Bantuan.
- TBN_TOOLBARCHANGE. Pengguna telah menambahkan, memindahkan, atau menghapus alat.
- TBN_RESET. Pengguna telah mengklik tombol Reset.
Setelah kotak dialog dihancurkan, aplikasi Anda akan menerima kode pemberitahuan TBN_ENDADJUST .
Contoh kode berikut menunjukkan salah satu cara untuk menerapkan kustomisasi toolbar.
// The buttons are stored in an array of TBBUTTON structures.
//
// Constants such as STD_FILENEW are identifiers for the
// built-in bitmaps that have already been assigned as the toolbar's
// image list.
//
// Constants such as IDM_NEW are application-defined command identifiers.
TBBUTTON allButtons[] =
{
{ MAKELONG(STD_FILENEW, ImageListID), IDM_NEW, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"New" },
{ MAKELONG(STD_FILEOPEN, ImageListID), IDM_OPEN, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Open"},
{ MAKELONG(STD_FILESAVE, ImageListID), IDM_SAVE, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Save"},
{ MAKELONG(STD_CUT, ImageListID), IDM_CUT, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Cut" },
{ MAKELONG(STD_COPY, ImageListID), IDM_COPY, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Copy"},
{ MAKELONG(STD_PASTE, ImageListID), IDM_PASTE, TBSTATE_ENABLED, 0, {0}, 0, (INT_PTR)L"Paste"}
};
// The following appears in the window's message handler.
case WM_NOTIFY:
{
switch (((LPNMHDR)lParam)->code)
{
case TBN_GETBUTTONINFO:
{
LPTBNOTIFY lpTbNotify = (LPTBNOTIFY)lParam;
// Pass the next button from the array. There is no need to filter out buttons
// that are already used—they will be ignored.
int buttonCount = sizeof(allButtons) / sizeof(TBBUTTON);
if (lpTbNotify->iItem < buttonCount)
{
lpTbNotify->tbButton = allButtons[lpTbNotify->iItem];
return TRUE;
}
else
{
return FALSE; // No more buttons.
}
}
break;
case TBN_QUERYINSERT:
case TBN_QUERYDELETE:
return TRUE;
}
}
Alat Seret dan Jatuhkan
Pengguna juga dapat mengatur ulang tombol pada toolbar dengan menekan tombol SHIFT dan menyeret tombol ke lokasi lain. Proses seret dan letakkan ditangani secara otomatis oleh kontrol toolbar. Ini menampilkan gambar hantu tombol saat diseret, dan mengatur ulang toolbar setelah dihilangkan. Pengguna tidak dapat menambahkan tombol dengan cara ini, tetapi mereka dapat menghapus tombol dengan menjatuhkannya dari toolbar.
Meskipun kontrol toolbar biasanya melakukan operasi ini secara otomatis, ia juga mengirim dua kode pemberitahuan aplikasi Anda: TBN_QUERYDELETE dan TBN_QUERYINSERT. Untuk mengontrol proses seret dan letakkan, tangani kode pemberitahuan ini sebagai berikut:
- Kode pemberitahuan TBN_QUERYDELETE dikirim segera setelah pengguna mencoba memindahkan tombol, sebelum tombol hantu ditampilkan. Kembalikan FALSE untuk mencegah tombol dipindahkan. Jika Anda mengembalikan TRUE, pengguna akan dapat memindahkan alat atau menghapusnya dengan menjatuhkannya dari toolbar. Jika alat dapat dipindahkan, alat dapat dihapus. Namun, jika pengguna menghapus alat, kontrol toolbar akan mengirimi aplikasi Anda kode pemberitahuan TBN_DELETINGBUTTON , di mana Anda dapat memilih untuk memasukkan kembali tombol di lokasi aslinya, sehingga membatalkan penghapusan.
- Kode pemberitahuan TBN_QUERYINSERT dikirim ketika pengguna mencoba menjatuhkan tombol pada toolbar. Untuk mencegah tombol yang dipindahkan dijatuhkan ke kiri tombol yang ditentukan dalam pemberitahuan, kembalikan FALSE. Kode pemberitahuan ini tidak dikirim jika pengguna menjatuhkan alat dari toolbar.
Jika pengguna mencoba menyeret tombol tanpa menekan tombol SHIFT, kontrol toolbar tidak akan menangani operasi seret dan letakkan. Namun, ini akan mengirimi aplikasi Anda kode pemberitahuan TBN_BEGINDRAG untuk menunjukkan awal operasi seret, dan kode pemberitahuan TBN_ENDDRAG untuk menunjukkan akhir. Jika Anda ingin mengaktifkan bentuk seret dan letakkan ini, aplikasi Anda harus menangani kode pemberitahuan ini, menyediakan antarmuka pengguna yang diperlukan, dan memodifikasi toolbar untuk mencerminkan perubahan apa pun.
Menyimpan dan Memulihkan Bilah Alat
Dalam proses penyesuaian toolbar, aplikasi Anda mungkin perlu menyimpan informasi sehingga Anda dapat memulihkan toolbar ke status aslinya. Untuk memulai penyimpanan atau pemulihan status toolbar, kirim toolbar mengontrol pesan TB_SAVERESTORE dengan lParam diatur ke TRUE. Nilai lParam pesan ini menentukan apakah Anda meminta operasi simpan atau pemulihan. Setelah pesan dikirim, ada dua cara untuk menangani operasi simpan/pulihkan:
- Dengan kontrol umum versi 4.72 dan yang lebih lama, Anda harus menerapkan handler TBN_GETBUTTONINFO . Kontrol bilah alat mengirimkan kode pemberitahuan ini untuk meminta informasi tentang setiap tombol saat dipulihkan.
- Versi 5.80 menyertakan opsi simpan/pulihkan. Di awal proses, dan saat setiap tombol disimpan atau dipulihkan, aplikasi Anda akan menerima kode pemberitahuan TBN_SAVE atau TBN_RESTORE . Untuk menggunakan opsi ini, Anda harus menerapkan handler pemberitahuan untuk menyediakan bitmap dan informasi status yang diperlukan agar berhasil menyimpan atau memulihkan status toolbar.
Status toolbar disimpan dalam aliran data yang terdiri dari blok data yang ditentukan Shell bergantian dengan blok data yang ditentukan aplikasi. Satu blok data dari setiap jenis disimpan untuk setiap tombol, bersama dengan blok opsional data global yang dapat ditempatkan aplikasi di awal aliran. Selama proses penyimpanan, handler TBN_SAVE Anda menambahkan blok yang ditentukan aplikasi ke aliran data. Selama proses pemulihan, handler TBN_RESTORE membaca setiap blok dan memberi Shell informasi yang diperlukan untuk membangun ulang toolbar.
Cara Menangani Pemberitahuan TBN_SAVE
Kode pemberitahuan TBN_SAVE pertama dikirim di awal proses penyimpanan. Sebelum tombol apa pun disimpan, anggota struktur NMTBSAVE diatur seperti yang ditunjukkan dalam tabel berikut.
Anggota | Pengaturan |
---|---|
iItem | –1 |
cbData | Jumlah memori yang diperlukan untuk data yang ditentukan Shell. |
cButtons | Jumlah tombol. |
pData | Jumlah memori terhitung yang diperlukan untuk data yang ditentukan aplikasi. Biasanya, Anda menyertakan beberapa data global, ditambah data untuk setiap tombol. Tambahkan nilai tersebut ke cbData dan alokasikan cukup memori ke pData untuk menahan semuanya. |
pCurrent | Byte pertama yang tidak digunakan dalam aliran data. Jika Anda tidak memerlukan informasi toolbar global, atur pData pCurrent = sehingga menunjuk ke awal aliran data. Jika Anda memerlukan informasi toolbar global, simpan di pData, lalu atur pCurrent ke awal bagian aliran data yang tidak digunakan sebelum kembali. |
Jika Anda ingin menambahkan beberapa informasi toolbar global, letakkan di awal aliran data. Lanjutkan pCurrent ke akhir data global sehingga menunjuk ke awal bagian aliran data yang tidak digunakan, dan kembali.
Setelah Anda kembali, Shell mulai menyimpan informasi tombol. Ini menambahkan data yang ditentukan Shell untuk tombol pertama pada pCurrent dan kemudian memajukan pCurrent ke awal bagian yang tidak digunakan.
Setelah setiap tombol disimpan, kode pemberitahuan TBN_SAVE dikirim dan NMTBSAVE dikembalikan dengan anggota ini yang ditetapkan sebagai berikut.
Anggota | Pengaturan |
---|---|
iItem | Indeks berbasis nol dari nomor tombol. |
pCurrent | Penunjuk ke byte pertama yang tidak digunakan dalam aliran data. Jika Anda ingin menyimpan informasi tambahan tentang tombol, simpan di lokasi yang ditunjukkan oleh pCurrent dan perbarui pCurrent untuk menunjuk ke bagian pertama yang tidak digunakan dari aliran data setelah itu. |
TBBUTTON | Struktur TBBUTTON yang menjelaskan tombol yang sedang disimpan. |
Ketika Anda menerima kode pemberitahuan, Anda harus mengekstrak informasi spesifik tombol apa pun yang Anda butuhkan dari TBBUTTON. Ingatlah bahwa ketika Anda menambahkan tombol, Anda dapat menggunakan anggota dwData TBBUTTON untuk menyimpan data khusus aplikasi. Muat data Anda ke aliran data di pCurrent. Lanjutkan pCurrent ke akhir data Anda, sekali lagi menunjuk ke awal bagian aliran yang tidak digunakan, dan kembali.
Shell kemudian masuk ke tombol berikutnya, menambahkan informasinya ke pData, memajukan pCurrent, memuat TBBUTTON, dan mengirim kode pemberitahuan TBN_SAVE lainnya. Proses ini berlanjut hingga semua tombol disimpan.
Memulihkan Bilah Alat Tersimpan
Proses pemulihan pada dasarnya membalikkan proses penyimpanan. Di awal, aplikasi Anda akan menerima kode pemberitahuan TBN_RESTORE dengan anggota iItem dari struktur NMTBRESTORE yang diatur ke –1. Anggota cbData diatur ke ukuran pData, dan cButtons diatur ke jumlah tombol.
Penangan pemberitahuan Anda harus mengekstrak informasi global yang ditempatkan di awal pData selama penyimpanan, dan memajukan pCurrent ke awal blok pertama data yang ditentukan Shell. Atur cBytesPerRecord ke ukuran blok data yang Anda gunakan untuk menyimpan data tombol. Atur cButtons ke jumlah tombol, dan kembalikan.
NMTBRESTORE berikutnya adalah untuk tombol pertama. Anggota pCurrent menunjuk ke awal blok pertama data tombol Anda, dan iItem diatur ke indeks tombol. Ekstrak data tersebut dan lanjutkan pCurrent. Muat data ke TBBUTTON, dan kembalikan. Untuk menghilangkan tombol dari toolbar yang dipulihkan, atur idKomand anggota TBBUTTON ke nol. Shell akan mengulangi proses untuk tombol yang tersisa. Selain pesan NMTBSAVE dan NMTBRESTORE , Anda juga dapat menggunakan pesan seperti TBN_RESET untuk menyimpan dan memulihkan toolbar.
Contoh kode berikut menyimpan toolbar sebelum dikustomisasi, dan memulihkannya jika aplikasi menerima pesan TBN_RESET .
int i;
LPNMHDR lpnmhdr;
static int nResetCount;
static LPTBBUTTON lpSaveButtons;
LPARAM lParam;
switch( lpnmhdr->code)
{
case TBN_BEGINADJUST: // Begin customizing the toolbar.
{
LPTBNOTIFY lpTB = (LPTBNOTIFY)lparam;
// Allocate memory for the button information.
nResetCount = SendMessage(lpTB->hdr.hwndFrom, TB_BUTTONCOUNT, 0, 0);
lpSaveButtons = (LPTBBUTTON)GlobalAlloc(GPTR, sizeof(TBBUTTON) * nResetCount);
// In case the user presses reset, save the current configuration
// so the original toolbar can be restored.
for(i = 0; i < nResetCount; i++)
{
SendMessage(lpTB->hdr.hwndFrom,
TB_GETBUTTON, i,
(LPARAM)(lpSaveButtons + i));
}
}
return TRUE;
case TBN_RESET:
{
LPTBNOTIFY lpTB = (LPTBNOTIFY)lparam;
int nCount, i;
// Remove all of the existing buttons, starting with the last one.
nCount = SendMessage(lpTB->hdr.hwndFrom, TB_BUTTONCOUNT, 0, 0);
for(i = nCount - 1; i >= 0; i--)
{
SendMessage(lpTB->hdr.hwndFrom, TB_DELETEBUTTON, i, 0);
}
SendMessage(lpTB->hdr.hwndFrom, // Restore the saved buttons.
TB_ADDBUTTONS,
(WPARAM)nResetCount,
(LPARAM)lpSaveButtons);
}
return TRUE;
case TBN_ENDADJUST: // Free up the memory you allocated.
GlobalFree((HGLOBAL)lpSaveButtons);
return TRUE;
}
Topik terkait