CCmdTarget-klass

Basklassen för meddelandekartarkitekturen för Microsoft Foundation-klassbiblioteket.

Syntax

class CCmdTarget : public CObject

Medlemmar

Offentliga konstruktorer

Namn Beskrivning
CCmdTarget::CCmdTarget Konstruerar ett CCmdTarget objekt.

Offentliga metoder

Namn Beskrivning
CCmdTarget::BeginWaitCursor Visar markören som en timglasmarkör.
CCmdTarget::DoOleVerb Gör att en åtgärd som anges av ett OLE-verb utförs.
CCmdTarget::EnableAutomation Tillåter OLE-automatisering för CCmdTarget objektet.
CCmdTarget::EnableConnections Aktiverar händelseavfyrning över anslutningspunkter.
CCmdTarget::EnableTypeLib Aktiverar ett objekts typbibliotek.
CCmdTarget::EndWaitCursor Återgår till föregående markör.
CCmdTarget::EnumOleVerbs Räknar upp ett objekts OLE-verb.
CCmdTarget::FromIDispatch Returnerar en pekare till det objekt som CCmdTarget är associerat med pekaren IDispatch .
CCmdTarget::GetDispatchIID Hämtar det primära ID:t för dispatch-gränssnittet.
CCmdTarget::GetIDispatch Returnerar en pekare till objektet som IDispatch är associerat med CCmdTarget objektet.
CCmdTarget::GetTypeInfoCount Hämtar antalet typinformationsgränssnitt som ett objekt tillhandahåller.
CCmdTarget::GetTypeInfoOfGuid Hämtar den typbeskrivning som motsvarar det angivna GUID:et.
CCmdTarget::GetTypeLib Hämtar en pekare till ett typbibliotek.
CCmdTarget::GetTypeLibCache Hämtar typbibliotekets cacheminne.
CCmdTarget::IsInvokeAllowed Aktiverar anrop av automatiseringsmetod.
CCmdTarget::IsResultExpected Returnerar nonzero om en automationsfunktion ska returnera ett värde.
CCmdTarget::OnCmdMsg Dirigerar och skickar kommandomeddelanden.
CCmdTarget::OnFinalRelease Rensar efter att den senaste OLE-referensen har släppts.
CCmdTarget::RestoreWaitCursor Återställer timglasmarkören.

Anmärkningar

En meddelandekarta dirigerar kommandon eller meddelanden till de medlemsfunktioner som du skriver för att hantera dem. (Ett kommando är ett meddelande från ett menyalternativ, en kommandoknapp eller en acceleratornyckel.)

Viktiga ramverksklasser som härleds från CCmdTarget inkluderar CView, CWinApp, CDocument, CWndoch CFrameWnd. Om du vill att en ny klass ska hantera meddelanden härleder du klassen från någon av dessa CCmdTarget-härledda klasser. Du härleder sällan en klass direkt CCmdTarget .

En översikt över kommandomål och OnCmdMsg routning finns i Kommandomål, Kommandoroutning och Mappningsmeddelanden.

CCmdTarget innehåller medlemsfunktioner som hanterar visningen av en timglasmarkör. Visa timglasmarkören när du förväntar dig att ett kommando ska ta ett märkbart tidsintervall att köra.

Dispatch-kartor, som liknar meddelandekartor, används för att exponera FUNKTIONER för OLE-automatisering IDispatch . Genom att exponera det här gränssnittet kan andra program (till exempel Visual Basic) anropa ditt program.

Arvshierarki

CObject

CCmdTarget

Kravspecifikation

rubrik:afxwin.h

CCmdTarget::BeginWaitCursor

Anropa den här funktionen för att visa markören som ett timglas när du förväntar dig att ett kommando ska ta ett märkbart tidsintervall att köra.

void BeginWaitCursor();

Anmärkningar

Ramverket anropar den här funktionen för att visa användaren att den är upptagen, till exempel när ett CDocument objekt läses in eller sparas i en fil.

Åtgärderna BeginWaitCursor i är inte alltid effektiva utanför en enda meddelandehanterare eftersom andra åtgärder, till exempel OnSetCursor hantering, kan ändra markören.

