Создание обработчиков предварительного просмотра

В этом разделе рассматриваются определенные интерфейсы и методы, необходимые для создания обработчика предварительной версии.

Обработчик предварительной версии должен реализовать следующие интерфейсы:

Если обработчик предварительного просмотра поддерживает визуальные параметры, предоставляемые узлом, например цветом фона и шрифтом, он также должен реализовать следующий интерфейс:

В этом разделе предполагается, что обработчик предварительного просмотра инициализируется потоком и регистрируется для определенного расширения имени файла.

IInitializeWithStream::Initialize

Сохраните параметры IStream и режима, чтобы вы могли считывать данные элемента, когда вы будете готовы к просмотру элемента. Не загружайте данные в . Инициализируйте. Загрузите данные в IPreviewHandler::DoPreview перед рендерингом.

IObjectWithSite

IObjectWithSite::SetSite

Сохраните указатель IUnknown для последующего доступа.

Если у вас есть ссылка на объект IPreviewHandlerFrame, освободите её. Используйте сохраненный указатель IUnknown для вызова QueryInterface на сайте для новой ссылки IPreviewHandlerFrame.

Если у вас есть таблица ускорителя, удалите ее. Вызовите IPreviewHandlerFrame::GetWindowContext, чтобы получить новую таблицу акселераторов. Сохраните эту таблицу. Обратите внимание, что он используется только в качестве списка клавиш быстрого доступа, поддерживаемых рамкой. Команды в записях ускорителя игнорируются.

IObjectWithSite::GetSite

Верните указатель сайта, независимо от того, что это такое.

IOleWindow

IOleWindow::ContextSensitiveHelp

Верните E_NOTIMPL для этого метода.

IOleWindow::GetWindow

Если в настоящее время существует окно обработчика предварительного просмотра, верните HWND этого окна и S_OK. Если окно не существует, вернуть E_FAIL.

IPreviewHandler

IPreviewHandler::SetWindow

Задайте параметр hwnd этого метода как родительский элемент для HWND вашего обработчика предварительного просмотра. Этот метод можно вызывать несколько раз. Измените размер предварительного просмотра, чтобы он отображал только область, описанную параметром prc.

Если средство предварительного просмотра находится в процессе отрисовки, используйте метод IPreviewHandler::SetWindow, чтобы изменить родительский элемент средства предварительного просмотра. Также измените область, в которой средство предварительного просмотра выполняет рендеринг.

IPreviewHandler::SetRect

Измените размер предварительного просмотра так, чтобы он отображал только ту область, которая описана методом prc.

Если средство предварительного просмотра находится в процессе отрисовки, измените область, в которой отрисовывается средство предварительного просмотра.

IPreviewHandler::DoPreview

Вот где выполняется реальная работа. Так как предварительная версия является динамической, содержимое предварительной версии должно загружаться только при необходимости. Не загружайте содержимое в инициализацию.

Если окно обработчика предварительного просмотра не существует, создайте его. Окна обработчика предварительного просмотра должны быть дочерними окнами, предоставляемыми IPreviewHandler::SetWindow. Они должны соответствовать размеру, установленному IPreviewHandler::SetWindow и IPreviewHandler::SetRect, в зависимости от того, что было вызвано последним.

После получения окна загрузите данные из IStream, с помощью которых был инициализирован обработчик предварительного просмотра, и отрисуйте эти данные в окно вашего обработчика предварительного просмотра.

IPreviewHandler::SetFocus

Этот метод вызывается, когда фокус входит в область чтения с помощью действия вкладки. Так как его можно ввести как вкладку вперед или обратную вкладку, используйте текущее состояние клавиши SHIFT, чтобы определить, должна ли первая или последняя остановка вкладки в области чтения получать фокус.

IPreviewHandler::QueryFocus

Этот метод должен вызывать функцию GetFocus и возвращать результат этого вызова в параметре phwnd.

IPreviewHandler::TranslateAccelerator

