CCmdTarget
Třída
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í , , CDocument
CWinApp
, CWnd
, a CFrameWnd
.CView
CCmdTarget
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 - CCmdTarget
odvozené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 pmf
pHandlerInfo
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