Partager via


TN071 : Implémentation IOleCommandTarget MFC

[!REMARQUE]

La note technique suivante n'a pas été modifiée depuis si c'était première inclus dans la documentation en ligne.Par conséquent, certaines procédures et rubriques peuvent être obsolètes ou incorrects.Pour obtenir les informations les plus récentes, il est recommandé que vous trouviez la rubrique d'intérêt dans l'index de la documentation en ligne.

L'interface d' IOleCommandTarget active les objets et leurs conteneurs aux commandes d'expédition entre eux.Par exemple, les barres d'outils d'un objet peuvent contenir des boutons pour les commandes telles que Imprimer, Aperçu avant impression, Enregistrer, New, et Zoom.Si un tel objet était incorporés dans un conteneur qui prend en charge IOleCommandTarget, l'objet peut vérifier ses boutons et transférer des commandes au conteneur pour le traitement lorsque l'utilisateur l'a utilisateur clique dessus.Si un conteneur souhaitait l'objet incorporé pour s'imprimer, il peut effectuer cette demande en envoyant une commande via l'interface d' IOleCommandTarget de l'objet incorporé.

IOleCommandTarget est une interface comme une automation car elle est utilisée par un client pour appeler des méthodes sur un serveur.Toutefois, l'utilisation IOleCommandTarget enregistre la charge mémoire pour effectuer des appels via des interfaces Automation parce que les programmeurs ne doivent pas utiliser la méthode type coûteuse des Invoke d' IDispatch.

Dans MFC, l'interface d' IOleCommandTarget est utilisée par les serveurs de document actif pour autoriser les conteneurs de documents actifs aux commandes d'expédition au serveur.La classe de serveur de document actif, CDocObjectServerItem, mappages d'interface de MFC (consultez TN038 : Implémentation MFC/OLE IUnknown) pour implémenter l'interface de IOleCommandTarget .

IOleCommandTarget est également implémenté dans la classe de COleFrameHook .COleFrameHook est une classe MFC non documentée qui implémente la fonctionnalité de fenêtre frame des conteneurs d'édition visuelle.COleFrameHook utilise également des mappages d'interface MFC pour implémenter l'interface d' IOleCommandTarget .L'implémentation de COleFrameHook d' IOleCommandTarget transmet de commandes OLE COleDocObjectItem- conteneurs de documents actifs dérivés.Cela permet à n'importe quel conteneur de documents actifs MFC pour recevoir des messages des serveurs de documents actifs contenus.

Mappage de commande OLE MFC

Les développeurs MFC peuvent tirer parti d' IOleCommandTarget à l'aide de plusieurs mappages de commande OLE MFC.Les OLE cartes de commande sont semblables à des tables des messages car elles peuvent être utilisées pour mapper de OLE commandes aux fonctions membres de la classe qui contient la table de commande.Pour ce faire, macros de placer dans le mappage de commande pour spécifier le groupe de commandes OLE de la commande que vous souhaitez gérer, la notion de commande, et l'ID de commande du message de WM_COMMAND qui sera envoyé lorsque la notion de commande est reçue.MFC fournit également plusieurs macros prédéfinies pour OLE de commandes standard.Pour une liste des commandes OLE standard qui ont été initialement conçues pour une utilisation avec les applications Microsoft Office, consultez l'énumération d'OLECMDID, qui est définie dans docobj.h.

Lorsqu'une notion de commande est reçue par une application MFC qui contient une notion de mappage de commande, MFC essaie de rechercher l'ID de commande et le groupe de commandes de la commande demandée dans OLE mappage de commande de l'application.Si une correspondance est trouvée, un message de WM_COMMAND est distribué à l'application contenant le mappage de commande avec l'ID de la commande demandée.(Consultez la description d' ON_OLECMD ci-dessous.) De cette façon, de commandes OLE distribuées à une application sont transformées en messages de WM_COMMAND par les MFC.Les messages de WM_COMMAND sont ensuite routés dans les tables des messages d'application à l'aide de l'architecture MFC standard routage de commandes .

Contrairement aux tables des messages, tables de commande OLE MFC ne sont pas prises en charge par l'assistant classe.Les développeurs MFC doivent ajouter de OLE entrées de mappage de support de mappage de commande et de commande OLE à la main.OLE de cartes de commande peuvent être ajoutées aux serveurs de documents actifs MFC dans toute classe qui est dans la chaîne de message-routage de WM_COMMAND tandis que le document actif est actif sur place dans un conteneur.Ces classes contiennent des classes de l'application dérivées de CWinApp, de CView, de CDocument, et de COleIPFrameWnd.Dans les conteneurs de documents actifs, de OLE cartes de commande ne peuvent être ajoutées à COleDocObjectItemclasse dérivée de.En outre, dans des conteneurs de documents actifs, les messages de WM_COMMAND seront seulement distribué vers la table des messages dans COleDocObjectItemclasse dérivée de.

