CCmdTarget クラス

Microsoft Foundation クラス ライブラリのメッセージ マップ アーキテクチャの基本クラス。

構文

class CCmdTarget : public CObject

メンバー

パブリック コンストラクター

名前 説明
CCmdTarget::CCmdTarget CCmdTarget オブジェクトを構築します。

パブリック メソッド

名前 説明
CCmdTarget::BeginWaitCursor カーソルを砂時計カーソルとして表示します。
CCmdTarget::DoOleVerb OLE 動詞で指定されたアクションを実行します。
CCmdTarget::EnableAutomation オブジェクトの OLE オートメーションを CCmdTarget 許可します。
CCmdTarget::EnableConnections 接続ポイントを介したイベントの発生を有効にします。
CCmdTarget::EnableTypeLib オブジェクトのタイプ ライブラリを有効にします。
CCmdTarget::EndWaitCursor 前のカーソルに戻ります。
CCmdTarget::EnumOleVerbs オブジェクトの OLE 動詞を列挙します。
CCmdTarget::FromIDispatch ポインターに関連付けられているオブジェクトへの CCmdTarget ポインターを IDispatch 返します。
CCmdTarget::GetDispatchIID プライマリ ディスパッチ インターフェイス ID を取得します。
CCmdTarget::GetIDispatch オブジェクトに関連付けられているオブジェクトへの IDispatch ポインターを CCmdTarget 返します。
CCmdTarget::GetTypeInfoCount オブジェクトが提供する型情報インターフェイスの数を取得します。
CCmdTarget::GetTypeInfoOfGuid 指定した GUID に対応する型の説明を取得します。
CCmdTarget::GetTypeLib タイプ ライブラリへのポインターを取得します。
CCmdTarget::GetTypeLibCache タイプ ライブラリ キャッシュを取得します。
CCmdTarget::IsInvokeAllowed オートメーション メソッドの呼び出しを有効にします。
CCmdTarget::IsResultExpected オートメーション関数が値を返す必要がある場合は、0 以外の値を返します。
CCmdTarget::OnCmdMsg コマンド メッセージをルーティングしてディスパッチします。
CCmdTarget::OnFinalRelease 最後の OLE 参照が解放された後でクリーンアップします。
CCmdTarget::RestoreWaitCursor 砂時計カーソルを復元します。

解説

メッセージ マップは、コマンドまたはメッセージを処理するために書き込むメンバー関数にルーティングします。 (コマンドは、メニュー項目、コマンド ボタン、またはアクセラレータ キーからのメッセージです)。

から CCmdTarget 派生した主要なフレームワーク クラスには CView、include 、 CWinApp、、 CDocumentCWndおよび CFrameWnd. 新しいクラスでメッセージを処理する場合は、これらの CCmdTarget派生クラスのいずれかからクラスを派生させます。 クラス CCmdTarget を直接派生することはめったにありません。

コマンド ターゲットとOnCmdMsgルーティングの概要については、コマンド ターゲット、コマンド ルーティングおよびマッピング メッセージに関するページを参照してください

CCmdTarget には、砂時計カーソルの表示を処理するメンバー関数が含まれています。 コマンドの実行に顕著な時間間隔が必要な場合は、砂時計カーソルを表示します。

ディスパッチ マップは、メッセージ マップと同様に、OLE オートメーション IDispatch 機能を公開するために使用されます。 このインターフェイスを公開することで、他のアプリケーション (Visual Basic など) がアプリケーションを呼び出すことができます。

継承階層

CObject

CCmdTarget

必要条件

ヘッダー:afxwin.h

CCmdTarget::BeginWaitCursor

コマンドの実行に顕著な時間間隔が必要な場合に、カーソルを砂時計として表示するには、この関数を呼び出します。

void BeginWaitCursor();

解説

フレームワークは、この関数を呼び出して、オブジェクトの読み込み時やファイルへの保存時 CDocument など、ビジーであることをユーザーに示します。

アクションは、処理などのOnSetCursor他のBeginWaitCursorアクションがカーソルを変更する可能性があり、1 つのメッセージ ハンドラーの外部で常に有効であるとは限りません。

