Cara Membuat Handler Ikon

Jenis file sering memiliki ikon kustom yang terkait dengannya, untuk membuat anggotanya mudah dikenali di Windows Explorer. Cara paling sederhana untuk menetapkan ikon kustom ke jenis file adalah dengan mendaftarkan file ikon. Namun, ikon yang terdaftar dengan cara ini akan sama untuk semua anggota jenis file. Anda dapat memiliki lebih banyak fleksibilitas dalam menetapkan ikon kepada anggota jenis file dengan menerapkan handler ikon.

Handler ikon adalah jenis handler ekstensi Shell yang memungkinkan Anda menetapkan ikon secara dinamis kepada anggota jenis file. Setiap kali file jenis ditampilkan, Shell meminta handler untuk ikon yang sesuai. Misalnya, handler ikon dapat menetapkan ikon yang berbeda ke anggota yang berbeda dari jenis file, atau memvariasikan ikon berdasarkan status file saat ini.

Prosedur umum untuk menerapkan dan mendaftarkan handler ekstensi Shell dibahas dalam Membuat Handler Ekstensi Shell. Dokumen ini berfokus pada aspek implementasi yang khusus untuk penangan ikon.

Petunjuk

Langkah 1: Menerapkan Handler Ikon

Seperti semua handler ekstensi Shell, handler ikon adalah objek Component Object Model (COM) dalam proses yang diimplementasikan sebagai DLL. Mereka harus mengekspor dua antarmuka selain IUnknown: IPersistFile dan IExtractIcon.

Shell menginisialisasi handler melalui antarmuka IPersistFile-nya . Ini menggunakan antarmuka ini untuk meminta pengidentifikasi kelas handler (CLSID) dan menyediakannya dengan nama file. Sisa operasi berlangsung melalui antarmuka IExtractIcon . Untuk diskusi umum tentang cara mengimplementasikan handler ekstensi Shell, termasuk antarmuka IPersistFile , lihat Membuat Penangan Ekstensi Shell. Sisa dokumen ini membahas cara mengimplementasikan antarmuka IExtractIcon .

Langkah 2: Menerapkan Antarmuka IExtractIcon

Setelah antarmuka diinisialisasi, Shell menggunakan antarmuka IExtractIcon handler untuk meminta ikon yang sesuai. Antarmuka memiliki dua metode: IExtractIcon::GetIconLocation dan IExtractIcon::Extract.

Ikon diidentifikasi oleh lokasinya dalam sistem file. Metode IExtractIcon::GetIconLocation dipanggil untuk meminta informasi ini. Atur parameter szIconFile ke nama file. Jika ada lebih dari satu ikon dalam file, atur piIndex ke indeks ikon. Tetapkan nilai yang sesuai ke dua variabel bendera. Jika Anda tidak ingin menentukan nama file, atau jika Anda tidak ingin Shell mengekstrak ikon, atur bendera GIL_NOTFILENAME di parameter pwFlags . Anda tidak perlu menetapkan nilai ke szIconFile, tetapi handler harus menyediakan handel ikon ketika Shell memanggil IExtractIcon::Extract.

Jika Anda mengembalikan nama file, Shell biasanya mencoba memuat ikon dari cache-nya. Untuk mencegah pemuatan ikon cache, atur bendera GIL_DONTCACHE di parameter pwFlags . Jika ikon cache tidak dimuat, Shell kemudian memanggil IExtractIcon::Extract untuk meminta handel ikon.

Jika file dan indeks ditentukan oleh IExtractIcon::GetIconLocation, mereka masing-masing diteruskan ke IExtractIcon::Extract dalam parameter pszFile dan nIconIndex . Jika nama file disediakan, handler Anda dapat mengembalikan S_FALSE agar Shell mengekstrak ikon. Jika tidak, handler Anda harus mengekstrak atau menghasilkan ikon besar dan kecil, dan menetapkan handel HICON mereka ke parameter phiconLarge dan phiconSmall . Shell menambahkan ikon ke cache-nya untuk mempercepat panggilan berikutnya ke handler.

Langkah 3: Mendaftarkan Penangan Ikon

Saat Anda secara statis mendaftarkan ikon untuk jenis file, Anda membuat subkunci DefaultIcon di bawah ProgID untuk jenis file. Nilai defaultnya diatur ke file yang berisi ikon . Untuk mendaftarkan handler ikon, Anda masih harus memiliki subkuntang DefaultIcon , tetapi nilai defaultnya harus diatur ke "%1". Tambahkan subkuntang IconHandler ke subkuntang Shellex subkunjud ProgID, dan atur nilai defaultnya ke bentuk string GUID CLSID handler. Untuk diskusi umum tentang cara mendaftarkan penangan ekstensi Shell, lihat Membuat Penangan Ekstensi Shell.

Contoh berikut memodifikasi entri registri dari Ikon Penyesuaian sehingga jenis file .myp sekarang menggunakan penangan menu pintasan alih-alih ikon yang ditentukan secara statis.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = %1
      Shellex
         IconHandler
            (Default) = {The handler's CLSID GUID}

Membuat Handler Ekstensi Shell

IPersistFile

IExtractIcon