OLE アイテムのトラッキングを行うには、そのアイテムに関連するイベント (OLE アイテムのクリック、ドキュメントのビューの更新など) を処理する必要があります。 どの場合でも、一時オブジェクト CRectTracker を宣言し、このオブジェクトを通じてすべての操作を行います。
メニュー コマンドで OLE アイテムを選択するか、またはオブジェクトを挿入するときは、適切なスタイルでトラッカーを初期化し、OLE アイテムの状態を表示する必要があります。 次の表に、サンプル アプリケーション OCLIENT で使われているアイテムの表示スタイルを示します。 各スタイルの詳細については、CRectTracker に関するトピックを参照してください。
コンテナー中でのスタイルと OLE アイテムの状態
表示スタイル |
OLE アイテムの状態 |
---|---|
境界が点線 |
アイテムはリンクされています。 |
境界が実線 |
アイテムは埋め込まれています。 |
リサイズ ハンドル表示 |
アイテムは選択状態です。 |
境界がハッチング |
アイテムは埋め込み先編集が有効です。 |
アイテム全体がハッチング |
アイテムのサーバーが独立ウィンドウを開いています。 |
OLE アイテムの状態をチェックして、該当するスタイルを設定する手順を使うと、トラッカーを簡単に初期化できます。 次に、サンプル アプリケーション OCLIENT の関数 SetupTracker によるトラッカーの初期化例を示します。 この関数に渡されるパラメーターは、トラッカーのアドレス (pTracker)、トラッカーに対応するクライアント アイテムへのポインター (pItem)、および四角形へのポインター (pTrueRect) です。 この関数全体を調べるには、MFC の OLE サンプル プログラム OCLIENT を参照してください。
SetupTracker のコード例は 1 つの関数を表していますが、数行ずつに分けて関数の機能の説明と共に示します。
void CMainView::SetupTracker(CRectTracker* pTracker, CRectItem* pItem,
CRect* pTrueRect)
トラッカーの初期化処理では、最小のサイズを設定し、トラッカーのスタイルをクリアします。
// set minimum size for our OLE items
pTracker->m_sizeMin.cx = 8;
pTracker->m_sizeMin.cy = 8;
pTracker->m_nStyle = 0;
次に示す行では、アイテムが選択状態かどうかをチェックしています。また、アイテムがドキュメントにリンクされているのか、または埋め込まれているのかもチェックしています。 アイテムが選択されている場合は、リサイズ ハンドルを境界の内側に表示します。 アイテムがドキュメントにリンクされている場合は、境界を点線で表示します。 アイテムが埋め込まれている場合は、境界を実線で表示します。
// setup resize handles if item is selected
if (pItem == m_pSelection)
pTracker->m_nStyle |= CRectTracker::resizeInside;
// put correct border depending on item type
if (pItem->GetType() == OT_LINK)
pTracker->m_nStyle |= CRectTracker::dottedLine;
else
pTracker->m_nStyle |= CRectTracker::solidLine;
アイテムがほかのウィンドウで編集中 (オープン) のときは、次のコードでアイテム全体にハッチングを表示します。
// put hatching over the item if it is currently open
if (pItem->GetItemState() == COleClientItem::openState ||
pItem->GetItemState() == COleClientItem::activeUIState)
{
pTracker->m_nStyle |= CRectTracker::hatchInside;
}
この関数は、トラッカーの表示が必要なときに呼び出すことができます。 たとえば、ビュー クラスの関数 OnDraw からこの関数を呼び出します。 その結果、ビューが再描画されるときは、常にトラッカーの状態が更新されます。 具体的なコードは、MFC OLE サンプル OCLIENT の関数 CMainView::OnDraw を参照してください。
アプリケーションでは、トラッカー処理が必要なイベント (サイズ変更、移動、クリック検出など) が発生します。 このようなアクションは、アイテムの選択または移動が要求されていることを示します。 このような場合は、何をつかんでいたを決定する必要があります。または、サイズ変更ハンドル サイズ変更ハンドルの境界の一部。 マウスとアイテムの位置関係のチェックは、OnLButtonDown メッセージ ハンドラーで行うことができます。 CRectTracker::HitTest を呼び出します。 CRectTracker::hitOutside 以外の値が返ったときは、アイテムのサイズ変更または移動が行われようとしています。 したがって、メンバー関数 Track を呼び出す必要があります。 詳細な例については、MFC OLE サンプル OCLIENT の関数 CMainView::OnLButtonDown を参照してください。
CRectTracker クラスには、移動中、サイズ変更中、またはドラッグ中を示すカーソル形状が用意されています。 カーソル形状を決定するには、マウスの下にあるアイテムが選択されているかどうかを調べます。 アイテムが選択されている場合は CRectTracker::SetCursor を呼び出し、選択されていない場合は既定のハンドラーを呼び出します。 例として、MFC OLE サンプル OCLIENT のコードを次に示します。
BOOL CMainView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
if (pWnd == this && m_pSelection != NULL)
{
// give the tracker for the selection a chance
CRectTracker tracker;
SetupTracker(&tracker, m_pSelection);
if (tracker.SetCursor(this, nHitTest))
return TRUE;
}
return CScrollView::OnSetCursor(pWnd, nHitTest, message);
}