前のカーソルを復元する呼び出し EndWaitCursor

// The following example illustrates the most common case
// of displaying the hourglass cursor during some lengthy
// processing of a command handler implemented in some
// CCmdTarget-derived class, such as a document or view.
void CMyView::OnBeginSleepEnd()
{
   BeginWaitCursor(); // display the hourglass cursor
   // do some lengthy processing
   Sleep(3000);
   EndWaitCursor(); // remove the hourglass cursor
}

// The next example illustrates RestoreWaitCursor.
void CMyView::OnBeginDlgRestore()
{
   BeginWaitCursor(); // display the hourglass cursor
   // do some lengthy processing
   // The dialog box will normally change the cursor to
   // the standard arrow cursor, and leave the cursor in
   // as the standard arrow cursor when the dialog box is
   // closed.
   CFileDialog dlg(TRUE);
   dlg.DoModal();

   // It is necessary to call RestoreWaitCursor here in order
   // to change the cursor back to the hourglass cursor.
   RestoreWaitCursor();
   // do some more lengthy processing
   Sleep(3000);
   EndWaitCursor(); // remove the hourglass cursor
}

// In the above example, the dialog was clearly invoked between
// the pair of calls to BeginWaitCursor and EndWaitCursor.
// Sometimes it may not be clear whether the dialog is invoked
// in between a pair of calls to BeginWaitCursor and EndWaitCursor.
// It is permissible to call RestoreWaitCursor, even if
// BeginWaitCursor was not previously called.  This case is
// illustrated below, where CMyView::AnotherFunction does not
// need to know whether it was called in the context of an
// hourglass cursor.
void CMyView::OnDlgRestore()
{
   // some processing ...
   CFileDialog dlg(TRUE);
   dlg.DoModal();
   RestoreWaitCursor();

   // some more processing ...
}

// If the dialog is invoked from a member function of
// some non-CCmdTarget, then you can call CWinApp::DoWaitCursor
// with a 0 parameter value to restore the hourglass cursor.
void CMyObject::OnDlgDoWait()
{
   CFileDialog dlg(TRUE);
   dlg.DoModal();
   AfxGetApp()->DoWaitCursor(0); // same as CCmdTarget::RestoreWaitCursor
}

CCmdTarget::CCmdTarget

CCmdTarget オブジェクトを構築します。

CCmdTarget();

CCmdTarget::DoOleVerb

OLE 動詞で指定されたアクションを実行します。

BOOL DoOleVerb(
    LONG iVerb,
    LPMSG lpMsg,
    HWND hWndParent,
    LPCRECT lpRect);

パラメーター

iVerb
動詞の数値識別子。

lpMsg
動詞を MSG 呼び出したイベント (ダブルクリックなど) を記述する構造体へのポインター。

hWndParent
オブジェクトを保持しているドキュメント ウィンドウのハンドル。

lpRect
オブジェクトの RECT 外接する四角形 hWndParentを定義する座標 (ピクセル単位) を含む構造体へのポインター。

戻り値

成功した場合は TRUE、それ以外の場合は FALSE

解説

このメンバー関数は、基本的に .IOleObject::DoVerb 考えられるアクションは次によって CCmdTarget::EnumOleVerbs列挙されます。

CCmdTarget::EnableAutomation

オブジェクトの OLE オートメーションを有効にするには、この関数を呼び出します。

void EnableAutomation();

解説

この関数は通常、オブジェクトのコンストラクターから呼び出され、クラスに対してディスパッチ マップが宣言されている場合にのみ呼び出す必要があります。 自動化の詳細については、Automation クライアントと Automation サーバーに関する記事を参照してください

CCmdTarget::EnableConnections

接続ポイントを介したイベントの発生を有効にします。

void EnableConnections();

解説

接続ポイントを有効にするには、派生クラスのコンストラクターでこのメンバー関数を呼び出します。

CCmdTarget::EnableTypeLib

オブジェクトのタイプ ライブラリを有効にします。

void EnableTypeLib();

解説

型情報を提供する場合は、-derived オブジェクトの CCmdTargetコンストラクターでこのメンバー関数を呼び出します。

