次の方法で共有


テクニカル ノート 40: MFC/OLE 埋め込み先サイズ変更とズーム

[!メモ]

次のテクニカル ノートは、最初にオンライン ドキュメントの一部とされてから更新されていません。結果として、一部のプロシージャおよびトピックが最新でないか、不正になります。最新の情報について、オンライン ドキュメントのキーワードで関係のあるトピックを検索することをお勧めします。

ここでは、埋め込み先編集に関連するサーバーが正しい拡大、インプレース サイズ変更がどのように達成する必要のある問題について説明します。埋め込み先編集の有効化によって、 WYSIWYG の概念はコンテナーとサーバーが互いに連携して踏まれ特に、 OLE 仕様をほぼ同様に解釈します。手順先。

コンテナーとサーバーのサポートの埋め込み先編集の有効化近い間の対話のために保持する必要があるエンド ユーザーから一部の予測があります:

  • 描画するときに、プレゼンテーションの表示 ( COleServerItem::OnDraw のオーバーライドで描画メタファイル) (編集が、表示されないとまったく同じを表示する必要があります)編集ツールに対して。

  • コンテナーが縮小すると、サーバー ウィンドウは、にも!

  • コンテナーとサーバーの両方が同じメトリックを使用して編集のオブジェクトを表示する必要があります。この 論理 ppi —ディスプレイ デバイスにするときに物理的ではない ppi の数に基づくマップ モードを使用する方法。

[!メモ]

埋め込み先編集の有効化 (リンクされていない)埋め込まれている項目にのみ適用されるため、拡大して埋め込みオブジェクトだけです。縮小に使用する COleServerItem 動作は同じ COleServerDoc API が表示されます。この二分法の原因は、リンクされたに有効な、埋め込みアイテムだけ COleServerItem (これに共通の実装があることを許可します)、関数です。埋め込みオブジェクトに対してのみ有効である関数は COleServerDoc のクラスにあります (サーバーの観点からは、埋め込まれた)は document です。

重荷のほとんどは、サーバー実装にコンテナーのズーム ファクターを認識し、必要に応じて編集インターフェイスを変更する必要があります。配置されます。ただし、サーバーがどのようにコンテナーが使用している、ズーム ファクターを決定しますか。

ズームに対する MFC のサポート

現在のズーム ファクターは COleServerDoc::GetZoomFactorを呼び出すことで確認できます。ドキュメントが埋め込み先編集の場合に呼び出すと、 100% のズーム ファクター常に発生します (または 1:1 の比)。埋め込み先編集が 100% 以外の値を返すこともありますが、それを呼び出す。

正しくズームの例については、 MFC サンプルの OLE HIERSVRを参照してください。HIERSVR のズームはテキストを表示、テキストは、通常、線上に適しません動作は複雑になり (ヒント、印刷上の表記規則、デザイン幅と高さはすべて関係が複雑になります)。ただし、 HIERSVR が正しくズームを実行するための適切な参照であるため、 MFC、チュートリアルの Scribble (手順 7)です。

COleServerDoc::GetZoomFactor はコンテナーまたは COleServerItemCOleServerDoc クラスの実装から使用できる多数の別の測度に基づいてズーム ファクターを決定します。つまり、現在のズーム ファクターは、次の数式によって決まります:

Position Rectangle (PR) / Container Extent (CE)

場所の四角形は、コンテナーによって決まります。また、埋め込み先編集の有効化中にサーバーにコンテナーがサーバーの COleServerDoc::OnSetItemRects をダイヤルすると COleClientItem::OnGetItemPosition が呼び出される戻り、更新された場合 ( COleClientItem::SetItemRectsへの呼び出しで)。

