TN071 : MFC IOleCommandTarget mise en œuvre

L'interface IOleCommandTarget permet aux objets et leurs contenants pour envoyer des commandes à l'autre. Par exemple, barres d'outils un objet peuvent contenir des boutons pour les commandes telles que l'impression, Aperçu avant impression, Enregistrer, Newet Zoom. Si un tel objet ont été intégré dans un conteneur qui prend en charge IOleCommandTarget, l'objet pourrait activer ses boutons et transmettre les commandes pour le conteneur de traitement lorsque l'utilisateur a cliqué sur eux. Si un conteneur de l'objet incorporé s'imprimer, elle pourrait décider de cette demande par l'envoi d'une commande par le biais de l'interface IOleCommandTarget de l'objet incorporé.

IOleCommandTarget est une interface de type Automation en ce qu'il est utilisé par un client pour appeler des méthodes sur un serveur. Cependant, à l'aide de IOleCommandTarget enregistre la charge d'effectuer des appels via les interfaces Automation parce que les programmeurs n'est pas à utiliser la méthode Invoke généralement coûteuse de IDispatch.

Dans MFC, l'interface IOleCommandTarget est utilisé par les serveurs de document actif pour permettre à des conteneurs de documents actifs envoyer des commandes au serveur. La classe de serveur de document actif, CDocObjectServerItem, utilise des cartes d'interface MFC (voir TN038 : implémentation de IUnknown MFC/OLE) pour implémenter l'interface IOleCommandTarget.

IOleCommandTarget est également implémenté dans la classe COleFrameHook . COleFrameHook est une classe MFC sans papiers qui implémente la fonctionnalité de fenêtre frame de conteneurs de montage sur place. COleFrameHook utilise également les cartes d'interface MFC pour implémenter l'interface IOleCommandTarget . COleFrameHookde mise en œuvre de IOleCommandTarget transmet les commandes OLE COleDocObjectItem-dérivés des conteneurs de documents actifs. Cela permet de tout conteneur de documents actifs MFC recevoir des messages provenant de serveurs de contenu de document actif.

Cartes de commande OLE MFC

Les développeurs MFC peuvent profiter de IOleCommandTarget en utilisant MFC OLE commande cartes. OLE commande cartes sont comme des cartes message parce qu'ils peuvent être utilisés pour mapper les commandes OLE aux fonctions de membres de la classe qui contient la carte de commande. Pour faire ce travail, placer les macros dans la carte de commande pour spécifier le groupe de commande OLE de la commande que vous souhaitez gérer la commande OLE et le ID de commande de la message WM_COMMAND qui est envoyé lors de la réception de la commande OLE. MFC fournit également un certain nombre de macros prédéfinies pour les commandes OLE standard. Pour une liste de la norme OLE commandes qui ont été conçus originellement pour utiliser avec les applications Microsoft Office, consultez l'énumération OLECMDID, qui est définie dans docobj.h.

Lorsqu'une commande OLE est reçue par une application MFC qui contient une carte de commande OLE, MFC tente de trouver l'ID de commande et le groupe de commande pour la commande demandée dans la carte de commande OLE de la demande. Si une correspondance est trouvée, un message WM_COMMAND est envoyé à l'application contenant la carte de commande avec l'ID de la commande demandée. (Voir la description ON_OLECMD ci-dessous.) De cette façon, les commandes OLE envoyés à une application sont transformées en messages WM_COMMAND par MFC. Les messages WM_COMMAND sont ensuite acheminés par le biais de cartes de message de l'application en utilisant la norme MFC architecture de routage des commandes.

Contrairement aux cartes message, MFC OLE commande cartes ne sont pas supportées par ClassWizard. Développeurs MFC doivent ajouter à l'appui de la carte de commande OLE et les entrées de la carte de commande OLE à la main. OLE commande cartes peuvent être ajoutées à des serveurs de document MFC Active dans n'importe quelle classe qui est de la chaîne de routage de message WM_COMMAND au moment où le document actif est active sur place dans un conteneur. Ces catégories comprennent les classes de l'application dérivées de CWinApp, CView, CDocumentet COleIPFrameWnd. Dans des conteneurs de documents actifs, cartes de commande OLE ne peuvent être ajoutés à la COleDocObjectItem-classe dérivée. Aussi, dans des conteneurs de documents actifs, les messages WM_COMMAND seront uniquement envoyés à la carte de message dans le COleDocObjectItem-classe dérivée.

