TN040: MFC および OLE のサイズ変更とズーム場所

このメモは、インプレース編集に関連する問題とどのように、サーバーする必要があります正しいズームを達成と埋め込み先サイズ変更について説明します。インプレース アクティベーション、WYSIWYG の概念を 1 つのステップをさらにそのコンテナーの撮影とサーバーが互いに協力、特に OLE 仕様のと同じ方法を解釈。

インプレース アクティブ化をサポートするサーバー、コンテナーの密接な連携のためのある数を維持する必要があります、エンド ・ ユーザーからの期待:

特価;インプレース アクティブ化のみ (しない) リンクが埋め込まれているアイテムに適用されるため、ズームは埋め込みオブジェクトに適用されます。拡大縮小に使用する Api COleServerDoc COleServerItemの両方に表示されます。この二分法のためのリンクと埋め込みの両方の項目の有効な関数のみCOleServerItemのです (これは共通の実装を持つことにより) とオブジェクトの埋め込みにのみ有効な機能COleServerDocクラス内にある (サーバーの観点からは、埋め込まれているドキュメントです)(&N)。

負担のほとんど配置サーバー実装では、サーバーする必要があります、コンテナーの倍率の注意し、その適切な編集インターフェイスを変更します。しかし、どのようにサーバー コンテナーを使用して、ズームの倍率を決定して?

MFC サポートの拡大

現在のズームの倍率は、 COleServerDoc::GetZoomFactorを呼び出すことによって決定できます。ドキュメントがアクティブでない場合、この関数を呼び出すは 100 % ズーム係数 (または 1:1 の比率) が常に発生します。インプレース アクティブが 100% 以外の値を返すことがありますが、それを呼び出す。

正しくズームの例については、MFC OLE サンプルを参照してください HIERSVR。HIERSVR でズーム、実際のテキストが表示されることは複雑な ? とテキスト、一般的には、規模は直線的に (ヒント、表記規則、デザインの幅と高さのすべての問題を複雑にする)。まだ、HIERSVR で正しくズームを実装するための合理的な参照ありので MFC チュートリアル 落書き(ステップ 7)。

COleServerDoc::GetZoomFactor別のメトリック使用可能なコンテナーからまたはCOleServerItemCOleServerDocクラスの実装のいずれかの数に基づいて、ズームの倍率を決定します。一言で言えば、現在のズームの倍率、次の数式によって決定されます。

(PR) の四角形の位置・ コンテナー程度 (CE)

位置の四角形は、コンテナーによって決定されます。COleClientItem::OnGetItemPositionのと呼ばれ、コンテナー、サーバーのCOleServerDoc::OnSetItemRects ( COleClientItem::SetItemRectsへの呼び出し) を呼び出すときに更新されますそれをサーバーにインプレース アクティブ化時に返される。