コンテナーのエクステントは計算するために多少複雑です。コンテナーが COleServerItem::OnSetExtentCOleClientItem::SetExtentへの呼び出しに呼び出す場合)、コンテナーの範囲は 1 インチあたり論理ピクセルの数に基づいてピクセルに変換されるこの値です。コンテナー (通常はそうである SetExtent 呼び出さなかった場合、コンテナーのエクステントは COleServerItem::OnGetExtentから返されるサイズです。したがって、コンテナーが SetExtent を呼び出さなかった場合、フレームワークはした場合、コンテナーは通常のエクステント ( COleServerItem::GetExtentから返される値)の 100% と関数を前提としています。コンテナーが項目の 100% (これ以上、あまり)表示と別の方法として、フレームワークを説明しました。

COleServerItem::OnSetExtentCOleServerItem::OnGetExtent に似た名前がありますが、これらは同じ項目の属性を操作しないように注意する必要があります。OnSetExtent はサーバーに (ズーム ファクター)に関係なくコンテナーで表示され、またはオブジェクトの量通知するために呼び出されますオブジェクトの適切なサイズを確認するに OnGetExtent は、コンテナーによって呼び出されます。

関連する API をそれぞれ参照して、より明確なピクチャを取得できます:

COleServerItem::OnGetExtent

この関数は、項目の HIMETRIC 単位の 「自然なサイズ」を返す必要があります。「自然なサイズについては」考える最適な方法は、印刷時のサイズが、表示される可能性があるため、これを定義することです。次に、返されるサイズは、特定の項目のコンテンツには定数です (特定の項目に設定されているメタファイルと同様に、は。このサイズが縮小すると項目に適用される変更されません。通常は、コンテナーが OnSetExtentを呼び出すことによって、項目、またはより低い領域を渡すと、変更されません。変更には、コンテナーによって送信された最後のエクステントに基づいてテキストをラップした 「」空白の機能を持たない簡易テキスト エディターのものかがあります。サーバーが変更されると、サーバーは、システム レジストリの OLEMISC_RECOMPOSEONRESIZE のビットを設定する必要があります。このオプションの詳細については、 OLE SDK のドキュメントを参照してください)。

COleServerItem::OnSetExtent

この関数は、コンテナーがオブジェクトの 「多かれ少なかれ」示すときに呼び出されます。ほとんどのコンテナーでは、まったくをダイヤルしません。既定の実装は、 " 上記のコンテナーのエクステント値を計算するときに COleServerDoc::GetZoomFactor で使用される m_sizeExtent でコンテナーから受け取った最後の値を格納します。

COleServerDoc::OnSetItemRects

この関数は、ドキュメントが埋め込み先編集の場合にのみ呼び出されます。これは、コンテナーが項目に適用される項目の位置やクリッピングを更新するときに呼び出されます。上で説明したように、その場所の四角形は、ズーム ファクターの計算に、分子を提供します。サーバーは項目の位置が COleServerDoc::RequestPositionChangeを呼び出すことによって変更されるように要求できます。コンテナーは、この要求に OnSetItemRects を呼び出して、応答しない可能性がある場合とない場合があります ( COleServerItem::SetItemRectsへの呼び出しで)。

COleServerDoc::OnDraw

COleServerItem::OnDraw のオーバーライドによって作成されたメタファイルが同じメタファイルを一つ生成することを、現在のズーム ファクターに関係なくことを理解することが重要です。コンテナーは必要に応じてメタファイルをスケーリングします。これは、ビューの OnDraw とサーバー項目の OnDraw間の相違点です。ビューには、ズームを処理して、項目は、コンテナーまで、 zoomable 適切なを拡大するにメタファイルおよびリーフを作成します。

サーバーが正しく動作することを保証する最良の方法は、ドキュメントが埋め込み先編集の場合 COleServerDoc::GetZoomFactor の実装を使用することです。

埋め込み先のサイズ変更に対する MFC のサポート

MFC は、 OLE 2 仕様に説明されているように、十分に埋め込みのサイズ変更インターフェイスを実装します。ユーザーインターフェイスは COleResizeBar のクラス、カスタムのメッセージ WM_SIZECHILD、および COleIPFrameWndのこのメッセージの特別な処理によってサポートされます。

提供される内容がフレームワークによって、このメッセージの別の処理を実行する必要があります。前に述べたように、フレームワークはコンテナーまで埋め込みにサイズを変更した結果を保持します。サーバーはズーム ファクターの変更に応答します。コンテナーが COleClientItem::OnChangeItemPosition の処理中にコンテナーの両方の範囲と位置の四角形 ( COleServerDoc::RequestPositionChangeに呼び出しの結果として呼び出される)に設定することによって、対応する埋め込みのサイズ変更は状態 (編集ウィンドウの項目の 「多かれ少なかれ」発生します。コンテナーは、 COleClientItem::OnChangeItemPositionの処理中に位置する四角形を設定することによって反応すると、ズーム ファクターが変更され、項目が表示されます 「または」拡大します。

サーバーはこの処理をネゴシエート中に制御できます (次数に)。スプレッドシートは、たとえば、埋め込み先アイテムの編集時にユーザーがウィンドウのサイズを変更すると、以下のことを示す選択する場合があります。ワードプロセッサは 「ページ」空白を変更することもあります。そのため、新しい空白にウィンドウと rewrap と同じテキストです。サーバーは通常のエクステント ( COleServerItem::OnGetExtentから返されるサイズ)の変更によってサイズが変更されたときに実行します。これにより、場所の四角形とコンテナーのエクステント大きくしたり小さく表示の領域は両方の量、同じズーム ファクターによって変更します。また、ドキュメントの複数かれ少なかれ OnDrawによって生成されたメタファイルに表示されます。この場合、ユーザーが項目のサイズを変更すると、ドキュメント自体は、表示の領域の代わりに変更します。

まだカスタムのサイズ変更を実行し、 COleIPFrameWnd のクラスの WM_SIZECHILD のメッセージをオーバーライドして COleResizeBar によって提供されるユーザー インターフェイスを利用できます。WM_SIZECHILDの設計の詳細については、 テクニカル ノート 24を参照してください。

参照

その他の技術情報

番号順テクニカル ノート

カテゴリ別テクニカル ノート