跳转到主要内容
Visual Components 在 FRE for Windows 中提供。
Component Synchronizer 是一个特殊组件,可对 Visual Components 中发生的各种事件自动作出响应。您可以将多个 Visual Components 连接到 Synchronizer,使它们像一个统一的应用程序一样协同工作。 您无需将整套组件都连接到 Component Synchronizer,只需连接实际使用的组件即可。例如,您可以仅通过 ImageViewer 属性将 Image Viewer 连接到它,并通过 TextEditor 属性将 Text Editor 连接到它。 Component Synchronizer 没有用户界面。它不使用 Visual Components 的任何内部功能,只使用这些组件的 COM API。Component Synchronizer 的工作方式如下所述。

当组件通过 API 连接到 Synchronizer 时

如果某个组件或对象通过以下方式连接到 Component Synchronizer:
在这种情况下,IComponentSynchronizer::ImageViewer 属性将被设置为指定的 ImageViewer 对象,然后执行以下操作:
属性设置为
IImageViewer::ZoomRectEnabledTrue
IImageViewer::DocumentProcessingParamsIComponentSynchronizer::DocumentProcessingParams
IImageViewer::FRPageIComponentSynchronizer::Document 中索引为 IComponentSynchronizer::PageIndex 的页面
在这种情况下,IComponentSynchronizer::ZoomViewer 属性将被设置为指定的 ZoomViewer 对象,然后执行以下操作:
属性设置为
IZoomViewer::SymbolRectEnabledTrue
IZoomViewer::DocumentProcessingParamsIComponentSynchronizer::DocumentProcessingParams
IZoomViewer::FRPageIComponentSynchronizer::Document 中索引为 IComponentSynchronizer::PageIndex 的页面
在这种情况下,IComponentSynchronizer::TextEditor 属性将被设置为指定的 TextEditor 对象,然后执行以下操作:
属性设置为
ITextEditor::SynthesisParamsForDocumentIComponentSynchronizer::DocumentProcessingParams 对象的 SynthesisParamsForDocument 属性值
ITextEditor::FRPageIComponentSynchronizer::Document 中索引为 IComponentSynchronizer::PageIndex 的页面
在这种情况下,IComponentSynchronizer::TextValidator 属性将被设置为指定的 TextValidator 对象,然后执行以下操作:
属性设置为
ITextValidator::SynthesisParamsForDocumentIComponentSynchronizer::DocumentProcessingParams 对象的 SynthesisParamsForDocument 属性值
ITextValidator::FRDocumentIComponentSynchronizer::Document
在这种情况下,IComponentSynchronizer::DocumentViewer 属性将被设置为指定的 DocumentViewer 对象,然后执行以下操作:
属性设置为
IDocumentViewer::FRDocumentIComponentSynchronizer::Document
IDocumentViewer::DocumentProcessingParamsIComponentSynchronizer::DocumentProcessingParams
IDocumentViewer::ActivePageIComponentSynchronizer::Document 中索引为 IComponentSynchronizer::PageIndex 的页面
在这种情况下,IComponentSynchronizer::Document 属性将被设置为指定的 FRDocument 对象,然后执行以下操作:
属性设置为
IImageViewer::FRPage IZoomViewer::FRPage ITextEditor::FRPage IDocumentViewer::ActivePageIComponentSynchronizer::Document 中的第一个页面
IComponentSynchronizer::PageIndex0
IDocumentViewer::FRDocument ITextValidator::FRDocumentIComponentSynchronizer::Document
在这种情况下,IComponentSynchronizer::DocumentProcessingParams 属性将被设置为指定的 DocumentProcessingParams 对象,然后执行以下操作:
属性设置为
IImageViewer::DocumentProcessingParams IZoomViewer::DocumentProcessingParams IDocumentViewer::DocumentProcessingParamsIComponentSynchronizer::DocumentProcessingParams
ITextEditor::SynthesisParamsForDocument ITextValidator::SynthesisParamsForDocumentIComponentSynchronizer::DocumentProcessingParams 对象的 SynthesisParamsForDocument 属性值
在这种情况下,IComponentSynchronizer::PageIndex 属性将被设置为指定的值,然后执行以下操作:
属性设置为
IImageViewer::FRPage IZoomViewer::FRPage ITextEditor::FRPage IDocumentViewer::ActivePageIComponentSynchronizer::Document 中索引为 IComponentSynchronizer::PageIndex 的页面