Anropa EndWaitCursor för att återställa den föregående markören.

Exempel

// 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

Konstruerar ett CCmdTarget objekt.

CCmdTarget();

CCmdTarget::DoOleVerb

Gör att en åtgärd som anges av ett OLE-verb utförs.

BOOL DoOleVerb(
    LONG iVerb,
    LPMSG lpMsg,
    HWND hWndParent,
    LPCRECT lpRect);

Parameterar

iVerb
Numerisk identifierare för verbet.

lpMsg
Pekare till strukturen MSG som beskriver händelsen (till exempel ett dubbelklick) som anropade verbet.

hWndParent
Handtag för dokumentfönstret som innehåller objektet.

lpRect
Pekare till strukturen RECT som innehåller koordinaterna, i bildpunkter, som definierar ett objekts avgränsningsrektangel i hWndParent.

Returvärde

TRUE om det lyckas, annars FALSE.

Anmärkningar

Den här medlemsfunktionen är i princip en implementering av IOleObject::DoVerb. Möjliga åtgärder räknas upp av CCmdTarget::EnumOleVerbs.

CCmdTarget::EnableAutomation

Anropa den här funktionen för att aktivera OLE-automatisering för ett objekt.

void EnableAutomation();

Anmärkningar

Den här funktionen anropas vanligtvis från konstruktorn för objektet och bör bara anropas om en sändningskarta har deklarerats för klassen. Mer information om automatisering finns i artiklarna Automation-klienter och Automation-servrar.

CCmdTarget::EnableConnections

Aktiverar händelseavfyrning över anslutningspunkter.

void EnableConnections();

Anmärkningar

Om du vill aktivera anslutningspunkter anropar du den här medlemsfunktionen i konstruktorn för din härledda klass.

CCmdTarget::EnableTypeLib

Aktiverar ett objekts typbibliotek.

void EnableTypeLib();

Anmärkningar

Anropa den här medlemsfunktionen i konstruktorn för ditt CCmdTarget-derived-objekt om den innehåller typinformation.

CCmdTarget::EndWaitCursor

Anropa den här funktionen när du har anropat BeginWaitCursor medlemsfunktionen för att återgå från timglasmarkören till föregående markör.

void EndWaitCursor();

Anmärkningar

Ramverket anropar även den här medlemsfunktionen när den har anropat timglasmarkören.

Exempel

// 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

Räknar upp ett objekts OLE-verb.

BOOL EnumOleVerbs(LPENUMOLEVERB* ppenumOleVerb);

Parameterar

ppenumOleVerb
En pekare till en pekare till ett IEnumOLEVERB gränssnitt.

Returvärde

TRUE om objektet stöder minst ett OLE-verb (i vilket fall *ppenumOleVerb pekar på ett IEnumOLEVERB uppräkningsgränssnitt), annars FALSE.

Anmärkningar

Den här medlemsfunktionen är i princip en implementering av IOleObject::EnumVerbs.

CCmdTarget::FromIDispatch

Anropa den här funktionen för att mappa en IDispatch pekare, som tagits emot från automationsmedlemsfunktioner i en klass, till objektet CCmdTarget som implementerar objektets IDispatch gränssnitt.

static CCmdTarget* PASCAL FromIDispatch(LPDISPATCH lpDispatch);

Parameterar

lpDispatch
En pekare till ett IDispatch objekt.

Returvärde

En pekare till objektet som CCmdTarget är associerat med lpDispatch. Den här funktionen returnerar NULL om objektet IDispatch inte känns igen som ett Microsoft Foundation-klassobjekt IDispatch .

Anmärkningar

Resultatet av den här funktionen är invertering av ett anrop till medlemsfunktionen GetIDispatch.

CCmdTarget::GetDispatchIID

Hämtar det primära ID:t för dispatch-gränssnittet.

virtual BOOL GetDispatchIID(IID* pIID);

Parameterar

pIID
En pekare till ett gränssnitts-ID (ett GUID).

Returvärde

TRUE om det lyckas, annars FALSE. Om det lyckas *pIID anges det till det primära dispatch interface-ID:t.

Anmärkningar

Härledda klasser bör åsidosätta den här medlemsfunktionen (om den inte åsidosätts returnerar GetDispatchIIDFALSE). Se även COleControl.

