次の方法で共有


コードでのトラッカの実装方法

更新 : 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);
}

参照

概念

トラッカ : OLE アプリケーションでのトラッカの実装