TN040:MFC/OLE就地调整和缩放
备注
以下技术声明,则它在联机文档,首先包括了不更新。因此,某些过程和主题可能已过时或不正确。有关最新信息,建议您搜索议题在联机文档的索引。
此说明讨论问题就地编辑相关,并且服务器应如何完成正确缩放和就地调整大小。 就地激活, WYSIWYG 概念进一步的由于容器和服务器之间的协作以及按照与特别是解释 OLE 规范。
由于支持其中就地激活的容器和服务器之间进行交互) 是从应维护的最终用户的预期:
表示显示 (在 COleServerItem::OnDraw 重写绘制图元文件) 应该能够找到同一,就其进行编辑时 (,但编辑工具绘制不可见)。
当容器缩放时,服务器窗口也是应!
使用相同的指标,容器和服务器应该显示编辑的对象。 这意味着使用基于 逻辑 像素每英寸 —不实际的像素数目的映射模式每英寸,那么,当呈现在显示设备时。
备注
由于就地激活仅适用于嵌入的项目 (未链接) 时,缩放仅适用于嵌入对象。用于放大的您将看到两 COleServerDoc 的 API 和 COleServerItem 。此二分化的原因是链接的和嵌入项是有效的功能在对嵌入对象才是有效的 COleServerItem (这允许您有一个常见实现) 和函数所在 COleServerDoc 类 (从服务器的角度来看,嵌入) 的是 document 。
大多数该开销在服务器实现放置,因为服务器必须知道容器的缩放比例和修改其编辑界面根据需要。 ,但服务器如何确定比例因子容器使用?
MFC 的缩放支持
当前缩放比例可以依赖于调用 COleServerDoc::GetZoomFactor。 调用此,当文档不是就地活动始终会导致 100% 比例因子 (或 1:1 位数)。 调用它被 100% 除以外的内容时,那么,当就地激活可能返回内容。
有关正确缩放的示例请参见 MFC OLE 示例 HIERSVR。 放大 HIERSVR 由该条件它显示文本和文本问题,而线性方式通常,调用 (提示、版式约定、设计宽度和高度所有问题此问题)。 但是, HIERSVR 是合理的为实现正确缩放引用,然后,因此是 MFC 指南 自由曲线 (第 7 步)。
COleServerDoc::GetZoomFactor 确定基于很多其他指标的缩放比例可从容器的或从 COleServerItem 和 COleServerDoc 类的实现。 为简单起见,以下公式取决于当前缩放比例因子:
Position Rectangle (PR) / Container Extent (CE)
容器取决于定位矩形。 它返回到服务器在就地激活时, COleClientItem::OnGetItemPosition 调用时并更新,当容器调用服务器的 COleServerDoc::OnSetItemRects 时 (与 COleClientItem::SetItemRects的调用)。
容器区域稍微复杂的计算。 如果容器调用 COleServerItem::OnSetExtent (与 COleClientItem::SetExtent的调用),则容器区域是此值转换为基于的像素数目的逻辑像素每英寸。 如果容器未调用通常是大小写) 的 SetExtent (,则容器区域是从 COleServerItem::OnGetExtent返回的范围。 因此,因此,如果容器未调用 SetExtent,框架,假设,则执行容器将调用其与 100% 该自然区域 (从 COleServerItem::GetExtent返回的值)。 指定另一种方法,框架,假设容器显示 100% (如果没有,而不是) 该项目。
值得注意的是,因此,即使 COleServerItem::OnSetExtent 和 COleServerItem::OnGetExtent 具有类似的名称,它们不操作项的同一特性。 OnSetExtent 调用调用服务器多少对象是显示在容器 (无论缩放比例),并 OnGetExtent 由容器调用来确定对象的理想的大小。
通过查看涉及的每个 API,您可以获取一个更大的图片:
COleServerItem::OnGetExtent
此函数应返回 “原始大小”在项目的 HIMETRIC 单元。 最好的方法会将 “原始大小”将其定义为,因为该范围看起来,在打印。 返回的范围此处为特定项目目录是常数 (这与图元文件,提供特定项是常数)。 ,在缩放应用于该项目时,此范围不更改。 它通常会更改,当容器通过调用 OnSetExtent为项目更多或小于空间。 更改的示例是一个简单的文本编辑器不包装 “基于上一次区域的文本发送由容器的边距”功能。 如果服务器更改,服务器可能应在系统注册表中设置 OLEMISC_RECOMPOSEONRESIZE 位 (请参见 OLE SDK 文档有关此选项的更多信息)。
COleServerItem::OnSetExtent
,当容器显示 “或多或少”对象时,此函数调用。 大多数容器根本不会调用此。 默认实现在 “m_sizeExtent 存储从容器接收的最后一个值,用于 COleServerDoc::GetZoomFactor ,在计算中描述的容器区域值上面时。
COleServerDoc::OnSetItemRects
,只有在文档处于就地活动状态时,此函数调用。 ,当容器更新项目的位置或剪切适用于项目时,将调用。 定位矩形,如上所述,对于缩放比例计算提供分子中。 服务器可以请求调用 COleServerDoc::RequestPositionChange更改项目位置。 容器可能存在也可能不响应此请求通过调用 OnSetItemRects (与 COleServerItem::SetItemRects的调用)。
COleServerDoc::OnDraw
意识到重写创建的图元文件 COleServerItem::OnDraw 重要的生产相同的图元文件,而不管当前缩放比例,。 容器将调用该图元文件根据需要。 这是视图的 OnDraw 和服务器项目的 OnDraw之间的重要区别。 缩放视图的句柄,项目中创建一个 zoomable 图元文件和任务留给容器执行相应的缩放。
最好的方法确保您的服务器运行正常将使用 COleServerDoc::GetZoomFactor 的实现,如果文档处于就地活动状态。
MFC 为就地调整支持
MFC 则完全实现就地调整大小的接口如 OLE 2 规范所述。 该用户界面 (ui) COleResizeBar 类,自定义消息 WM_SIZECHILD和特殊处理。 COleIPFrameWnd的此消息支持。
您可能需要实现其他处理此消息与该结构提供任何内容。 如上所述,框架将就地调整大小的结果到容器 (服务器响应。比例因子的更改。 如果容器通过设置响应容器区域和定位矩形在处理其 COleClientItem::OnChangeItemPosition 过程 (称为由于调用 COleServerDoc::RequestPositionChange) 就地然后调整导致显示 “或多或少”项目在编辑窗口中。 在处理 COleClientItem::OnChangeItemPosition内,如果容器通过设置定位矩形响应,比例因子将更改,并且该项目将显示 “缩放或”。
服务器可以控制 (对一定程度) 的此协商时发生。 电子表格,例如可能决定显示更多或更少的单元格,当用户调整窗口的大小时,编辑就地时该项。 字处理程序可能决定将 “页边距”,以便与窗口和 rewrap 中的文本与新的边距。 服务器通过将自然实现此区域 (从 COleServerItem::OnGetExtent返回的范围),当调整完成。 这将导致定位矩形和容器绑定到更改的数目,从而相同比例因子,但是,较大或更小查看的区域。 此外,或多或少文档中可见。 OnDraw生成的该图元文件。 在这种情况下,文档更改时,当用户调整该项目,而不是查看的区域。
可以实现自定义调整大小和还是利用 COleResizeBar 提供的用户界面通过在您的 COleIPFrameWnd 类的 WM_SIZECHILD 消息。 有关 WM_SIZECHILD的更多信息,请参见 技术说明 24。