CCmdTarget::GetIDispatch

Anropa den här medlemsfunktionen för att hämta pekaren IDispatch från en automatiseringsmetod som antingen returnerar en IDispatch pekare eller tar en IDispatch pekare med referens.

LPDISPATCH GetIDispatch(BOOL bAddRef);

Parameterar

bAddRef
Anger om du vill öka referensantalet för objektet.

Returvärde

Pekaren IDispatch som är associerad med objektet.

Anmärkningar

För objekt som anropar EnableAutomation i sina konstruktorer, vilket gör dem automation aktiverade, returnerar den här funktionen en pekare till Foundation Class-implementeringen av IDispatch som används av klienter som kommunicerar via IDispatch gränssnittet. Om du anropar den här funktionen läggs en referens till pekaren automatiskt, så det är inte nödvändigt att göra ett anrop till IUnknown::AddRef.

CCmdTarget::GetTypeInfoCount

Hämtar antalet typinformationsgränssnitt som ett objekt tillhandahåller.

virtual UINT GetTypeInfoCount();

Returvärde

Antalet typinformationsgränssnitt.

Anmärkningar

Den här medlemsfunktionen implementerar IDispatch::GetTypeInfoCounti princip .

Härledda klasser bör åsidosätta den här funktionen för att returnera antalet typinformationsgränssnitt (antingen 0 eller 1). Om det inte åsidosättas GetTypeInfoCount returnerar 0. Om du vill åsidosätta använder du makrot IMPLEMENT_OLETYPELIB , som även implementerar GetTypeLib och GetTypeLibCache.

CCmdTarget::GetTypeInfoOfGuid

Hämtar den typbeskrivning som motsvarar det angivna GUID:et.

HRESULT GetTypeInfoOfGuid(
    LCID lcid,
    const GUID& guid,
    LPTYPEINFO* ppTypeInfo);

Parameterar

lcid
En språkidentifierare (LCID).

guid
GUID för typbeskrivningen.

ppTypeInfo
Pekare till en pekare till ITypeInfo gränssnittet.

Returvärde

Ett HRESULT som anger att anropet lyckades eller misslyckades. Om det lyckas *ppTypeInfo pekar du på typinformationsgränssnittet.

CCmdTarget::GetTypeLib

Hämtar en pekare till ett typbibliotek.

virtual HRESULT GetTypeLib(
    LCID lcid,
    LPTYPELIB* ppTypeLib);

Parameterar

lcid
En språkidentifierare (LCID).

ppTypeLib
En pekare till en pekare till ITypeLib gränssnittet.

Returvärde

Ett HRESULT som anger att anropet lyckades eller misslyckades. Om det lyckas *ppTypeLib pekar du på typbiblioteksgränssnittet.

Anmärkningar

Härledda klasser bör åsidosätta den här medlemsfunktionen (om den inte åsidosätts returnerar GetTypeLibTYPE_E_CANTLOADLIBRARY). Använd makrot IMPLEMENT_OLETYPELIB , som även implementerar GetTypeInfoCount och GetTypeLibCache.

CCmdTarget::GetTypeLibCache

Hämtar typbibliotekets cacheminne.

virtual CTypeLibCache* GetTypeLibCache();

Returvärde

En pekare till ett CTypeLibCache objekt.

Anmärkningar

Härledda klasser bör åsidosätta den här medlemsfunktionen (om den inte åsidosätts returnerar GetTypeLibCacheNULL). Använd makrot IMPLEMENT_OLETYPELIB , som även implementerar GetTypeInfoCount och GetTypeLib.

CCmdTarget::IsInvokeAllowed

Den här funktionen anropas av MFC:s implementering för IDispatch::Invoke att avgöra om en viss automatiseringsmetod (identifierad av dispid) kan anropas.

virtual BOOL IsInvokeAllowed(DISPID dispid);

Parameterar

dispid
Ett sändnings-ID.

Returvärde

TRUE om metoden kan anropas, annars FALSE.

Anmärkningar

Om IsInvokeAllowed returnerar TRUEInvokefortsätter du att anropa metoden. Annars Invoke misslyckas och returnerar E_UNEXPECTED.