当已连接的组件生成事件时

已连接的 Image Viewer 的事件:
如果 Image Viewer 生成 OnMouseButtonUp 事件,Component Synchronizer 将执行以下操作:
if( mouseButton == MBU_LeftButton && ZoomViewer != 0 ) {
 int documentX = 0;
 int documentY = 0;
 ImageViewer->ScreenToDocument( x, y, &documentX, &documentY );
 ZoomViewer->CenterOnDocumentPoint( documentX, documentY );
}
如果 Image Viewer 生成 OnBlockSelectionChanged 事件,Component Synchronizer 将执行以下操作:
if( selected == VARIANT_TRUE ) {
 if( textEditor != 0 ) {
  textEditor->ShowBlock( blockIndex, NotFound );
 }
}
如果 Image Viewer 生成 OnTableCellsSelected 事件,Component Synchronizer 将调用 TextEditor 对象的 ShowBlock 方法,并传入所选块索引和右下角单元格索引。
如果 Image Viewer 生成 OnAfterDblClick 事件,Component Synchronizer 将执行以下操作:
if( textEditor != 0 ) {
 textEditor->ActivateOn( blockIndex, x, y );
}
如果 Image Viewer 生成 OnActivePageChanged 事件,并且 ComponentSynchronizer 对象的 ZoomViewer、TextEditor 和 DocumentViewer 属性已设置,则相应组件的 FRPage 或 ActivePage 属性会被设置为文档中指定的页面。
如果 Image Viewer 生成 OnSelectTool 事件,Component Synchronizer 将执行以下操作:
if( ZoomViewer == 0 ) {
 return;
}
IFRPagePtr curPage;
ZoomViewer->get_FRPage( &curPage );
if( curPage != 0 ) {
 ZoomViewer->put_ActiveTool( selectedTool );
}
如果 Image Viewer 生成 OnOptionsChanged 事件,并且 ComponentSynchronizer 对象的 ZoomViewer、DocumentViewer、TextEditor 和 TextValidator 属性已设置,则会调用 ZoomViewer、DocumentViewer、TextEditor 和 TextValidator 对象的 UpdateOptions 方法。
已连接的 Zoom Viewer 的事件:
如果 Zoom Viewer 生成 OnVisibleDocumentAreaChange 事件,Component Synchronizer 将执行以下操作:
if( ImageViewer != 0 ) {
 ImageViewer->put_ZoomRect( visibleRect );
 if( isInFocus ) {
  ImageViewer->ShowDocumentArea( visibleRect );
 }
}
如果 Zoom Viewer 生成 OnBlockSelectionChanged 事件,Component Synchronizer 将执行以下操作:
if( selected == VARIANT_TRUE ) {
 if( textEditor != 0 ) {
  textEditor->ShowBlock( blockIndex, NotFound );
 }
}
如果 Zoom Viewer 生成 OnTableCellsSelected 事件,Component Synchronizer 将调用 TextEditor 对象的 ShowBlock 方法,并传入所选块索引和右下角单元格索引。
如果 Zoom Viewer 触发 OnAfterDblClick 事件,Component Synchronizer 将执行以下操作:
if( textEditor != 0 ) {
 textEditor->ActivateOn( blockIndex, x, y );
}
如果 Zoom Viewer 触发 OnActivePageChanged 事件,且 ComponentSynchronizer 对象的 ImageViewer、TextEditor、DocumentViewer 属性已设置,则相应组件的 FRPage 或 ActivePage 属性将被设置为文档中的指定页面。
如果 Zoom Viewer 触发 OnSelectTool 事件,Component Synchronizer 将执行以下操作:
if( ImageViewer == 0 ) {
 return;
}
IFRPagePtr curPage;
ImageViewer->get_FRPage( &curPage );
if( curPage != 0 ) {
 ImageViewer->put_ActiveTool( selectedTool );
}
如果 Zoom Viewer 触发 OnOptionsChanged 事件,且 ComponentSynchronizer 对象的 ImageViewer、DocumentViewer、TextEditor、TextValidator 属性已设置,则将调用 ImageViewer、DocumentViewer、TextEditor、TextValidator 对象的 UpdateOptions 方法。
已连接的 Document Viewer 的事件:
如果 Document Viewer 触发 OnActivePageChanged 事件,且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer、TextEditor 属性已设置,则相应组件的 FRPage 属性将被设置为文档中的指定页面。
如果 Document Viewer 触发 OnDocumentChanged 事件,且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer、TextEditor、TextValidator 属性已设置:
  • TextValidator 对象的 FRDocument 属性将被设置为新文档
  • ImageViewer、ZoomViewer 和 TextEditor 对象的 FRPage 属性以及 DocumentViewer 对象的 ActivePage 属性将被设置为新文档的第一页
