Penangan Pratinjau Bangunan

Topik ini membahas antarmuka dan metode tertentu yang diperlukan untuk membuat penangan pratinjau.

Handler pratinjau harus mengimplementasikan antarmuka berikut:

Jika handler pratinjau Anda mendukung pengaturan visual yang disediakan oleh host seperti warna latar belakang dan font, itu juga harus menerapkan antarmuka berikut:

Topik ini mengasumsikan bahwa handler pratinjau diinisialisasi dengan aliran dan terdaftar untuk ekstensi nama file tertentu.

IInitializeWithStream::Initialize

Simpan parameter IStream dan mode sehingga Anda dapat membaca data item saat Anda siap untuk mempratinjau item. Jangan muat data dalam Inisialisasi. Muat data di IPreviewHandler::D oPreview tepat sebelum Anda merender.

IObjectWithSite

IObjectWithSite::SetSite

Simpan pointer IUnknown untuk akses nanti.

Jika saat ini Anda memiliki referensi ke objek IPreviewHandlerFrame , rilis. Gunakan penunjuk IUnknown yang disimpan untuk memanggil QueryInterface di situs untuk referensi IPreviewHandlerFrame baru.

Jika saat ini Anda memiliki tabel akselerator, hancurkan tabel tersebut. Panggil IPreviewHandlerFrame::GetWindowContext untuk mendapatkan tabel akselerator baru. Simpan tabel ini. Perhatikan bahwa ini hanya digunakan sebagai daftar kunci akselerator yang didukung bingkai. Perintah dalam entri akselerator diabaikan.

IObjectWithSite::GetSite

Kembalikan penunjuk situs, apa pun itu.

IOleWindow

IOleWindow::ContextSensitiveHelp

Mengembalikan E_NOTIMPL untuk metode ini.

IOleWindow::GetWindow

Jika jendela handler pratinjau saat ini ada, kembalikan HWND jendela tersebut dan S_OK. Jika jendela tidak ada, kembalikan E_FAIL.

IPreviewHandler

IPreviewHandler::SetWindow

Atur parameter hwnd dari metode ini ke induk HWND handler pratinjau Anda. Metode ini dapat dipanggil beberapa kali. Mengubah ukuran pratinjau Anda sehingga hanya dirender di area yang dijelaskan oleh parameter rrc .

Jika pemratinjau sedang dalam proses penyajian, gunakan metode IPreviewHandler::SetWindow untuk mengubah induk pemratinjau. Ubah juga area di mana pemratinjau merender.

IPreviewHandler::SetRect

Mengubah ukuran pratinjau Anda sehingga hanya dirender di area yang dijelaskan oleh rrc metode ini.

Jika pemratinjau sedang dalam proses penyajian, ubah area di mana pemratinjau Anda merender.

IPreviewHandler::D oPreview

Di sinilah pekerjaan nyata dilakukan. Karena pratinjau bersifat dinamis, konten pratinjau hanya boleh dimuat saat diperlukan. Jangan muat konten dalam inisialisasi.

Jika jendela handler pratinjau tidak ada, buatlah. Jendela handler pratinjau Anda harus anak-anak dari jendela yang disediakan oleh IPreviewHandler::SetWindow. Mereka harus menjadi ukuran yang disediakan oleh IPreviewHandler::SetWindow dan IPreviewHandler::SetRect (mana yang paling baru dipanggil).

Setelah Anda memiliki jendela, muat data dari IStream yang diinisialisasi oleh handler pratinjau, dan render data tersebut ke jendela handler pratinjau Anda.

IPreviewHandler::SetFocus

Metode ini dipanggil saat fokus memasuki panel baca melalui tindakan tab. Karena dapat dimasukkan sebagai tab maju atau tab terbalik, gunakan status tombol SHIFT saat ini untuk memutuskan apakah perhentian tab pertama atau terakhir di panel baca harus menerima fokus.

IPreviewHandler::QueryFocus

Metode ini harus memanggil fungsi GetFocus dan mengembalikan hasil panggilan tersebut dalam parameter phwnd .

IPreviewHandler::TranslateAccelerator

