Menerapkan Tampilan Folder
Windows Shell menyediakan implementasi default tampilan folder, yang secara sehari-hari dikenal sebagai DefView, sehingga Anda dapat menghindari banyak pekerjaan menerapkan ekstensi namespace Anda sendiri. Karena beberapa fitur tampilan tidak dapat dicapai melalui tampilan kustom, sering disarankan agar objek tampilan folder sistem default digunakan sebagai pengganti tampilan kustom. Untuk informasi selengkapnya, lihat SHCreateShellFolderView. Sisa topik ini membahas penerapan tampilan folder kustom yang tidak dapat mendukung fitur tampilan yang lebih baru.
Tidak seperti tampilan pohon, Windows Explorer tidak mengelola isi tampilan folder. Sebagai gantinya, jendela tampilan folder menghosting jendela anak yang disediakan oleh objek folder. Objek folder bertanggung jawab untuk membuat objek tampilan folder untuk menampilkan konten folder di jendela anak.
Kunci untuk mengimplementasikan objek tampilan folder adalah antarmuka IShellView . Antarmuka ini digunakan oleh Windows Explorer untuk berkomunikasi dengan objek tampilan folder. Sebelum menampilkan tampilan folder, Windows Explorer memanggil metode IShellFolder::CreateViewObject objek folder dengan riid diatur ke IID_IShellView. Buat objek tampilan folder dan kembalikan antarmuka IShellView-nya . Objek tampilan folder kemudian harus membuat jendela anak dari jendela tampilan folder dan menggunakan jendela anak untuk menampilkan informasi tentang isi folder.
Selain mengontrol bagaimana data ditampilkan, ekstensi juga dapat menyesuaikan sejumlah fitur Windows Explorer. Misalnya, ekstensi dapat menambahkan item ke bilah alat atau bilah menu, atau menampilkan informasi pada bilah status.
- Objek Tampilan Folder
- Menginisialisasi Objek Tampilan Folder
- Menampilkan Tampilan Folder
- Menerapkan IShellView
- Menggunakan IShellBrowser untuk Berkomunikasi dengan Windows Explorer
Objek Tampilan Folder
Objek tampilan folder adalah objek Model Objek Komponen (COM) yang mengekspos antarmuka IShellView . Objek ini bertanggung jawab untuk:
- Membuat jendela anak dari jendela tampilan folder dan menggunakannya untuk menampilkan isi folder.
- Menangani komunikasi dengan Windows Explorer.
- Menambahkan perintah khusus folder ke bilah menu dan toolbar Windows Explorer dan menangani perintah tersebut saat dipilih.
- Mengelola interaksi pengguna dengan jendela tampilan folder, seperti menampilkan menu pintasan atau menangani operasi seret dan letakkan.
Dokumen ini membahas tiga topik pertama. Karena interaksi pengguna dengan tampilan folder terjadi di dalam jendela anak Anda, objek tampilan folder Anda bertanggung jawab untuk menanganinya seperti yang terjadi pada jendela lain.
Windows Explorer meminta objek tampilan folder dengan memanggil IShellFolder objek folder Anda::CreateViewObject dengan riid diatur ke IID_IShellView. Prosedur untuk membuat tampilan folder adalah:
- Objek folder Anda membuat instans baru objek tampilan folder Anda dan mengembalikan penunjuk ke antarmuka IShellView-nya .
- Windows Explorer menginisialisasi objek tampilan folder dengan memanggil metode IShellView::CreateViewWindow . Buat jendela anak dari jendela tampilan folder dan kembalikan handelnya ke Windows Explorer.
- Objek tampilan folder menggunakan antarmuka Windows ExplorerIShellBrowser untuk menyesuaikan bilah alat Windows Explorer, bilah menu, dan bilah status.
- Objek tampilan folder menampilkan isi folder di jendela anak.
- Objek tampilan folder menangani interaksi pengguna dengan tampilan folder dan bilah alat atau item bilah menu khusus folder.
Menginisialisasi Objek Tampilan Folder
Windows Explorer menginisialisasi objek tampilan folder dengan memanggil metode IShellView::CreateViewWindow . Parameter metode menyediakan objek tampilan folder dengan informasi yang diperlukan untuk membuat jendela anak yang akan digunakan untuk menampilkan konten folder:
- Penunjuk ke antarmuka IShellView objek tampilan folder sebelumnya. Parameter ini dapat diatur ke NULL.
- Struktur FOLDERSETTINGS yang berisi pengaturan tampilan folder sebelumnya.
- Penunjuk ke antarmukaWindows Explorer IShellBrowser .
- Struktur RECT dengan dimensi jendela tampilan folder.
Metode IShellView::CreateViewWindow dipanggil sebelum objek tampilan folder sebelumnya dihancurkan. Penunjuk antarmuka IShellView dengan demikian memungkinkan Anda untuk berkomunikasi dengan objek tampilan folder sebelumnya. Antarmuka ini terutama berguna jika folder sebelumnya milik ekstensi Anda dan menggunakan skema tampilan yang sama. Jika demikian, Anda dapat berkomunikasi dengan objek tampilan folder sebelumnya untuk tujuan seperti bertukar pengaturan privat.
Cara sederhana untuk menentukan apakah penunjuk IShellView milik ekstensi Anda adalah dengan memiliki semua objek tampilan folder Anda mengekspos antarmuka privat. Panggil IShellView::QueryInterface untuk meminta antarmuka privat, dan periksa nilai pengembalian untuk menentukan apakah objek tampilan folder adalah salah satu milik Anda. Anda kemudian dapat menggunakan metode privat pada antarmuka tersebut untuk bertukar informasi.
Struktur FOLDERSETTINGS berisi pengaturan tampilan tampilan folder sebelumnya. Pengaturan utama adalah mode tampilan: ikon besar, ikon kecil, daftar, atau detail. Ada juga bendera yang berisi pengaturan berbagai opsi tampilan, seperti apakah tampilan harus diratakan kiri. Tampilan folder Anda harus mengikuti pengaturan ini sejauh mungkin, untuk memberi pengguna pengalaman yang konsisten saat mereka pergi dari satu folder ke folder lainnya. Anda harus menyimpan struktur ini dan memperbaruinya saat pengaturan berubah. Windows Explorer memanggil IShellView::GetCurrentInfo untuk mendapatkan nilai terbaru dari struktur ini sebelum membuka tampilan folder berikutnya.
Antarmuka IShellBrowser diekspos oleh Windows Explorer. Antarmuka ini adalah pendamping IShellView dan memungkinkan objek tampilan folder untuk berkomunikasi dengan Windows Explorer. Tidak ada cara lain untuk mengambil penunjuk antarmuka ini, sehingga objek tampilan folder Anda harus menyimpannya untuk digunakan nanti. Secara khusus, Anda harus memanggil IShellBrowser::GetWindow untuk mengambil jendela tampilan folder induk yang akan Anda gunakan untuk membuat jendela anak Anda. Perhatikan bahwa metode IShellBrowser::GetWindow tidak disertakan dalam dokumentasi IShellBrowser karena diwarisi dari IOleWindow. Setelah menyimpan penunjuk antarmuka, ingatlah untuk memanggil IShellBrowser::AddRef untuk menambah jumlah referensi antarmuka. Ketika Anda tidak lagi memerlukan antarmuka, panggil IShellBrowser::Release.
Untuk membuat jendela anak Anda:
- Periksa struktur FOLDERSETTINGS dan RECT .
- Jika diperlukan, dapatkan pengaturan privat dari objek tampilan folder sebelumnya.
- Panggil IShellBrowser::GetWindow untuk mengambil jendela tampilan folder induk.
- Buat anak dari jendela tampilan folder yang diperoleh di langkah sebelumnya dan kembalikan ke Windows Explorer.
Menampilkan Tampilan Folder
Setelah Anda membuat jendela anak dan mengembalikannya ke Windows Explorer, Anda dapat menampilkan isi folder. Biasanya, ekstensi menampilkan informasi mereka dengan meminta host jendela anak baik kontrol tampilan daftar atau kontrol WebBrowser. Kontrol tampilan daftar memungkinkan Anda mereplikasi tampilan klasik Windows Explorer. Kontrol WebBrowser memungkinkan Anda menggunakan dokumen HTML Dinamis (DHTML) untuk menampilkan informasi Anda, seperti tampilan Web Windows Explorer. Untuk informasi lebih lanjut, lihat dokumentasi kontrol tersebut.
Jendela tampilan folder selalu ada, meskipun tidak memiliki fokus. Oleh karena itu, Anda harus mempertahankan tiga status untuk jendela anak Anda:
- Diaktifkan dengan fokus. Tampilan folder telah dibuat dan memiliki fokus. Atur item bilah menu atau bilah alat yang sesuai untuk status terfokus.
- Diaktifkan tanpa fokus. Tampilan folder telah dibuat dan aktif, tetapi tidak memiliki fokus. Atur item bilah menu atau bilah alat yang sesuai untuk status yang tidak fokus. Hilangkan item apa pun yang berlaku untuk pilihan item dalam tampilan folder.
- Dinonaktifkan. Tampilan folder akan dihancurkan. Hapus semua item menu khusus folder.
Windows Explorer memberi tahu objek tampilan folder Anda ketika status jendela berubah dengan memanggil IShellView::UIActivate. Pada gilirannya, objek tampilan folder harus memberi tahu Windows Explorer saat pengguna mengaktifkan jendela tampilan folder dengan memanggil IShellBrowser::OnViewWindowActive. Untuk diskusi lebih lanjut tentang antarmuka ini, lihat Menggunakan IShellBrowser untuk Berkomunikasi dengan Windows Explorer.
Saat tampilan folder aktif, Anda perlu memproses pesan Windows apa pun, seperti WM_SIZE, yang termasuk dalam jendela anak Anda. Prosedur jendela Anda juga akan menerima pesan WM_COMMAND untuk item apa pun yang telah Anda tambahkan ke bilah menu atau bilah alat Windows Explorer.
Setelah membuat tampilan folder, Windows Explorer memanggil antarmuka IShellView objek tampilan folder untuk meneruskannya berbagai informasi. Objek Anda harus mengubah tampilannya. Ketika tampilan folder akan dihancurkan, Windows Explorer memberi tahu objek tampilan folder dengan memanggil metode IShellView::D estroyViewWindow .
Menerapkan IShellView
Setelah objek folder dibuat, Windows Explorer memanggil berbagai metode IShellView untuk meminta informasi atau memberi tahu objek perubahan dalam status Windows Explorer. Bagian ini menguraikan cara menerapkan metode IShellView tersebut. Metode yang tersisa digunakan untuk tujuan yang lebih khusus, seperti kotak dialog umum Buka File. Untuk detailnya, lihat dokumentasi IShellView .
AddPropertySheetPages
Saat pengguna memilih Opsi Folder dari menuAlat Windows Explorer, lembar properti ditampilkan yang memungkinkan pengguna untuk mengubah opsi folder. Windows Explorer memanggil metode IShellView::AddPropertySheetPages objek tampilan folder Anda untuk memungkinkan Anda menambahkan halaman ke lembar properti ini.
Windows Explorer meneruskan penunjuk ke fungsi panggilan balik AddPropSheetPageProc dalam parameter lpfnIShellView::AddPropertySheetPages. Panggil CreatePropertySheetPage untuk membuat halaman, lalu panggil AddPropSheetPageProc untuk menambahkannya ke lembar properti. Untuk diskusi lebih lanjut tentang cara menangani lembar properti, lihat Lembar Properti.
GetCurrentInfo
Ketika pengguna beralih dari satu folder ke folder lain, Windows Explorer mencoba mempertahankan tampilan folder serupa. Misalnya, jika tampilan folder sebelumnya menunjukkan ikon besar, yang berikutnya juga harus. Saat Windows Explorer memanggil IShellView::CreateViewWindow untuk menginisialisasi objek tampilan folder Anda, metode menerima struktur FOLDERSETTINGS . Struktur ini berisi informasi yang memungkinkan Anda membuat tampilan folder Anda konsisten dengan tampilan folder sebelumnya.
Untuk membantu memastikan bahwa tampilan berikutnya konsisten dengan tampilan saat ini, simpan struktur FOLDERSETTINGS . Jika tampilan berubah, misalnya dari ikon besar ke kecil, perbarui struktur yang sesuai. Sebelum beralih tampilan, Windows Explorer akan memanggil IShellView::GetCurrentInfo untuk meminta nilai FOLDERSETTINGS saat ini untuk meneruskannya ke objek tampilan folder berikutnya.
Refresh
Pengguna dapat memastikan bahwa tampilan folder mencerminkan status folder saat ini dengan memilih Refresh dari menu Tampilan atau menekan tombol F5. Ketika pengguna melakukannya, Windows Explorer memanggil metode IShellView::Refresh . Objek tampilan folder Anda harus segera memperbarui tampilan folder.
SaveViewState
Windows Explorer memanggil metode IShellView::SaveViewState untuk meminta objek tampilan folder Anda untuk menyimpan status tampilannya. Anda kemudian dapat memulihkan status saat berikutnya folder ditampilkan. Cara yang disukai untuk menyimpan status tampilan adalah dengan memanggil metode IShellBrowser::GetViewStateStream . Metode ini mengembalikan antarmuka IStream yang dapat digunakan objek tampilan folder Anda untuk menyimpan statusnya. Saat membuat tampilan folder lain, Anda dapat memanggil metode IShellBrowser::GetViewStateStream yang sama untuk mendapatkan pointer IStream yang memungkinkan Anda membaca pengaturan yang disimpan oleh tampilan folder sebelumnya.
TranslateAcelerator
Saat pengguna menekan tombol pintasan, Windows Explorer meneruskan pesan ke objek tampilan folder dengan memanggil IShellView::TranslateAccelerator. Kembalikan S_FALSE agar Windows Explorer memproses pesan. Jika objek tampilan folder Anda telah memproses pesan, kembalikan S_OK.
Ketika jendela tampilan folder memiliki fokus, Windows Explorer memanggil IShellView::TranslateAccelerator sebelum memproses pesan. Karena sebagian besar pesan biasanya dikaitkan dengan perintah bilah menu atau bilah alat Windows Explorer, objek tampilan folder Anda biasanya harus kembali S_FALSE. Windows Explorer kemudian dapat memproses pesan secara normal. Kembalikan S_OK hanya jika pesan spesifik folder dan Anda tidak ingin Windows Explorer melakukan pemrosesan lebih lanjut. Jika tampilan folder tidak memiliki fokus, Windows Explorer memproses pesan terlebih dahulu. Ini memanggil IShellBrowser::TranslateAcceleratorSB hanya jika tidak menangani pesan.
Menggunakan IShellBrowser untuk Berkomunikasi dengan Windows Explorer
Antarmuka IShellBrowser digunakan oleh objek tampilan folder untuk berkomunikasi dengan Windows Explorer untuk berbagai tujuan, termasuk:
- Mengubah Bilah Menu Windows Explorer
- Mengubah Bilah Alat Windows Explorer
- Mengubah Bilah Status Windows Explorer
- Menyimpan Informasi Khusus Tampilan
Mengubah Bilah Menu Windows Explorer
Bilah menu Windows Explorer memungkinkan pengguna meluncurkan berbagai perintah. Secara default, bilah menu hanya mendukung perintah yang khusus untuk Windows Explorer. Pesan WM_COMMAND terkait diproses oleh Windows Explorer dan tidak diteruskan ke objek tampilan folder Anda. Namun, Anda dapat memodifikasi bilah menu untuk menyertakan satu atau beberapa item menu khusus folder dengan IShellBrowser. Windows Explorer meneruskan pesan WM_COMMAND terkait dari item tersebut ke prosedur jendela objek folder Anda untuk diproses. Anda juga dapat menghapus atau menonaktifkan perintah standar apa pun yang tidak berlaku untuk aplikasi Anda.
Objek tampilan folder biasanya mengubah bilah menu sebelum tampilan folder pertama kali ditampilkan. Mereka harus mengembalikan bilah menu ke status aslinya ketika tampilan folder dihancurkan. Anda mungkin juga perlu memodifikasi bilah menu setiap kali tampilan folder Anda mendapatkan atau kehilangan fokus.
Karena Windows Explorer memanggil IShellView::UIActivate setiap kali status jendela tampilan folder berubah, modifikasi bilah menu biasanya disertakan dalam implementasi metode tersebut. Prosedur dasar untuk mengubah bilah menu Windows Explorer adalah:
- Panggil CreateMenu untuk membuat handel menu.
- Teruskan handel menu tersebut ke Windows Explorer dengan memanggil IShellBrowser::InsertMenusSB. Windows Explorer akan mengisi informasi menunya.
- Ubah menu sesuai kebutuhan.
- Panggil IShellBrowser::SetMenuSB agar Windows Explorer menampilkan bilah menu yang dimodifikasi.
Windows Explorer memiliki enam menu pop-up pada bilah menunya. Seperti semua kontainer OLE, menu Windows Explorer dibagi menjadi enam grup: File, Edit, Kontainer, Objek, Jendela, dan Bantuan. Tabel berikut ini mencantumkan menu pop-up Windows Explorer dan grup terkait, bersama dengan ID menu.
Menu pop-up | ID | Grup |
---|---|---|
File | FCIDM_MENU_FILE | File |
Edit | FCIDM_MENU_EDIT | File |
Tampilan | FCIDM_MENU_VIEW | Kontainer |
Favorit | FCIDM_MENU_FAVORITES | Kontainer |
Alat | FCIDM_MENU_TOOLS | Kontainer |
Bantuan | FCIDM_MENU_HELP | Jendela |
Ketika Anda meneruskan handel menu ke Windows Explorer dengan memanggil IShellBrowser::InsertMenusSB, Anda juga harus meneruskan penunjuk ke struktur OLEMENUGROUPWIDTHS yang anggotanya telah diinisialisasi ke nol.
Ketika IShellBrowser::InsertMenusSB kembali, Windows Explorer akan menambahkan item menunya. Anda kemudian dapat menggunakan handel menu yang dikembalikan dengan fungsi menu Windows standar seperti InsertMenuItem untuk:
- Tambahkan item ke menu pop-up Windows Explorer.
- Ubah atau hapus item yang ada di menu pop-up Windows Explorer.
- Tambahkan menu pop-up baru.
Gunakan ID yang tercantum dalam tabel untuk mengidentifikasi berbagai menu pop-up Windows Explorer.
Catatan
Untuk menghindari konflik dengan ID perintah Windows Explorer, ID item menu apa pun yang Anda tambahkan harus berada di antara FCIDM_SHVIEWFIRST dan FCIDM_SHVIEWLAST. Kedua nilai ini didefinisikan dalam Shlobj.h.
Setelah Anda selesai memodifikasi menu, panggil IShellBrowser::SetMenuSB agar Windows Explorer menampilkan bilah menu baru.
Setelah tampilan folder awalnya ditampilkan, Windows Explorer memanggil IShellView::UIActivate setiap kali tampilan folder mendapatkan atau kehilangan fokus. Jika Anda memiliki item menu yang sensitif terhadap status tampilan folder, Anda harus mengubah menu yang sesuai, setiap kali status berubah. Misalnya, Anda mungkin memiliki item menu yang bertindak pada item dalam tampilan folder yang telah dipilih oleh pengguna. Anda harus menonaktifkan atau menghapus item menu ini ketika tampilan folder kehilangan fokus.
Ketika Windows Explorer memanggil IShellView::UIActivate untuk menunjukkan bahwa tampilan folder sedang dinonaktifkan, pulihkan bilah menu ke keadaan semula dengan memanggil IShellBrowser::RemoveMenusSB.
Mengubah Bilah Alat Windows Explorer
Selain memodifikasi bilah menu Windows Explorer, Anda juga dapat menambahkan tombol ke toolbar. Seperti halnya bilah menu, modifikasi toolbar biasanya merupakan bagian dari implementasi IShellView::UIActivate . Prosedur untuk menambahkan tombol ke toolbar Windows Explorer adalah:
- Tambahkan bitmap tombol ke daftar gambar toolbar.
- Tentukan string teks tombol.
- Tambahkan tombol ke toolbar.
Untuk menambahkan bitmap ke daftar gambar toolbar, kirim toolbar pesan TB_ADDBITMAP dengan memanggil IShellBrowser::SendControlMsg. Untuk menentukan kontrol toolbar, atur parameter id metode ke FCW_TOOLBAR. Atur wParam ke jumlah gambar tombol di bitmap, dan lParam ke alamat struktur TBADDBITMAP. Indeks gambar dikembalikan dalam parameter pret .
Ada dua cara untuk menentukan string untuk tombol :
- Tetapkan string ke anggota iString dari struktur TBBUTTON tombol.
- Panggil IShellBrowser::SendControlMsg untuk mengirim toolbar mengontrol pesan TB_ADDSTRING . Parameter wParam harus diatur ke nol dan parameter lParam ke string. Indeks string dikembalikan dalam parameter pret .
Untuk menambahkan tombol ke toolbar, isi struktur TBBUTTON dan teruskan ke IShellBrowser::SetToolbarItems. Seperti menu, ID perintah Anda harus berada di antara FCIDM_SHVIEWFIRST dan FCIDM_SHVIEWLAST. Toolbar kemudian akan menambahkan tombol di sebelah kanan tombol yang ada.
Misalnya, fragmen kode berikut menambahkan satu tombol standar ke toolbar Windows Explorer dengan ID perintah IDB_MYBUTTON.
TBADDBITMAP tbadbm;
int iButtonIndex;
TBBUTTON tbb;
tbadbm.hInst = g_hInstance; // The module's instance handle
tbadbm.nID = IDB_BUTTONIMAGE; // The bitmap's resource ID
psb->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 1,
reinterpret_cast<LPARAM>(&tbadbm), &iButtonIndex);
psb->SendControlMsg(FCW_TOOLBAR, TB_ADDSTRING, NULL,
reinterpret_cast<LPARAM>(szLabel), &iStringIndex);
ZeroMemory(&tbb, sizeof(TBBUTTON));
tbb.iBitmap = iButtonIndex;
tbb.iCommand = IDB_MYBUTTON;
tbb.iString = iStringIndex;
tbb.fsState = TBSTATE_ENABLED;
tbb.fsStyle = TBSTYLE_BUTTON;
psb->SetToolbarItems(&tbb, 1, FCT_MERGE);
Untuk diskusi lebih lanjut tentang cara menangani kontrol toolbar, lihat Kontrol Toolbar.
Mengubah Bilah Status Windows Explorer
Anda dapat menggunakan bilah status Windows Explorer untuk menampilkan berbagai informasi yang berguna. Ada dua cara untuk menggunakan bilah status:
- Gunakan IShellBrowser::SetStatusTextSB untuk menampilkan string teks pada bilah status.
- Kirim pesan langsung ke kontrol bilah status dengan IShellBrowser::SendControlMsg.
Metode pertama mudah tetapi cukup untuk banyak tujuan. Untuk fleksibilitas yang lebih besar, Anda dapat mengirim pesan langsung ke kontrol bilah status dengan memanggil IShellBrowser::SendControlMsg dengan parameter id yang diatur ke FCW_STATUS. Untuk diskusi lebih lanjut tentang kontrol bilah status, lihat Bilah Status.
Menyimpan Informasi Khusus Tampilan
Ketika tampilan akan dihancurkan, sering kali berguna untuk menyimpan informasi seperti status tampilan atau pengaturan. Windows Explorer meminta Anda untuk melakukan tugas ini dengan memanggil IShellView::SaveViewState. Cara yang disukai untuk menyimpan informasi khusus tampilan adalah dengan memanggil IShellBrowser::GetViewStateStream. Metode ini memberi Anda antarmuka IStream yang dapat Anda gunakan untuk menyimpan informasi. Anda bebas menggunakan format data yang sesuai.