Создание обработчиков предварительного просмотра
В этом разделе рассматриваются конкретные интерфейсы и методы, необходимые для создания обработчика предварительной версии.
Обработчик предварительного просмотра должен реализовывать следующие интерфейсы:
- IInitializeWithStream::Initialize (настоятельно предпочтительный), IInitializeWithFile или IInitializeWithItem
- IObjectWithSite
- IOleWindow
- IPreviewHandler
Если обработчик предварительного просмотра поддерживает параметры визуальных элементов, предоставляемые узлом, такие как цвет фона и шрифт, он также должен реализовать следующий интерфейс:
В этом разделе предполагается, что обработчик предварительного просмотра инициализирован с помощью потока и зарегистрирован для определенного расширения имени файла.
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
- IPreviewHandler::SetRect
- IPreviewHandler::D oPreview
- IPreviewHandler::SetFocus
- IPreviewHandler::QueryFocus
- IPreviewHandler::TranslateAccelerator
- IPreviewHandler::Unload
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 и верните его результат.
Другая модель заключается в использовании таблицы ускорителей в качестве оптимизации, чтобы избежать отправки слишком большого количества нажатий клавиш через границы процесса:
- При вызове IObjectWithSite::SetSite в обработчике предварительного просмотра получите таблицу ускорителей с помощью IPreviewHandlerFrame::GetWindowContext. (Не забудьте освободить дескриптор таблицы ускорителей при уничтожении средства предварительного просмотра.)
- Если ускоритель обрабатывается обработчиком предварительного просмотра, обработайте его и верните S_OK.
- Если ускоритель не обрабатывается обработчиком предварительного просмотра, сравните сообщение с помощью IsAccelerator с полученной таблицей ускорителей.
- Если ускоритель соответствует записи в таблице ускорителей, вызовите IPreviewHandlerFrame::TranslateAccelerator и верните его результат.
- Если ускоритель не соответствует ни одной записи в таблице ускорителей, верните S_FALSE.
IPreviewHandler::Unload
При вызове этого метода остановите отрисовку, освободив все ресурсы, выделенные путем считывания данных из потока, и отпустите сам IStream .
После вызова этого метода обработчик необходимо повторно инициализировать перед попыткой повторного вызова IPreviewHandler::D oPreview .
IPreviewHandlerVisuals
- IPreviewHandlerVisuals::SetBackgroundColor
- IPreviewHandlerVisuals::SetFont
- IPreviewHandlerVisuals::SetTextColor
Эти методы должны быть реализованы при перенаправлении обработчика предварительного просмотра для реагирования на цветовую и шрифтовую схему узла. Узел запрашивает обработчик для IPreviewHandlerVisuals. Если он поддерживается, узел предоставляет ему цвет, шрифт и цвет текста.
IPreviewHandlerVisuals::SetBackgroundColor
Сохраните этот цвет и используйте его во время отрисовки, когда требуется предоставить цвет фона. Например, чтобы заполнить окно, когда обработчик отрисовывается в области, меньшей, чем область, предоставленная IPreviewHandler::SetWindow и IPreviewHandler::SetRect. Однако обратите внимание, что не следует рисовать за пределами области, предоставляемой этими методами.
Если этот метод вызывается во время предварительного просмотра, отрисовка должна быть перезапущена с использованием этого цвета фона.
IPreviewHandlerVisuals::SetFont
Сохраните эти сведения о шрифте и используйте их во время отрисовки, если требуется отобразить текст в соответствии с текущими параметрами Windows Vista.
IPreviewHandlerVisuals::SetTextColor
Храните эти сведения о цвете текста и используйте их во время отрисовки, если требуется отобразить текст в соответствии с текущими параметрами Windows Vista.
Связанные темы