OLE commandement Macros (carte)

Utiliser les macros suivantes pour ajouter les fonctionnalités de la carte de commande à votre classe:

DECLARE_OLECMD_MAP ()

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

BEGIN_OLECMD_MAP (theClass, baseClass)

theClass

Nom de la classe qui contient la carte de commande.

baseClass

Nom de la classe de base de la classe qui contient la carte de commande.

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

 END_OLECMD_MAP()

Cette macro marque la fin de la carte de commande. Utilisez cette macro dans le fichier d'implémentation pour la classe qui contient la carte de commande. Cette macro doit toujours suivre le BEGIN_OLECMD_MAP macro.

ON_OLECMD (pguid, olecmdid, id)

pguid

Pointeur vers le GUID du groupe de commande de la commande OLE. Ce paramètre est NULL pour le groupe de commande OLE standard.

olecmdid

OLE ID de la commande à invoquer la commande.

id

ID du message doit être envoyé à l'application contenant la carte de commande lorsque cette commande OLE est appelée WM_COMMAND.

Utilisation du ON_OLECMD commandes de macro dans la carte de commande pour ajouter des entrées pour le OLE vous souhaitez gérer. Lorsque les commandes OLE sont reçus, ils seront convertis au message WM_COMMAND spécifié et routés via l'application à l'aide de l'architecture de routage de commandes MFC standard.

Exemple

L'exemple suivant montre comment ajouter des capacités de gestion de commande OLE à un serveur de documents actifs MFC pour gérer la commande OLE OLECMDID_PRINT . Cet exemple suppose que vous avez utilisé AppWizard pour générer une application MFC qui est un serveur de documents actifs.

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

    &Notenbsp ;  Utilisez la classe CView-classe dérivée parce que c'est l'une des classes dans le serveur de documents actifs dans la chaîne de routage de message WM_COMMAND.

    class CMyServerView : public CView
    {
    protégé: / / création de sérialisation uniquement
    CMyServerView() ;
    DECLARE_DYNCREATE(CMyServerView)
    DECLARE_OLECMD_MAP()
    . . .
    }
    
  2. Dans le fichier de mise en œuvre de la classe CView-dérivée de la classe, ajoutez le BEGIN_OLECMD_MAP et END_OLECMD_MAP des macros:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. Pour gérer la commande d'impression standard OLE, ajouter une macro ON_OLECMD à la carte de commande spécifiant l'ID de commande OLE pour la commande d'impression standard et ID_FILE_PRINT pour l'ID de WM_COMMAND . ID_FILE_PRINT est l'ID de commande d'impression utilisée par les applications MFC AppWizard généré:
    BEGIN_OLECMD_MAP (CMyServerView, CView)
    ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

Notez que d'entre les macros de commandes OLE standards, définies dans afxdocob.h, pourrait être utilisé à la place de la macro ON_OLECMD parce que OLECMDID_PRINT est un ID de commande OLE standard. La macro ON_OLECMD_PRINT va accomplir la même tâche que la macro ON_OLECMD ci-dessus.

Lorsqu'une application conteneur envoie à ce serveur une commande OLECMDID_PRINT par le biais de l'interface du serveur IOleCommandTarget , le gestionnaire de commandes d'impression MFC sera invoqué dans le serveur, causant le serveur d'impression à la demande. Code du conteneur de documents actifs pour appeler la commande d'impression ajoutée dans les étapes ci-dessus serait quelque chose comme ça:

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

HR = m_lpObject-gt ;QueryInterface (IID_IOleCommandTarget, reinterpret_cast < void ** >(&pCmd)) ;
   if(Failed(HR))
      retour ;

HR = pCmd - > QueryStatus (NULL, 1, & ocm, NULL) ;
   if(succeeded(HR) & & (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command est disponible et activé donc appeler
      COleVariant vIn ;
      COleVariant vOut ;
      HR = pCmd - > Exec (NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, & vIn-vOut) ;
      Assert(succeeded(HR)) ;
   }
   pCmd - > Release() ;
}

&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie

Index