CCmdTarget::EndWaitCursor

メンバー関数を呼び出して砂時計カーソルから前の BeginWaitCursor カーソルに戻ったら、この関数を呼び出します。

void EndWaitCursor();

解説

フレームワークは、砂時計カーソルを呼び出した後も、このメンバー関数を呼び出します。

// The following example illustrates the most common case
// of displaying the hourglass cursor during some lengthy
// processing of a command handler implemented in some
// CCmdTarget-derived class, such as a document or view.
void CMyView::OnBeginSleepEnd()
{
   BeginWaitCursor(); // display the hourglass cursor
   // do some lengthy processing
   Sleep(3000);
   EndWaitCursor(); // remove the hourglass cursor
}

// The next example illustrates RestoreWaitCursor.
void CMyView::OnBeginDlgRestore()
{
   BeginWaitCursor(); // display the hourglass cursor
   // do some lengthy processing
   // The dialog box will normally change the cursor to
   // the standard arrow cursor, and leave the cursor in
   // as the standard arrow cursor when the dialog box is
   // closed.
   CFileDialog dlg(TRUE);
   dlg.DoModal();

   // It is necessary to call RestoreWaitCursor here in order
   // to change the cursor back to the hourglass cursor.
   RestoreWaitCursor();
   // do some more lengthy processing
   Sleep(3000);
   EndWaitCursor(); // remove the hourglass cursor
}

// In the above example, the dialog was clearly invoked between
// the pair of calls to BeginWaitCursor and EndWaitCursor.
// Sometimes it may not be clear whether the dialog is invoked
// in between a pair of calls to BeginWaitCursor and EndWaitCursor.
// It is permissible to call RestoreWaitCursor, even if
// BeginWaitCursor was not previously called.  This case is
// illustrated below, where CMyView::AnotherFunction does not
// need to know whether it was called in the context of an
// hourglass cursor.
void CMyView::OnDlgRestore()
{
   // some processing ...
   CFileDialog dlg(TRUE);
   dlg.DoModal();
   RestoreWaitCursor();

   // some more processing ...
}

// If the dialog is invoked from a member function of
// some non-CCmdTarget, then you can call CWinApp::DoWaitCursor
// with a 0 parameter value to restore the hourglass cursor.
void CMyObject::OnDlgDoWait()
{
   CFileDialog dlg(TRUE);
   dlg.DoModal();
   AfxGetApp()->DoWaitCursor(0); // same as CCmdTarget::RestoreWaitCursor
}

CCmdTarget::EnumOleVerbs

オブジェクトの OLE 動詞を列挙します。

BOOL EnumOleVerbs(LPENUMOLEVERB* ppenumOleVerb);

パラメーター

ppenumOleVerb
インターフェイスへのポインターへの IEnumOLEVERB ポインター。

戻り値

TRUEオブジェクトが少なくとも 1 つの OLE 動詞をサポートしている場合 (この場合は列挙子インターフェイスをIEnumOLEVERB指します)、それ以外の場合*ppenumOleVerbFALSEは .

解説

このメンバー関数は、基本的に .IOleObject::EnumVerbs

CCmdTarget::FromIDispatch

クラスの IDispatch オートメーション メンバー関数から受け取ったポインターを、オブジェクトのインターフェイスを CCmdTarget 実装するオブジェクトにマップするには、この関数を IDispatch 呼び出します。

static CCmdTarget* PASCAL FromIDispatch(LPDISPATCH lpDispatch);

パラメーター

lpDispatch
IDispatch オブジェクトへのポインター。

戻り値

に関連付けられているlpDispatchオブジェクトへのCCmdTargetポインター。 この関数は、 NULL オブジェクトが IDispatch Microsoft Foundation Class IDispatch オブジェクトとして認識されない場合に返します。

解説

この関数の結果は、メンバー関数 GetIDispatchの呼び出しの逆です。

CCmdTarget::GetDispatchIID

プライマリ ディスパッチ インターフェイス ID を取得します。

virtual BOOL GetDispatchIID(IID* pIID);

パラメーター

