次の方法で共有


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

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 アプリケーションでのトラッカーの実装