Sdílet prostřednictvím


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

Jméno popis
CCmdTarget::CCmdTarget CCmdTarget Vytvoří objekt.

Veřejné metody

Jméno 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í , , CDocumentCWinApp, CWnd, a CFrameWnd.CViewCCmdTarget 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

Objekt CObject

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.

Vrácená 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í.

Vrácená 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.

Vrácená 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).

Vrácená 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.

Vrácená 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();

Vrácená 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í.

Vrácená 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í.

Vrácená 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();

Vrácená 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í.

Vrácená 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();

Vrácená 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.

Vrácená 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 Hodnotu pExtra Hodnotu
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