Härledda klasser kan åsidosätta den här funktionen för att returnera lämpliga värden (om de inte åsidosätts IsInvokeAllowed returnerar TRUE). Se i synnerhet COleControl::IsInvokeAllowed.

CCmdTarget::IsResultExpected

Använd IsResultExpected för att ta reda på om en klient förväntar sig ett returvärde från anropet till en automationsfunktion.

BOOL IsResultExpected();

Returvärde

Nonzero om en automationsfunktion ska returnera ett värde. annars 0.

Anmärkningar

OLE-gränssnittet tillhandahåller information till MFC om huruvida klienten använder eller ignorerar resultatet av ett funktionsanrop, och MFC använder i sin tur den här informationen för att fastställa resultatet av ett anrop till IsResultExpected. Om produktionen av ett returvärde är tids- eller resursintensiv kan du öka effektiviteten genom att anropa den här funktionen innan du beräknar returvärdet.

Den här funktionen returnerar bara 0 en gång så att du får giltiga returvärden från andra automatiseringsfunktioner om du anropar dem från den automationsfunktion som klienten har anropat.

IsResultExpected returnerar ett icke-nollvärde om det anropas när ett automationsfunktionsanrop inte pågår.

CCmdTarget::OnCmdMsg

Anropas av ramverket för att dirigera och skicka kommandomeddelanden och för att hantera uppdateringen av kommandogränssnittsobjekt.

virtual BOOL OnCmdMsg(
    UINT nID,
    int nCode,
    void* pExtra,
    AFX_CMDHANDLERINFO* pHandlerInfo);

Parameterar

nID
Innehåller kommando-ID:t.

nCode
Identifierar kommandots meddelandekod. Mer information om värden för finns i Kommentarer för nCode.

pExtra
Används enligt värdet nCodeför . Mer information om finns i Kommentarer om pExtra.

pHandlerInfo
Om inte NULLOnCmdMsg fyller i och pTarget medlemmar pmf i strukturen i pHandlerInfo stället för att skicka kommandot. Den här parametern bör vanligtvis vara NULL.

Returvärde

Nonzero om meddelandet hanteras; annars 0.

Anmärkningar

Det här är den huvudsakliga implementeringsrutinen för ramverkets kommandoarkitektur.

Vid körning OnCmdMsg skickar ett kommando till andra objekt eller hanterar själva kommandot genom att anropa rotklassen CCmdTarget::OnCmdMsg, som gör den faktiska sökningen av meddelandekartan. En fullständig beskrivning av standardkommandodirigeringen finns i Ämnen för meddelandehantering och mappning.

I sällsynta fall kanske du vill åsidosätta den här medlemsfunktionen för att utöka ramverkets standardkommandodirigering. Mer information om kommandodirigeringsarkitekturen finns i Technical Note 21 .

Om du åsidosätter OnCmdMsgmåste du ange lämpligt värde för nCode, kommandomeddelandekoden och pExtra, som beror på värdet nCodeför . I följande tabell visas deras motsvarande värden:

nCode värde pExtra värde
CN_COMMAND CCmdUI*
CN_EVENT AFX_EVENT*
CN_UPDATE_COMMAND_UI CCmdUI*
CN_OLECOMMAND COleCmdUI*
CN_OLE_UNREGISTER NULL

Exempel

// 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

Anropas av ramverket när den sista OLE-referensen till eller från objektet släpps.

virtual void OnFinalRelease();

Anmärkningar

Åsidosätt den här funktionen för att tillhandahålla särskild hantering för den här situationen. Standardimplementeringen tar bort objektet.

CCmdTarget::RestoreWaitCursor

Anropa den här funktionen för att återställa lämplig timglasmarkör när systemmarkören har ändrats (till exempel när en meddelanderuta har öppnats och sedan stängts mitt i en lång åtgärd).

void RestoreWaitCursor();

Exempel

// 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
}

Se även

MFC-exempel ACDUAL
CObject klass
hierarkidiagram
CCmdUI klass
CDocument klass
CDocTemplate klass
CWinApp klass
CWnd klass
CView klass
CFrameWnd klass
COleDispatchDriver klass