Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Základní třída pro architekturu mapy zpráv knihovny tříd Microsoft Foundation.
Syntaxe
class CCmdTarget : public CObject
Členové
Veřejné konstruktory
| Název | Popis |
|---|---|
CCmdTarget::CCmdTarget |
CCmdTarget Vytvoří objekt. |
Veřejné metody
| Název | Popis |
|---|---|
CCmdTarget::BeginWaitCursor |
Zobrazí kurzor jako kurzor přesýpací hodiny. |
CCmdTarget::DoOleVerb |
Způsobí provedení akce určené příkazem OLE. |
CCmdTarget::EnableAutomation |
Umožňuje automatizaci OLE pro CCmdTarget objekt. |
CCmdTarget::EnableConnections |
Povolí aktivaci událostí přes spojovací body. |
CCmdTarget::EnableTypeLib |
Povolí knihovnu typů objektu. |
CCmdTarget::EndWaitCursor |
Vrátí se k předchozímu kurzoru. |
CCmdTarget::EnumOleVerbs |
Vytvoří výčet příkazů OLE objektu. |
CCmdTarget::FromIDispatch |
Vrátí ukazatel na CCmdTarget objekt přidružený k ukazateli IDispatch . |
CCmdTarget::GetDispatchIID |
Získá ID primárního rozhraní pro odesílání. |
CCmdTarget::GetIDispatch |
Vrátí ukazatel na IDispatch objekt přidružený k objektu CCmdTarget . |
CCmdTarget::GetTypeInfoCount |
Načte počet rozhraní informací o typu, které objekt poskytuje. |
CCmdTarget::GetTypeInfoOfGuid |
Načte popis typu odpovídající zadanému identifikátoru GUID. |
CCmdTarget::GetTypeLib |
Získá ukazatel na knihovnu typů. |
CCmdTarget::GetTypeLibCache |
Získá mezipaměť knihovny typů. |
CCmdTarget::IsInvokeAllowed |
Povolí vyvolání metody automatizace. |
CCmdTarget::IsResultExpected |
Vrátí nenulovou hodnotu, pokud by funkce automatizace měla vrátit hodnotu. |
CCmdTarget::OnCmdMsg |
Směruje a odesílá příkazové zprávy. |
CCmdTarget::OnFinalRelease |
Vyčistí se po vydání posledního odkazu OLE. |
CCmdTarget::RestoreWaitCursor |
Obnoví kurzor přesýpací hodiny. |
Poznámky
Mapa zpráv směruje příkazy nebo zprávy do členských funkcí, které zapisujete, aby je zvládly. (Příkaz je zpráva z položky nabídky, příkazového tlačítka nebo klávesy akcelerátoru.)
Klíčové třídy architektury odvozené z zahrnutí , , CCmdTargetCView, CWinApp, a CDocument.CWndCFrameWnd Pokud chcete, aby nová třída zpracovávala zprávy, odvodit třídu z jedné z těchto CCmdTarget-odvozených tříd. Třídu odvozujete CCmdTarget zřídka přímo.
Přehled cílů příkazů a OnCmdMsg směrování najdete v tématu Cíle příkazů, Směrování příkazů a Mapování zpráv.
CCmdTarget obsahuje členské funkce, které zpracovávají zobrazení kurzoru přesýpacích hodin. Zobrazte kurzor přesýpacích hodin, když očekáváte, že spuštění příkazu bude trvat výrazný časový interval.
Mapy dispatch, podobně jako mapy zpráv, se používají k zveřejnění funkce automatizace IDispatch OLE. Vystavením tohoto rozhraní můžou do vaší aplikace volat jiné aplikace (například Visual Basic).
Hierarchie dědičnosti
CCmdTarget
Požadavky
Záhlaví:afxwin.h
CCmdTarget::BeginWaitCursor
Voláním této funkce zobrazíte kurzor jako přesýpací hodiny, když očekáváte, že provedení příkazu bude trvat výrazný časový interval.
void BeginWaitCursor();
Poznámky
Architektura volá tuto funkci, která uživateli ukáže, že je zaneprázdněný, například když CDocument se objekt načte nebo uloží do souboru.
Akce, které BeginWaitCursor nejsou vždy efektivní mimo jednu obslužnou rutinu zprávy, jako jsou jiné akce, jako OnSetCursor je zpracování, by mohly změnit kurzor.
Volání EndWaitCursor pro obnovení předchozího kurzoru
Příklad
// 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 Vytvoří objekt.
CCmdTarget();
CCmdTarget::DoOleVerb
Způsobí provedení akce určené příkazem OLE.
BOOL DoOleVerb(
LONG iVerb,
LPMSG lpMsg,
HWND hWndParent,
LPCRECT lpRect);
Parametry
iVerb
Číselný identifikátor slovesa.
lpMsg
Ukazatel na MSG strukturu popisující událost (například poklikání), která vyvolala operaci.
hWndParent
Úchyt okna dokumentu obsahujícího objekt
lpRect
Ukazatel na RECT strukturu obsahující souřadnice v pixelech, které definují ohraničující obdélník objektu v hWndParent.
Návratová hodnota
TRUE v případě úspěchu, jinak FALSE.
Poznámky
Tato členová funkce je v podstatě implementace IOleObject::DoVerb. Možné akce jsou výčtem CCmdTarget::EnumOleVerbs.
CCmdTarget::EnableAutomation
Voláním této funkce povolíte automatizaci OLE pro objekt.
void EnableAutomation();
Poznámky
Tato funkce je obvykle volána z konstruktoru objektu a měla by být volána pouze v případě, že byla pro třídu deklarována mapa odeslání. Další informace o automatizaci najdete v článcích Automatizační klienti a automatizační servery.
CCmdTarget::EnableConnections
Povolí aktivaci událostí přes spojovací body.
void EnableConnections();
Poznámky
Chcete-li povolit spojovací body, zavolejte tuto členovu funkci v konstruktoru odvozené třídy.
CCmdTarget::EnableTypeLib
Povolí knihovnu typů objektu.
void EnableTypeLib();
Poznámky
Volání této členské funkce v konstruktoru - CCmdTargetodvozeného objektu, pokud poskytuje informace o typu.
CCmdTarget::EndWaitCursor
Volejte tuto funkci po zavolání BeginWaitCursor členské funkce, která se vrátí z kurzoru přesýpací hodiny na předchozí kurzor.
void EndWaitCursor();
Poznámky
Architektura také volá tuto členovou funkci poté, co volala kurzor přesýpací hodiny.
Příklad
// 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
Vytvoří výčet příkazů OLE objektu.
BOOL EnumOleVerbs(LPENUMOLEVERB* ppenumOleVerb);
Parametry
ppenumOleVerb
Ukazatel na ukazatel na IEnumOLEVERB rozhraní.
Návratová hodnota
TRUE pokud objekt podporuje alespoň jedno sloveso OLE (v takovém případě *ppenumOleVerb odkazuje na rozhraní enumerátoru IEnumOLEVERB ), jinak FALSE.
Poznámky
Tato členová funkce je v podstatě implementace IOleObject::EnumVerbs.
CCmdTarget::FromIDispatch
Voláním této funkce namapujete IDispatch ukazatel přijatý z automatizačních členských funkcí třídy do objektu CCmdTarget , který implementuje rozhraní objektu IDispatch .
static CCmdTarget* PASCAL FromIDispatch(LPDISPATCH lpDispatch);
Parametry
lpDispatch
Ukazatel na IDispatch objekt.
Návratová hodnota
Ukazatel na CCmdTarget objekt přidružený lpDispatch. Tato funkce vrátíNULL, pokud IDispatch objekt není rozpoznán jako objekt třídy Microsoft Foundation.IDispatch
Poznámky
Výsledkem této funkce je inverzní funkce volání členské funkce GetIDispatch.
CCmdTarget::GetDispatchIID
Získá ID primárního rozhraní pro odesílání.
virtual BOOL GetDispatchIID(IID* pIID);
Parametry
pIID
Ukazatel na ID rozhraní ( GUID).
Návratová hodnota
TRUE v případě úspěchu, jinak FALSE. V případě úspěchu *pIID se nastaví na ID primárního rozhraní dispečera.
Poznámky
Odvozené třídy by měly přepsat tuto člennou funkci (pokud není přepsán, GetDispatchIID vrátí FALSE). Viz třída COleControl.
CCmdTarget::GetIDispatch
Voláním této členské funkce načtěte IDispatch ukazatel z metody automatizace, která buď vrátí IDispatch ukazatel, nebo přebírá IDispatch ukazatel podle odkazu.
LPDISPATCH GetIDispatch(BOOL bAddRef);
Parametry
bAddRef
Určuje, zda se má zvýšit počet odkazů pro objekt.
Návratová hodnota
Ukazatel IDispatch přidružený k objektu.
Poznámky
U objektů, které volají EnableAutomation jejich konstruktory, takže je povolena automatizace, tato funkce vrátí ukazatel na implementaci IDispatch základní třídy, která je používána klienty, kteří komunikují přes IDispatch rozhraní. Volání této funkce automaticky přidá odkaz na ukazatel, takže není nutné volat IUnknown::AddRef.
CCmdTarget::GetTypeInfoCount
Načte počet rozhraní informací o typu, které objekt poskytuje.
virtual UINT GetTypeInfoCount();
Návratová hodnota
Počet rozhraní pro informace o typu.
Poznámky
Tato členová funkce v podstatě implementuje IDispatch::GetTypeInfoCount.
Odvozené třídy by měly tuto funkci přepsat, aby vrátila počet zadaných rozhraní informací o typu (buď 0, nebo 1). Pokud nepřepíšete, GetTypeInfoCount vrátí hodnotu 0. K přepsání použijte IMPLEMENT_OLETYPELIB makro, které také implementuje GetTypeLib a GetTypeLibCache.
CCmdTarget::GetTypeInfoOfGuid
Načte popis typu odpovídající zadanému identifikátoru GUID.
HRESULT GetTypeInfoOfGuid(
LCID lcid,
const GUID& guid,
LPTYPEINFO* ppTypeInfo);
Parametry
lcid
Identifikátor národního prostředí (LCID).
guid
Identifikátor GUID popisu typu.
ppTypeInfo
Ukazatel na ukazatel na ITypeInfo rozhraní.
Návratová hodnota
Označuje HRESULT úspěch nebo selhání volání. V případě úspěchu *ppTypeInfo odkazuje na rozhraní informací o typu.
CCmdTarget::GetTypeLib
Získá ukazatel na knihovnu typů.
virtual HRESULT GetTypeLib(
LCID lcid,
LPTYPELIB* ppTypeLib);
Parametry
lcid
Identifikátor národního prostředí (LCID).
ppTypeLib
Ukazatel na ukazatel na ITypeLib rozhraní.
Návratová hodnota
Označuje HRESULT úspěch nebo selhání volání. V případě úspěchu *ppTypeLib odkazuje na rozhraní knihovny typů.
Poznámky
Odvozené třídy by měly přepsat tuto člennou funkci (pokud není přepsán, GetTypeLib vrátí TYPE_E_CANTLOADLIBRARY).
IMPLEMENT_OLETYPELIB Použijte makro, které také implementuje GetTypeInfoCount a GetTypeLibCache.
CCmdTarget::GetTypeLibCache
Získá mezipaměť knihovny typů.
virtual CTypeLibCache* GetTypeLibCache();
Návratová hodnota
Ukazatel na CTypeLibCache objekt.
Poznámky
Odvozené třídy by měly přepsat tuto člennou funkci (pokud není přepsán, GetTypeLibCache vrátí NULL).
IMPLEMENT_OLETYPELIB Použijte makro, které také implementuje GetTypeInfoCount a GetTypeLib.
CCmdTarget::IsInvokeAllowed
Tato funkce je volána implementací IDispatch::Invoke knihovny MFC k určení, zda je možné vyvolat danou metodu automatizace (identifikovanou metodou dispid).
virtual BOOL IsInvokeAllowed(DISPID dispid);
Parametry
dispid
ID odeslání.
Návratová hodnota
TRUE pokud lze vyvolat metodu, jinak FALSE.
Poznámky
Pokud IsInvokeAllowed vrátí TRUE, Invoke pokračuje voláním metody; Invoke jinak selžou E_UNEXPECTED, vrátí .
Odvozené třídy mohou tuto funkci přepsat tak, aby vracely příslušné hodnoty (pokud nejsou přepsány, IsInvokeAllowed vrátí TRUE). Viz zejména COleControl::IsInvokeAllowed.
CCmdTarget::IsResultExpected
Umožňuje IsResultExpected zjistit, jestli klient očekává návratovou hodnotu z volání funkce automatizace.
BOOL IsResultExpected();
Návratová hodnota
Nenulové, pokud by funkce automatizace měla vrátit hodnotu; jinak 0.
Poznámky
Rozhraní OLE poskytuje prostředí MFC informace o tom, zda klient používá nebo ignoruje výsledek volání funkce, a MFC zase používá tyto informace k určení výsledku volání IsResultExpected. Pokud je produkce návratové hodnoty náročná na čas nebo prostředky, můžete zvýšit efektivitu voláním této funkce před výpočtem návratové hodnoty.
Tato funkce vrátí hodnotu 0 pouze jednou, abyste získali platné návratové hodnoty z jiných automatizačních funkcí, pokud je zavoláte z funkce automatizace, kterou klient volal.
IsResultExpected vrátí nenulovou hodnotu, pokud je volána, pokud není probíhající volání funkce automatizace.
CCmdTarget::OnCmdMsg
Volal rozhraní pro směrování a odesílání zpráv příkazů a zpracování aktualizace objektů uživatelského rozhraní příkazů.
virtual BOOL OnCmdMsg(
UINT nID,
int nCode,
void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo);
Parametry
nID
Obsahuje ID příkazu.
nCode
Identifikuje kód oznámení příkazu. Další informace o hodnotách pro nCode.
pExtra
Používá se podle hodnoty nCode.
Další informace o pExtra.
pHandlerInfo
Pokud tomu tak není NULL, OnCmdMsg vyplňuje pTarget místo pmfpHandlerInfo odeslání příkazu členy struktury. Obvykle by tento parametr měl být NULL.
Návratová hodnota
Nenulové, pokud je zpráva zpracována; jinak 0.
Poznámky
Toto je hlavní rutina implementace architektury příkazů architektury.
Za běhu OnCmdMsg odešle příkaz do jiných objektů nebo zpracuje samotný příkaz voláním kořenové třídy CCmdTarget::OnCmdMsg, která provádí skutečné vyhledávání mapy zpráv. Úplný popis výchozího směrování příkazů naleznete v tématu Zpracování zpráv a mapování témat.
Ve výjimečných případech můžete chtít tuto členskou funkci přepsat, aby se rozšířilo standardní směrování příkazů architektury. Podrobné informace o architektuře směrování příkazů najdete v technické poznámce 21 .
Pokud přepíšete OnCmdMsg, je nutné zadat odpovídající hodnotu pro nCode, kód oznámení příkazu a pExtra, který závisí na hodnotě nCode. Následující tabulka uvádí jejich odpovídající hodnoty:
nCode hodnota |
pExtra hodnota |
|---|---|
CN_COMMAND |
CCmdUI* |
CN_EVENT |
AFX_EVENT* |
CN_UPDATE_COMMAND_UI |
CCmdUI* |
CN_OLECOMMAND |
COleCmdUI* |
CN_OLE_UNREGISTER |
NULL |
Příklad
// 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
Volá se rozhraním při uvolnění posledního odkazu OLE na objekt nebo z objektu.
virtual void OnFinalRelease();
Poznámky
Tuto funkci přepište tak, aby poskytovala zvláštní zpracování pro tuto situaci. Výchozí implementace odstraní objekt.
CCmdTarget::RestoreWaitCursor
Voláním této funkce obnovíte odpovídající kurzor přesýpací hodiny po změně systémového kurzoru (například po otevření a zavření pole se zprávou uprostřed dlouhé operace).
void RestoreWaitCursor();
Příklad
// 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
}
Viz také
Mfc – ukázka ACDUAL
CObject Třída
Graf hierarchie
CCmdUI Třída
CDocument Třída
CDocTemplate Třída
CWinApp Třída
CWnd Třída
CView Třída
CFrameWnd Třída
COleDispatchDriver Třída