コンテナーの範囲を計算するはやや複雑です。コンテナー COleServerItem::OnSetExtent (呼び出しのCOleClientItem::SetExtent)、[コンテナー程度呼んだ場合この値は論理インチあたりのピクセル数に基づくピクセルに変換されます。(これは通常の場合は) SetExtent、コンテナーと呼ばれるがない場合は、コンテナーの範囲はCOleServerItem::OnGetExtentから返されるサイズです。したがって、フレームワーク、コンテナーが SetExtent と呼ばれるない場合は、やった場合、コンテナー、100 % 自然の範囲 ( COleServerItem::GetExtentから返される値) の求めているとこと想定しています。または別の方法を記載フレームワーク 100 % (ないよりは少ない) 項目のコンテナーが表示されている前提としています。

COleServerItem::OnSetExtentCOleServerItem::OnGetExtentのような名前が、彼らは同じ属性項目の操作を行わないことに注意してくださいすることが重要です。OnSetExtentどのように多くのオブジェクトの表示、コンテナー (に関係なく、ズームの倍率) でいるようにと呼ばれ、 OnGetExtentオブジェクトの最適なサイズを決定するには、コンテナーによって呼び出されます。

ここに関与し、Api の各で見て、鮮明な画像を得ることができます。:

COleServerItem::OnGetExtent

この関数は「自然のサイズ」HIMETRIC 単位アイテムを返す必要があります。「自然な大きさ」とする最良の方法は、印刷される可能性がありますサイズとして定義するです。サイズは、ここでは定数は特定の項目内容 (多くは特定の項目に対して一定で、メタファイルのような) を返されます。アイテムにズームを適用すると、このサイズは変更されません。コンテナー アイテムより多くまたはより少ないスペースをOnSetExtentを呼び出すことによって与える通常は変更されません。変更の例は、単純なテキスト エディター、コンテナーによって範囲に基づいてテキストをラップなし「マージン」機能を持つのでしょう。サーバーが変更される場合、サーバーでは、おそらく、システム レジストリでビット OLEMISC_RECOMPOSEONRESIZE 設定する必要があります (詳細について OLE SDK マニュアルはこのオプションを参照してください)。

COleServerItem::OnSetExtent

「もっとまたはより少なく」オブジェクト コンテナーを表示するときに呼び出されます。ほとんどのコンテナーこれは呼び出しません。既定の実装で 'm_sizeExtent' COleServerDoc::GetZoomFactorで上記コンテナーの範囲の値を計算するときに使用される、コンテナーから受信した最後の値を格納します。

COleServerDoc::OnSetItemRects

ドキュメントがアクティブの場合にのみこの関数が呼び出されます。アイテムの位置または項目に適用、クリップのいずれかのコンテナーを更新するときに呼び出されます。位置四角形で、前述のよう、分子、ズーム係数の計算を提供します。サーバーでは、 COleServerDoc::RequestPositionChangeを呼び出すことによって項目の位置を変更ことを要求できます。コンテナーまたはOnSetItemRectsCOleServerItem::SetItemRectsへの呼び出し) を呼び出すことによってこの要求に応答しません。

COleServerDoc::OnDraw

現在のズーム倍率に関係なく、同じメタファイル正確を:ondrawのオーバーライドすることによって作成されたメタファイルに生成を実現することが重要です。コンテナーは適切なメタファイルをスケーリングします。これは、ビューのOnDrawとサーバー アイテムのOnDrawの重要な違いです。アイテムはズーム、ビュー ハンドルを作成、ズーム可能なメタファイルとズームを行うには、コンテナーに葉。

ドキュメントがアクティブの場合、 COleServerDoc::GetZoomFactorの実装を使用するサーバーが正しく動作することを保証する最善の方法であります。

MFC がサポートする場所のサイズを変更します。

MFC には、OLE 2 規格に記述されている場所でサイズ変更インターフェイス完全を実装します。ユーザー インターフェイス、れている COleResizeBarクラス、カスタム メッセージWM_SIZECHILD、このメッセージで生成した COleIPFrameWndの特別な処理によってサポートされて。

も、フレームワークによってこのメッセージの別の処理を実装することがあります。上記で説明したように、フレームワークはコンテナーに場所のサイズを変更するが葉 ?、ズームの倍率を変更するサーバーを応答します。場合は、両方のコンテナーの範囲を設定することによって、コンテナーの反応 ( COleServerDoc::RequestPositionChangeへの呼び出しの結果として) と呼ばれるそのCOleClientItem::OnChangeItemPosition場所での処理の位置四角形のサイズを変更」より「アイテムの編集ウィンドウでの表示になります。コンテナーの位置四角形COleClientItem::OnChangeItemPositionの処理中に設定するだけで反応する場合は、ズームの倍率を変更して」でまたはをズーム」の項目が表示されます。

サーバーは、このネゴシエーション中に動作 (ある程度) を制御できます。スプレッドシートなどの可能性があります選択ユーザー、アイテムの編集中、ウィンドウ サイズを変更するときに場所でより多くまたはより少ないセルを表示します。ワード プロセッサ、テキストを新しいマージンに大きさは、ウィンドウと同じですので、「ページ マージン」を変更するとして可能性があります。サーバーはこれに自然の範囲 ( COleServerItem::OnGetExtentから返されるサイズ) を変更することによって実装が、サイズの変更は。これは位置の四角形と、コンテナーの範囲の両方結果同じ倍率が大きくまたは小さく表示領域を同じ量だけを変更するが発生します。さらに、もっとまたはより少なくのドキュメントは、 OnDrawで生成されたメタファイルで表示されます。ユーザーは、表示領域の代わりに、項目のサイズを変更するときは、ドキュメント自体変化しています。

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

番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)

Index