pIID
インターフェイス ID ( GUID) へのポインター。

戻り値

成功した場合は TRUE、それ以外の場合は FALSE。 成功した場合は、 *pIID プライマリ ディスパッチ インターフェイス ID に設定されます。

解説

派生クラスは、このメンバー関数をオーバーライドする必要があります (オーバーライドされていない場合は、 GetDispatchIID 返されます FALSE)。 以下を参照してください。COleControl

CCmdTarget::GetIDispatch

ポインターを返すか、参照によってポインターを IDispatch 受け取るオートメーション メソッドからポインターを IDispatch 取得するには、このメンバー関数を IDispatch 呼び出します。

LPDISPATCH GetIDispatch(BOOL bAddRef);

パラメーター

bAddRef
オブジェクトの参照カウントをインクリメントするかどうかを指定します。

戻り値

IDispatchオブジェクトに関連付けられているポインター。

解説

コンストラクターで呼び出し EnableAutomation 、オートメーションを有効にするオブジェクトの場合、この関数は、インターフェイス経由で通信するクライアントによって使用される Foundation Class 実装 IDispatch へのポインターを IDispatch 返します。 この関数を呼び出すと、ポインターへの参照が自動的に追加されるため、呼び出し IUnknown::AddRefを行う必要はありません。

CCmdTarget::GetTypeInfoCount

オブジェクトが提供する型情報インターフェイスの数を取得します。

virtual UINT GetTypeInfoCount();

戻り値

型情報インターフェイスの数。

解説

このメンバー関数は基本的に実装します IDispatch::GetTypeInfoCount

派生クラスは、指定された型情報インターフェイスの数 (0 または 1) を返すために、この関数をオーバーライドする必要があります。 オーバーライドされない場合は、 GetTypeInfoCount 0 を返します。 オーバーライドするには、マクロを使用しますIMPLEMENT_OLETYPELIB。このマクロはGetTypeLibGetTypeLibCache

CCmdTarget::GetTypeInfoOfGuid

指定した GUID に対応する型の説明を取得します。

HRESULT GetTypeInfoOfGuid(
    LCID lcid,
    const GUID& guid,
    LPTYPEINFO* ppTypeInfo);

パラメーター

lcid
ロケール識別子 ( LCID)。

guid
型の説明の GUID

ppTypeInfo
インターフェイスへのポインターへの ITypeInfo ポインター。

戻り値

HRESULT呼び出しの成功または失敗を示す値。 成功した場合は、 *ppTypeInfo 型情報インターフェイスをポイントします。

CCmdTarget::GetTypeLib

タイプ ライブラリへのポインターを取得します。

virtual HRESULT GetTypeLib(
    LCID lcid,
    LPTYPELIB* ppTypeLib);

パラメーター

lcid
ロケール識別子 (LCID)。

ppTypeLib
インターフェイスへのポインターへの ITypeLib ポインター。

戻り値

HRESULT呼び出しの成功または失敗を示す値。 成功した場合は、 *ppTypeLib タイプ ライブラリ インターフェイスをポイントします。

解説

派生クラスは、このメンバー関数をオーバーライドする必要があります (オーバーライドされていない場合は、 GetTypeLib 返されます TYPE_E_CANTLOADLIBRARY)。 マクロGetTypeInfoCountGetTypeLibCacheIMPLEMENT_OLETYPELIB使用します。

CCmdTarget::GetTypeLibCache

タイプ ライブラリ キャッシュを取得します。

virtual CTypeLibCache* GetTypeLibCache();

戻り値

CTypeLibCache オブジェクトを指すポインターです。

解説

派生クラスは、このメンバー関数をオーバーライドする必要があります (オーバーライドされていない場合は、 GetTypeLibCache 返されます NULL)。 マクロGetTypeInfoCountGetTypeLibIMPLEMENT_OLETYPELIB使用します。

CCmdTarget::IsInvokeAllowed

この関数は、MFC の実装によって呼び出され、特定の IDispatch::Invoke オートメーション メソッド (で dispid識別される) を呼び出すことができるかどうかを判断します。

