生成预览处理程序

本主题讨论创建预览处理程序所需的特定接口和方法。

预览处理程序必须实现以下接口:

如果预览处理程序支持主机提供的视觉设置(如背景色和字体),则它还必须实现以下接口:

本主题假定预览处理程序是使用流初始化的,并且是针对特定文件扩展名注册的。

IInitializeWithStream::Initialize

存储 IStream 和模式参数,以便在准备好预览项时读取项的数据。 请勿在 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

调整预览大小,使其仅在此方法的 中国描述的区域中呈现。

如果预览器正在呈现过程中,请更改预览器呈现的区域。

IPreviewHandler::D oPreview

这就是完成实际工作的地方。 由于预览是动态的,应仅在需要时加载预览内容。 请勿在初始化中加载内容。

如果预览处理程序窗口不存在,请创建它。 预览处理程序的窗口应该是 IPreviewHandler::SetWindow 提供的窗口的子级。 它们应为 IPreviewHandler::SetWindowIPreviewHandler::SetRect (最近) 调用的大小。

拥有窗口后,从初始化预览处理程序时使用的 IStream 加载数据,并将该数据呈现到预览处理程序的窗口中。

IPreviewHandler::SetFocus

当焦点通过选项卡操作进入阅读窗格时,将调用此方法。 由于它可以作为前向选项卡或反向选项卡输入,因此请使用 SHIFT 键的当前状态来决定阅读窗格中的第一个制表位是应接收焦点还是最后一个制表位。

IPreviewHandler::QueryFocus

此方法应调用 GetFocus 函数,并在 phwnd 参数中返回该调用的结果。

IPreviewHandler::TranslateAccelerator

此方法由预览处理程序进程的消息泵调用, (prevhost.exe还是自定义本地服务器) 响应用户击键。 预览处理程序应根据下面详述的算法处理这些击键或将其转发到主机。

但是,由于预览是只读的,因此键盘输入应最小,并且在许多情况下不需要进行此类优化。

如果通过消息泵传递给此方法的键盘快捷键是预览处理程序接受的快捷键,则对其进行处理并返回S_OK。 如果处理程序不接受该加速器,则可以将加速器消息发回要处理的帧。

有两个选项可用于将键盘加速键转发回帧:

最简单的模型是使用 IPreviewHandlerFrame::TranslateAccelerator 将所有击键转发到主机。 这在 Windows 软件开发工具包 (SDK) 随附的预览处理程序示例中完成。 所有低完整性预览处理程序都必须使用此模型。 如果预览处理程序未处理加速器,请调用 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 设置一致的文本时在呈现期间使用它。

预览处理程序和 Shell 预览主机

如何注册预览处理程序

预览处理程序指南