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
、、 CDocument
、 CWnd
および CFrameWnd
. 新しいクラスでメッセージを処理する場合は、これらの CCmdTarget
派生クラスのいずれかからクラスを派生させます。 クラス CCmdTarget
を直接派生することはめったにありません。
コマンド ターゲットとOnCmdMsg
ルーティングの概要については、コマンド ターゲット、コマンド ルーティング、およびマッピング メッセージに関するページを参照してください。
CCmdTarget
には、砂時計カーソルの表示を処理するメンバー関数が含まれています。 コマンドの実行に顕著な時間間隔が必要な場合は、砂時計カーソルを表示します。
ディスパッチ マップは、メッセージ マップと同様に、OLE オートメーション IDispatch
機能を公開するために使用されます。 このインターフェイスを公開することで、他のアプリケーション (Visual Basic など) がアプリケーションを呼び出すことができます。
継承階層
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
指します)、それ以外の場合*ppenumOleVerb
FALSE
は .
解説
このメンバー関数は、基本的に .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
。このマクロはGetTypeLib
GetTypeLibCache
、
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
)。 マクロGetTypeInfoCount
GetTypeLibCache
をIMPLEMENT_OLETYPELIB
使用します。
CCmdTarget::GetTypeLibCache
タイプ ライブラリ キャッシュを取得します。
virtual CTypeLibCache* GetTypeLibCache();
戻り値
CTypeLibCache
オブジェクトを指すポインターです。
解説
派生クラスは、このメンバー関数をオーバーライドする必要があります (オーバーライドされていない場合は、 GetTypeLibCache
返されます NULL
)。 マクロGetTypeInfoCount
GetTypeLib
をIMPLEMENT_OLETYPELIB
使用します。
CCmdTarget::IsInvokeAllowed
この関数は、MFC の実装によって呼び出され、特定の IDispatch::Invoke
オートメーション メソッド (で dispid
識別される) を呼び出すことができるかどうかを判断します。
virtual BOOL IsInvokeAllowed(DISPID dispid);
パラメーター
dispid
ディスパッチ ID。
戻り値
TRUE
メソッドを呼び出すことができる場合は 〗。それ以外の場合 FALSE
は 。
解説
戻り値が返されたTRUE
場合、Invoke
メソッドの呼び出しに進みます。それ以外の場合IsInvokeAllowed
はInvoke
失敗し、.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
の値nCode
nCode
に依存する値を指定する必要があります。 次の表に、対応する値を示します。
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
クラス
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示