Documents actifs
Les documents actifs étendent la technologie de document composé OLE. Ces extensions sont fournies sous la forme d’autres interfaces qui gèrent les vues, afin que les objets puissent s’exécuter dans des conteneurs tout en conservant le contrôle de l’affichage et des fonctions d’impression. Ce processus permet d'afficher des documents dans des frames étrangers (tels que le Classeur Microsoft Office ou Microsoft Internet Explorer) et dans des frames natifs (tels que les propres ports de vue du produit).
Cette section décrit les exigences fonctionnelles pour les documents actifs. Le document actif possède un jeu de données et a accès au stockage dans lequel les données peuvent être enregistrées et récupérées. Il peut créer et gérer une ou plusieurs vues sur ses données. En plus de prendre en charge l'incorporation et les interfaces d'activation en place classiques des documents OLE, le document actif communique sa capacité à créer des vues via IOleDocument
. Dans cette interface, le conteneur peut demander à créer (et énumérer) les vues que le document actif peut afficher. Dans cette interface, le document actif peut également fournir des informations diverses sur lui-même, par exemple s'il prend en charge plusieurs vues ou rectangles complexes.
Voici l’interface IOleDocument
. Notez que l’interface IEnumOleDocumentViews
est un énumérateur OLE standard pour IOleDocumentView*
les types.
interface IOleDocument : IUnknown
{
HRESULT CreateView(
[in] IOleInPlaceSite *pIPSite,
[in] IStream *pstm,
[in] DWORD dwReserved,
[out] IOleDocumentView **ppView);
HRESULT GetDocMiscStatus([out] DWORD *pdwStatus);
HRESULT EnumViews(
[out] IEnumOleDocumentViews **ppEnum,
[out] IOleDocumentView **ppView);
}
Chaque document actif doit avoir un fournisseur de frame de vue avec cette interface. Si le document n'est pas incorporé dans un conteneur, le serveur de document actif lui-même doit fournir le frame de vue. Toutefois, lorsque le document actif est incorporé dans un conteneur de documents actifs, le conteneur fournit le frame de vue.
Un document actif peut créer un ou plusieurs types de vues de ses données (par exemple, normal, plan, mise en page, etc.). Les vues agissent comme des filtres dans lesquels les données peuvent être affichées. Même si le document n’a qu’un seul type d’affichage, vous pouvez toujours prendre en charge plusieurs affichages comme moyen de prendre en charge les nouvelles fonctionnalités de fenêtre (par exemple, l’élément Nouvelle fenêtre dans le menu Fenêtre dans application Office lications).
Configuration requise pour les documents actifs
Un document actif qui peut être affiché dans un conteneur de documents actifs doit :
Utiliser les fichiers composés OLE comme mécanisme de stockage en implémentant
IPersistStorage
.Prise en charge des fonctionnalités d’incorporation de base de documents OLE, notamment créer à partir d’un fichier. Cela rend nécessaire les interfaces
IPersistFile
,IOleObject
etIDataObject
.Prendre en charge une ou plusieurs vues, chacune avec la fonctionnalité d'activation en place. Autrement dit, les vues doivent prendre en charge l’interface
IOleDocumentView
ainsi que les interfaces etIOleInPlaceActiveObject
(à l’aide des interfacesIOleInPlaceObject
etIOleInPlaceFrame
desIOleInPlaceSite
conteneurs).Prendre en charge les interfaces de document actif standard
IOleDocument
,IOleCommandTarget
etIPrint
.
Savoir quand et comment utiliser les interfaces côté conteneur est nécessaire pour les exigences.
Configuration requise pour afficher les objets
Un document actif peut créer une ou plusieurs vues de ses données. Fonctionnellement, ces vues sont comme les ports d'une méthode particulière permettant d'afficher les données. Si un document actif ne prend en charge qu'une vue, le document actif et cette vue peuvent être implémentés en utilisant une seule classe. IOleDocument::CreateView
retourne le pointeur d’interface du IOleDocumentView
même objet.
Pour être représenté dans un conteneur de documents actif, un composant d’affichage doit prendre en charge IOleInPlaceObject
et IOleInPlaceActiveObject
en plus des éléments suivants IOleDocumentView
:
interface IOleDocumentView : IUnknown
{
HRESULT SetInPlaceSite([in] IOleInPlaceSite *pIPSite);
HRESULT GetInPlaceSite([out] IOleInPlaceSite **ppIPSite);
HRESULT GetDocument([out] IUnknown **ppunk);
[input_sync] HRESULT SetRect([in] LPRECT prcView);
HRESULT GetRect([in] LPRECT prcView);
[input_sync] HRESULT SetRectComplex(
[in] LPRECT prcView,
[in] LPRECT prcHScroll,
[in] LPRECT prcVScroll,
[in] LPRECT prcSizeBox);
HRESULT Show([in] BOOL fShow);
HRESULT UIActivate([in] BOOL fUIActivate);
HRESULT Open(void);
HRESULT CloseView([in] DWORD dwReserved);
HRESULT SaveViewState([in] IStream *pstm);
HRESULT ApplyViewState([in] IStream *pstm);
HRESULT Clone(
[in] IOleInPlaceSite *pIPSiteNew,
[out] IOleDocumentView **ppViewNew);
}
Chaque vue a un site de vue associé, qui encapsule le frame de la vue et le port de vue (HWND et une zone rectangulaire dans cette fenêtre). Le site expose cette fonctionnalité bien que l’interface standard IOleInPlaceSite
. Notez qu'il est possible d'avoir plusieurs port d'affichage sur un seul HWND.
En général, chaque type de vue a une représentation affichée différente. Par conséquent les vues et les sites de correspondance de vue doivent implémenter les interfaces d'impression si IPrint
et IContinueCallback
, respectivement. Le cadre d’affichage doit négocier avec le fournisseur IPrint
d’affichage lors de l’impression, afin que les en-têtes, les pieds de page, les marges et les éléments associés soient imprimés correctement. Le fournisseur d'affichage notifie le frame des événements liés à l'impression via IContinueCallback
. Pour plus d’informations sur l’utilisation de ces interfaces, consultez Impression par programmation.
Notez que si un document actif ne prend en charge qu'une vue, le document actif et cette vue peuvent être implémentés en utilisant une seule classe concrète. IOleDocument::CreateView
retourne simplement le pointeur d’interface du IOleDocumentView
même objet. En bref, il n'est pas nécessaire d'avoir deux instances d'objet distinctes lorsqu'une seule vue est requise.
Un objet de vue peut également être une cible de commande. En implémentant IOleCommandTarget
une vue, vous pouvez recevoir des commandes qui proviennent de l’interface utilisateur du conteneur (par exemple, New, Open, Save As, Print on the File menu ; and Copy, Paste, Undo on the Edit menu). Pour plus d’informations, consultez Gestion des messages et cibles de commande.