Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
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