virtual BOOL IsInvokeAllowed(DISPID dispid);

パラメーター

dispid
ディスパッチ ID。

戻り値

TRUE メソッドを呼び出すことができる場合は 〗。それ以外の場合 FALSEは 。

解説

戻り値が返されたTRUE場合、Invokeメソッドの呼び出しに進みます。それ以外の場合IsInvokeAllowedInvoke失敗し、.E_UNEXPECTED

派生クラスは、この関数をオーバーライドして適切な値を返すことができます (オーバーライドされていない場合は返 IsInvokeAllowed されます TRUE)。 特 COleControl::IsInvokeAllowedに参照してください。

CCmdTarget::IsResultExpected

クライアントがオートメーション関数の呼び出しから戻り値を受け取るかどうかを確認するために使用 IsResultExpected します。

BOOL IsResultExpected();

戻り値

オートメーション関数が値を返す必要がある場合は 0 以外。それ以外の場合は 0。

解説

OLE インターフェイスは、クライアントが関数呼び出しの結果を使用しているか無視しているかに関する情報を MFC に提供し、MFC はこの情報を使用して呼び出しの結果を決定します IsResultExpected。 戻り値の生成が時間またはリソースを大量に消費する場合は、戻り値を計算する前にこの関数を呼び出すことで効率を高めることができます。

この関数は 1 回だけ 0 を返し、クライアントが呼び出したオートメーション関数から呼び出すと、他のオートメーション関数から有効な戻り値を取得します。

IsResultExpected は、オートメーション関数の呼び出しが進行中でないときに呼び出された場合、0 以外の値を返します。

CCmdTarget::OnCmdMsg

コマンド メッセージをルーティングおよびディスパッチし、コマンド ユーザー インターフェイス オブジェクトの更新を処理するために、フレームワークによって呼び出されます。

virtual BOOL OnCmdMsg(
    UINT nID,
    int nCode,
    void* pExtra,
    AFX_CMDHANDLERINFO* pHandlerInfo);

パラメーター

nID
コマンド ID を格納します。

nCode
コマンド通知コードを識別します。 の値nCodeの詳細については、「解説」を参照してください

pExtra
の値 nCodeに従って使用されます。 の詳細については 、「解説 」を参照してください pExtra

pHandlerInfo
そうでないNULL場合は、OnCmdMsgコマンドをディスパッチするのではなく、pTarget構造体のpHandlerInfoメンバーとpmfメンバーを入力します。 通常、このパラメーターは NULL.

戻り値

メッセージが処理される場合は 0 以外。それ以外の場合は 0。

解説

これは、フレームワーク コマンド アーキテクチャのメイン実装ルーチンです。

実行時に、他のオブジェクトにコマンドをディスパッチするか、 OnCmdMsg ルート クラスを呼び出してコマンド自体を処理します。ルート クラス CCmdTarget::OnCmdMsgは、実際のメッセージ マップ検索を実行します。 既定のコマンド ルーティングの詳細については、「メッセージ処理とマッピングに関するトピック」を参照してください

まれに、フレームワークの標準コマンド ルーティングを拡張するために、このメンバー関数をオーバーライドすることが必要になる場合があります。 コマンド ルーティング アーキテクチャの 詳細については、テクニカル ノート 21 を参照してください。

オーバーライドOnCmdMsgする場合は、適切な値 、コマンド通知コード、およびpExtraの値nCodenCodeに依存する値を指定する必要があります。 次の表に、対応する値を示します。

nCode pExtra
CN_COMMAND CCmdUI*
CN_EVENT AFX_EVENT*
CN_UPDATE_COMMAND_UI CCmdUI*
CN_OLECOMMAND COleCmdUI*
CN_OLE_UNREGISTER NULL

