CCmdTarget
Třída
Základní třída pro architekturu mapy zpráv knihovny tříd Microsoft Foundation.
class CCmdTarget : public CObject
Název | Popis |
---|---|
CCmdTarget::CCmdTarget |
CCmdTarget Vytvoří objekt. |
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. |
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).
CCmdTarget
Záhlaví: afxwin.h
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();
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
// 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
Vytvoří objekt.
CCmdTarget();
Způsobí provedení akce určené příkazem OLE.
BOOL DoOleVerb(
LONG iVerb,
LPMSG lpMsg,
HWND hWndParent,
LPCRECT lpRect);
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
.
TRUE
v případě úspěchu, jinak FALSE
.
Tato členová funkce je v podstatě implementace IOleObject::DoVerb
. Možné akce jsou výčtem CCmdTarget::EnumOleVerbs
.
Voláním této funkce povolíte automatizaci OLE pro objekt.
void EnableAutomation();
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.
Povolí aktivaci událostí přes spojovací body.
void EnableConnections();
Chcete-li povolit spojovací body, zavolejte tuto členovu funkci v konstruktoru odvozené třídy.
Povolí knihovnu typů objektu.
void EnableTypeLib();
Volání této členské funkce v konstruktoru - CCmdTarget
odvozeného objektu, pokud poskytuje informace o typu.
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();
Architektura také volá tuto členovou funkci poté, co volala kurzor přesýpací hodiny.
// 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
}
Vytvoří výčet příkazů OLE objektu.
BOOL EnumOleVerbs(LPENUMOLEVERB* ppenumOleVerb);
ppenumOleVerb
Ukazatel na ukazatel na IEnumOLEVERB
rozhraní.
TRUE
pokud objekt podporuje alespoň jedno sloveso OLE (v takovém případě *ppenumOleVerb
odkazuje na rozhraní enumerátoru IEnumOLEVERB
), jinak FALSE
.
Tato členová funkce je v podstatě implementace IOleObject::EnumVerbs
.
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);
lpDispatch
Ukazatel na IDispatch
objekt.
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
Výsledkem této funkce je inverzní funkce volání členské funkce GetIDispatch
.
Získá ID primárního rozhraní pro odesílání.
virtual BOOL GetDispatchIID(IID* pIID);
pIID
Ukazatel na ID rozhraní ( GUID).
TRUE
v případě úspěchu, jinak FALSE
. V případě úspěchu *pIID
se nastaví na ID primárního rozhraní dispečera.
Odvozené třídy by měly přepsat tuto člennou funkci (pokud není přepsán, GetDispatchIID
vrátí FALSE
). Viz třída COleControl
.
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);
bAddRef
Určuje, zda se má zvýšit počet odkazů pro objekt.
Ukazatel IDispatch
přidružený k objektu.
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
.
Načte počet rozhraní informací o typu, které objekt poskytuje.
virtual UINT GetTypeInfoCount();
Počet rozhraní pro informace o typu.
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
.
Načte popis typu odpovídající zadanému identifikátoru GUID.
HRESULT GetTypeInfoOfGuid(
LCID lcid,
const GUID& guid,
LPTYPEINFO* ppTypeInfo);
lcid
Identifikátor národního prostředí ( LCID
).
guid
Identifikátor GUID popisu typu.
ppTypeInfo
Ukazatel na ukazatel na ITypeInfo
rozhraní.
Označuje HRESULT
úspěch nebo selhání volání. V případě úspěchu *ppTypeInfo
odkazuje na rozhraní informací o typu.
Získá ukazatel na knihovnu typů.
virtual HRESULT GetTypeLib(
LCID lcid,
LPTYPELIB* ppTypeLib);
lcid
Identifikátor národního prostředí (LCID).
ppTypeLib
Ukazatel na ukazatel na ITypeLib
rozhraní.
Označuje HRESULT
úspěch nebo selhání volání. V případě úspěchu *ppTypeLib
odkazuje na rozhraní knihovny typů.
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
.
Získá mezipaměť knihovny typů.
virtual CTypeLibCache* GetTypeLibCache();
Ukazatel na CTypeLibCache
objekt.
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
.
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);
dispid
ID odeslání.
TRUE
pokud lze vyvolat metodu, jinak FALSE
.
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
.
Umožňuje IsResultExpected
zjistit, jestli klient očekává návratovou hodnotu z volání funkce automatizace.
BOOL IsResultExpected();
Nenulové, pokud by funkce automatizace měla vrátit hodnotu; jinak 0.
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.
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);
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
.
Nenulové, pokud je zpráva zpracována; jinak 0.
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 |
// 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()
Volá se rozhraním při uvolnění posledního odkazu OLE na objekt nebo z objektu.
virtual void OnFinalRelease();
Tuto funkci přepište tak, aby poskytovala zvláštní zpracování pro tuto situaci. Výchozí implementace odstraní objekt.
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();
// 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 – 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