Metode ini dipanggil oleh pompa pesan proses penangan pratinjau (baik prevhost.exe atau server lokal kustom) sebagai respons terhadap penekanan tombol pengguna. Handler pratinjau harus menangani penekanan tombol ini atau meneruskannya ke host mereka sesuai dengan algoritma yang dirinci di bawah ini.

Namun, karena pratinjau bersifat baca-saja, input keyboard harus minimal dan pengoptimalan seperti ini tidak diperlukan dalam banyak kasus.

Jika akselerator keyboard diteruskan ke metode ini melalui pompa pesan adalah akselerator yang diterima handler pratinjau Anda, maka proses dan kembalikan S_OK. Jika handler Anda tidak menerima akselerator tersebut, pesan akselerator dapat dikirim kembali sejauh bingkai yang akan ditangani.

Ada dua opsi untuk meneruskan akselerator keyboard kembali ke bingkai:

Model paling sederhana adalah meneruskan semua penekanan tombol ke host menggunakan IPreviewHandlerFrame::TranslateAccelerator. Ini dilakukan dalam sampel handler pratinjau yang disediakan dengan Windows Software Development Kit (SDK). Semua penangan pratinjau integritas rendah harus menggunakan model ini. Jika akselerator tidak ditangani oleh handler pratinjau Anda, panggil IPreviewHandlerFrame::TranslateAccelerator dan kembalikan hasilnya.

Model lainnya adalah menggunakan tabel akselerator sebagai pengoptimalan untuk menghindari pengiriman terlalu banyak penekanan tombol di seluruh batas proses:

  1. Ketika IObjectWithSite::SetSite dipanggil pada handler pratinjau Anda, dapatkan tabel akselerator melalui IPreviewHandlerFrame::GetWindowContext. (Pastikan untuk membebaskan handel ke tabel akselerator saat pratinjau Anda dihancurkan.)
  2. Jika akselerator ditangani oleh handler pratinjau Anda, tangani dan kembalikan S_OK.
  3. Jika akselerator tidak ditangani oleh handler pratinjau Anda, bandingkan pesan menggunakan IsAccelerator terhadap tabel akselerator yang diperoleh.
  4. Jika akselerator cocok dengan entri dalam tabel akselerator tersebut, panggil IPreviewHandlerFrame::TranslateAccelerator dan kembalikan hasilnya.
  5. Jika akselerator tidak cocok dengan entri apa pun dalam tabel akselerator, kembalikan S_FALSE.

IPreviewHandler::Unload

Ketika metode ini dipanggil, hentikan penyajian apa pun, rilis sumber daya apa pun yang dialokasikan dengan membaca data dari aliran, dan merilis IStream itu sendiri.

Setelah metode ini dipanggil, handler harus diinisialisasi ulang sebelum upaya untuk memanggil IPreviewHandler::D oPreview lagi.

IPreviewHandlerVisuals

Metode ini harus diimplementasikan saat mengarahkan handler pratinjau untuk merespons skema warna dan font host. Host meminta handler untuk IPreviewHandlerVisuals. Jika ditemukan didukung, host menyediakannya dengan warna, font, dan warna teks.

IPreviewHandlerVisuals::SetBackgroundColor

Simpan warna ini dan gunakan selama penyajian ketika Anda ingin memberikan warna latar belakang. Misalnya, untuk mengisi jendela saat handler merender ke area yang lebih kecil dari area yang disediakan oleh IPreviewHandler::SetWindow dan IPreviewHandler::SetRect. Perhatikan, bagaimanapun, bahwa Anda tidak boleh menggambar di luar area yang disediakan oleh metode tersebut.

Jika metode ini dipanggil saat pratinjau sudah dirender, penyajian harus dimulai ulang menggunakan warna latar belakang ini.

IPreviewHandlerVisuals::SetFont

Simpan informasi font ini dan gunakan selama penyajian ketika Anda ingin menampilkan teks yang konsisten dengan pengaturan Windows Vista saat ini.

IPreviewHandlerVisuals::SetTextColor

Simpan informasi warna teks ini dan gunakan selama penyajian ketika Anda ingin menampilkan teks yang konsisten dengan pengaturan Windows Vista saat ini.

Penangan Pratinjau dan Host Pratinjau Shell

Cara Mendaftarkan Handler Pratinjau

Panduan Handler Pratinjau