更新 : 2007 年 11 月
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);
}