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

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

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

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

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

IInitializeWithStream::Initialize

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

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::D oPreview

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

Если окно обработчика предварительного просмотра не существует, создайте его. Окна обработчика предварительного просмотра должны быть дочерними элементами окна, предоставленного 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::Unload

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

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

IPreviewHandlerVisuals

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

IPreviewHandlerVisuals::SetBackgroundColor

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

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

IPreviewHandlerVisuals::SetFont

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

IPreviewHandlerVisuals::SetTextColor

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

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

Регистрация обработчика предварительной версии

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