OLE macros de mappage de commande

Utilisez les macros suivantes pour ajouter des fonctionnalités de mappage de commande à votre classe :

DECLARE_OLECMD_MAP ()

Cette macro entre dans la déclaration de classe (généralement dans le fichier d'en-tête) de la classe qui contient la table de commande.

BEGIN_OLECMD_MAP(theClass, baseClass)
  • theClass
    Nom de la classe qui contient la table de commande.

  • baseClass
    Nom de la classe de base de la classe qui contient la table de commande.

Cette macro marque le début de la carte de commande.Utilisez cette macro dans le fichier d'implémentation de la classe qui contient la table de commande.

END_OLECMD_MAP()

Cette macro marque la fin du mappage de commande.Utilisez cette macro dans le fichier d'implémentation de la classe qui contient la table de commande.Cette macro doit toujours respecter la macro de BEGIN_OLECMD_MAP .

ON_OLECMD(pguid, olecmdid, id)
  • pguid
    Pointeur vers le GUID du groupe de commandes OLE de la commande.Ce paramètre est NULL pour le groupe de commandes OLE standard.

  • olecmdid
    OLE ID de la commande à appeler.

  • id
    ID du message de WM_COMMAND à envoyer à l'application contenant le mappage de commande lorsque cette notion de commande est appelée.

Utilisez la macro d' ON_OLECMD dans le mappage de commande pour ajouter des entrées relatives aux OLE commandes que vous souhaitez gérer.Lorsque les OLE commandes sont acceptées, elles sont converties vers le message spécifié de WM_COMMAND et routées via la table des messages d'application à l'aide de l'architecture standard de routage de commandes MFC.

Exemple

L'exemple suivant montre comment ajouter la notion de fonction de commande-gestion à un serveur de documents actifs MFC de gérer la commande d' OLECMDID_PRINT OLE.Cet exemple suppose que vous AppWizard utilisé pour générer une application MFC qui est un serveur de document actif.

  1. Dans votre CView- le fichier d'en-tête de la classe dérivée, ajoutez la macro d' DECLARE_OLECMD_MAP à la déclaration de classe.

    [!REMARQUE]

    Utilisez CViewclasse dérivée parce qu'il est l'une des classes de le serveur de document actif qui est dans la chaîne de message-routage de WM_COMMAND .

    class CMyServerView : public CView
    {
    protected: // create from serialization only
       CMyServerView();
       DECLARE_DYNCREATE(CMyServerView)
       DECLARE_OLECMD_MAP()
    . . .
    };
    
  2. Dans le fichier d'implémentation pour CView- la classe dérivée, ajoutez les macros d' BEGIN_OLECMD_MAP et d' END_OLECMD_MAP :

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Pour gérer la notion de commande d'impression standard, ajoutez une macro d' ON_OLECMD au mappage de commande spécifiant le OLE ID de commande pour la commande d'impression standard et ID_FILE_PRINT de l'ID de WM_COMMANDID_FILE_PRINT est l'ID de commande standard d'impression utilisé par les applications AppWizard-générées MFC :

    BEGIN_OLECMD_MAP(CMyServerView, CView)
       ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Notez que l'un des OLE macros de commandes standard, défini dans afxdocob.h, peut être utilisé à la place de la macro de ON_OLECMD car OLECMDID_PRINT est une NOTION identification standard de commandeLa macro d' ON_OLECMD_PRINT réalisera la même tâche que la macro d' ON_OLECMD ci-dessus.

Lorsqu'une application conteneur envoie ce serveur une commande d' OLECMDID_PRINT via l'interface d' IOleCommandTarget du serveur, MFC l'impression du gestionnaire de commandes sera appelé dans le serveur, ce qui entraîne imprimer le serveur l'application.Le code du conteneur de documents actifs pour appeler la commande d'impression ajoutées dans les étapes ci-dessus peut ressembler à ceci :

void CContainerCntrItem::DoOleCmd()
{
   IOleCommandTarget *pCmd = NULL;
   HRESULT hr = E_FAIL;
   OLECMD ocm={OLECMDID_PRINT, 0};

   hr = m_lpObject->QueryInterface(IID_IOleCommandTarget,reinterpret_cast<void**>(&pCmd));
   if(FAILED(hr))
      return;

   hr = pCmd->QueryStatus(NULL, 1, &ocm, NULL);
   if(SUCCEEDED(hr) && (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command is available and enabled so call it
      COleVariant vIn;
      COleVariant vOut;
      hr = pCmd->Exec(NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
      ASSERT(SUCCEEDED(hr));
   }
   pCmd->Release();
}

Voir aussi

Autres ressources

Notes techniques de nombres

Notes techniques de catégorie