如果 Document Viewer 触发 OnOptionsChanged 事件,且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer、TextEditor、TextValidator 属性已设置,则将调用 ImageViewer、ZoomViewer、TextEditor、TextValidator 对象的 UpdateOptions 方法。
已连接的 Text Editor 的事件:
如果 Text Editor 触发 OnEditorBlockChanged 事件,ComponentSynchronizer 将执行以下操作:
  1. 如果 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer 属性已设置,则针对指定块调用 ImageViewer 和 ZoomViewer 对象的 SetSelectedBlocksIndices 方法。
  2. 如果该块为 table block,则针对选定单元格调用 ImageViewer 和 ZoomViewer 对象的 SetSelectedCells 方法。
  3. 然后调用 ImageViewer 和 ZoomViewer 对象的 ShowDocumentArea 方法。
如果 Text Editor 触发 OnSymbolSelected 事件,Component Synchronizer 将执行以下操作:
if( ZoomViewer != 0 ) {
 ZoomViewer->put_SymbolRect( symbolRect );
}
if( ImageViewer != 0 ) {
 ImageViewer->ShowDocumentArea( symbolRect );
}
if( ZoomViewer != 0 ) {
 ZoomViewer->ShowDocumentArea( symbolRect );
}
如果 Text Editor 触发 OnActivePageChanged 事件,并且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer 和 DocumentViewer 属性均已设置,则相应组件的 FRPage 或 ActivePage 属性将设置为文档中指定的页面。
如果 Text Editor 触发 OnOptionsChanged 事件,并且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer、DocumentViewer 和 TextValidator 属性均已设置,则会调用 ImageViewer、ZoomViewer、DocumentViewer 和 TextValidator 对象的 UpdateOptions 方法。
已连接的 Text Validator 的事件:
如果 Text Validator 触发 OnSymbolSelected 事件,Component Synchronizer 将执行以下操作:
if( ZoomViewer != 0 ) {
 ZoomViewer->put_SymbolRect( symbolRectangle );
}
如果 Text Validator 触发 OnSelectionChanged 事件,Component Synchronizer 将执行以下操作:
int symbolPos;
IEditorPosition* nextPosition;
position->get_Symbol( &symbolPos );
nextPosition->put_Symbol( symbolPos + length );
if( textEditor != 0 ) {
 textEditor->SetSelection( position, nextPosition );
}
如果 Text Validator 触发 OnActivePageChanged 事件,并且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer、TextEditor 和 DocumentViewer 属性均已设置,则相应组件的 FRPage 或 ActivePage 属性将设置为文档中指定的页面。
如果 Text Validator 触发 OnDocumentChanged 事件,并且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer、TextEditor 和 DocumentViewer 属性均已设置:
  • DocumentViewer 对象的 FRDocument 属性将设置为新文档
  • ImageViewer、ZoomViewer 和 TextEditor 对象的 FRPage 属性,以及 DocumentViewer 对象的 ActivePage 属性,将设置为新文档的第一页
如果 Text Validator 触发 OnOptionsChanged 事件,并且 ComponentSynchronizer 对象的 ImageViewer、ZoomViewer、TextEditor 和 DocumentViewer 属性均已设置,则会调用 ImageViewer、ZoomViewer、TextEditor 和 DocumentViewer 对象的 UpdateOptions 方法。

另请参阅

ComponentSynchronizer