Этот метод вызывается циклом обработки сообщений процесса обработчика предварительного просмотра (будь то prevhost.exe или пользовательский локальный сервер) в ответ на нажатия клавиш. Обработчики предварительного просмотра должны обрабатывать эти нажатия клавиш или пересылать их хосту в соответствии с приведенным ниже алгоритмом.

Однако, так как предпросмотры доступны только для чтения, ввод с клавиатуры должен быть минимальным, и в большинстве случаев такие оптимизации не требуются.

Если ускоритель клавиатуры, переданный этому методу через насос сообщений, является акселератором, который принимает обработчик предварительного просмотра, затем обработайте его и верните S_OK. Если ваш обработчик не принимает этот акселератор, сообщение акселератора можно отправить обратно вплоть до кадра, где оно будет обработано.

Существует два варианта переадресации ускорителей клавиатуры обратно в кадр:

Простейшая модель — это пересылать все нажатия клавиш на хост с помощью IPreviewHandlerFrame::TranslateAccelerator. Это делается в примере обработчика предварительной версии, предоставленном пакетом SDK для Windows. Все обработчики предварительной версии с низкой целостностью должны использовать эту модель. Если ускоритель не обрабатывается обработчиком предварительной версии, вызовите IPreviewHandlerFrame::TranslateAccelerator и верните результат.

Другая модель — использовать таблицу акселератора в качестве оптимизации, чтобы избежать отправки слишком большого количества нажатий клавиш через границы процесса:

  1. Когда IObjectWithSite::SetSite вызывается в обработчике предварительной версии, получите таблицу акселератора через IPreviewHandlerFrame::GetWindowContext. (Не забудьте освободить дескриптор в таблицу акселератора при уничтожении средства предварительного просмотра.)
  2. Если ускоритель обрабатывается обработчиком предварительной версии, обработайте его и верните S_OK.
  3. Если ускоритель не обрабатывается обработчиком предварительной версии, сравните сообщение с помощью IsAccelerator с полученной таблицей акселераторов.
  4. Если акселератор соответствует записи в этой таблице акселераторов, вызовите IPreviewHandlerFrame::TranslateAccelerator и верните результат.
  5. Если акселератор не соответствует ни одной записи в таблице акселератора, верните S_FALSE.

IPreviewHandler::Выгрузка

При вызове этого метода остановите любую отрисовку, освободите все ресурсы, выделенные при чтении данных из потока, и отпустите сам IStream.

После вызова этого метода обработчик должен быть повторно инициализирован перед любой попыткой вызова IPreviewHandler::DoPreview.

IPreviewHandlerVisuals

Эти методы должны быть реализованы для указания обработчику предварительного просмотра реагировать на цветовые и шрифтовые схемы хоста. Хост запрашивает у обработчика IPreviewHandlerVisuals. Если оно поддерживается, узел предоставляет его цветом, шрифтом и цветом текста.

IPreviewHandlerVisuals::SetBackgroundColor

Сохраните этот цвет и используйте его во время отрисовки, если вы хотите предоставить цвет фона. Например, чтобы заполнить окно, когда обработчик отрисовывает область меньше той, что предоставлена IPreviewHandler::SetWindow и IPreviewHandler::SetRect. Обратите внимание, что вы не должны рисовать за пределами области, предоставленной этими методами.

Если этот метод вызывается, пока предварительная версия уже отрисовывается, то отрисовка должна быть перезапущена с помощью этого цвета фона.

IPreviewHandlerVisuals::SetFont

Сохраните эти сведения о шрифте и используйте его во время отрисовки, если вы хотите отобразить текст, согласованный с текущими параметрами Windows Vista.

IPreviewHandlerVisuals::SetTextColor

Сохраните эти сведения о цвете текста и используйте его во время отрисовки, если вы хотите отобразить текст в соответствии с текущими параметрами Windows Vista.

обработчиков предварительного просмотра и узла предварительного просмотра оболочки

Как зарегистрировать обработчик предварительного просмотра

Руководство по обработчику предварительного просмотра