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