// This example illustrates extending the framework's standard command
// route from the view to objects managed by the view.  This example
// is from an object-oriented drawing application, similar to the
// DRAWCLI sample application, which draws and edits "shapes".
BOOL CMyView::OnCmdMsg(UINT nID,
                       int nCode,
                       void *pExtra,
                       AFX_CMDHANDLERINFO *pHandlerInfo)
{
   // Extend the framework's command route from the view to
   // the application-specific CMyShape that is currently selected
   // in the view. m_pActiveShape is NULL if no shape object
   // is currently selected in the view.
   if ((m_pActiveShape != NULL) &&
       m_pActiveShape->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
      return TRUE;

   // If the object(s) in the extended command route don't handle
   // the command, then let the base class OnCmdMsg handle it.
   return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}

 

// The command handler for ID_SHAPE_COLOR (menu command to change
// the color of the currently selected shape) was added to the message
// map of CMyShape (note, not CMyView) using the Properties window.
// The menu item will be automatically enabled or disabled, depending
// on whether a CMyShape is currently selected in the view, that is,
// depending on whether CMyView::m_pActiveView is NULL.  It is not
// necessary to implement an ON_UPDATE_COMMAND_UI handler to enable
// or disable the menu item.
BEGIN_MESSAGE_MAP(CMyShape, CCmdTarget)
ON_COMMAND(ID_SHAPE_COLOR, &CMyShape::OnShapeColor)
END_MESSAGE_MAP()

CCmdTarget::OnFinalRelease

オブジェクトへの、またはオブジェクトからの最後の OLE 参照が解放されたときに、フレームワークによって呼び出されます。

virtual void OnFinalRelease();

解説

この状況に対して特別な処理を提供するには、この関数をオーバーライドします。 既定の実装では、オブジェクトが削除されます。

CCmdTarget::RestoreWaitCursor

この関数を呼び出して、システム カーソルが変更された後 (たとえば、長い操作の途中でメッセージ ボックスを開いて閉じた後など) に、適切な砂時計カーソルを復元します。

void RestoreWaitCursor();

// The following example illustrates the most common case
// of displaying the hourglass cursor during some lengthy
// processing of a command handler implemented in some
// CCmdTarget-derived class, such as a document or view.
void CMyView::OnBeginSleepEnd()
{
   BeginWaitCursor(); // display the hourglass cursor
   // do some lengthy processing
   Sleep(3000);
   EndWaitCursor(); // remove the hourglass cursor
}

// The next example illustrates RestoreWaitCursor.
void CMyView::OnBeginDlgRestore()
{
   BeginWaitCursor(); // display the hourglass cursor
   // do some lengthy processing
   // The dialog box will normally change the cursor to
   // the standard arrow cursor, and leave the cursor in
   // as the standard arrow cursor when the dialog box is
   // closed.
   CFileDialog dlg(TRUE);
   dlg.DoModal();

   // It is necessary to call RestoreWaitCursor here in order
   // to change the cursor back to the hourglass cursor.
   RestoreWaitCursor();
   // do some more lengthy processing
   Sleep(3000);
   EndWaitCursor(); // remove the hourglass cursor
}

// In the above example, the dialog was clearly invoked between
// the pair of calls to BeginWaitCursor and EndWaitCursor.
// Sometimes it may not be clear whether the dialog is invoked
// in between a pair of calls to BeginWaitCursor and EndWaitCursor.
// It is permissible to call RestoreWaitCursor, even if
// BeginWaitCursor was not previously called.  This case is
// illustrated below, where CMyView::AnotherFunction does not
// need to know whether it was called in the context of an
// hourglass cursor.
void CMyView::OnDlgRestore()
{
   // some processing ...
   CFileDialog dlg(TRUE);
   dlg.DoModal();
   RestoreWaitCursor();

   // some more processing ...
}

// If the dialog is invoked from a member function of
// some non-CCmdTarget, then you can call CWinApp::DoWaitCursor
// with a 0 parameter value to restore the hourglass cursor.
void CMyObject::OnDlgDoWait()
{
   CFileDialog dlg(TRUE);
   dlg.DoModal();
   AfxGetApp()->DoWaitCursor(0); // same as CCmdTarget::RestoreWaitCursor
}

関連項目

MFC サンプル ACDUAL
CObject クラス
階層図
CCmdUI クラス
CDocument クラス
CDocTemplate クラス
CWinApp クラス
CWnd クラス
CView クラス
CFrameWnd クラス
COleDispatchDriver クラス