コードでのトラッカーの実装方法
OLE 項目を追跡するには、項目のクリックやドキュメントのビューの更新など、項目に関連する特定のイベントを処理する必要があります。 いずれの場合も、一時的な CRectTracker オブジェクトを宣言し、このオブジェクトを使用して項目を操作するだけで十分です。
ユーザーが項目を選択するか、メニュー コマンドを使用してオブジェクトを挿入する場合は、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);
}