Impression par programmation

OLE a fourni les moyens d’identifier de manière unique les documents persistants (GetClassFile) et de les charger dans leur code associé (CoCreateInstance, , QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage)IPersistFile::Loadet IPersistStorage::Load). Pour activer davantage l'impression de documents, la relation contenant-contenu de document actif (en utilisant une conception OLE existante non fournie avec OLE 2.0 à l'origine) présente une interface standard de base d'impression, IPrint, généralement disponible via un objet qui peut charger l'état permanent du type de document. Chaque vue d’un document actif peut éventuellement prendre en charge l’interface IPrint pour fournir ces fonctionnalités.

L'interface IPrint se définit de la manière suivante :

interface IPrint : IUnknown
    {
    HRESULT SetInitialPageNum([in] LONG nFirstPage);
    HRESULT GetPageInfo(
        [out] LONG *pnFirstPage,
        [out] LONG *pcPages);
    HRESULT Print(
        [in] DWORD grfFlags,
        [in,out] DVTARGETDEVICE **pptd,
        [in,out] PAGESET ** ppPageSet,
        [in,out] STGMEDIUM **ppstgmOptions,
        [in] IContinueCallback* pCallback,
        [in] LONG nFirstPage,
        [out] LONG *pcPagesPrinted,
        [out] LONG *pnPageLast);
    };

Les clients et les conteneurs utilisent IPrint::Print simplement pour indiquer au document de s’imprimer une fois que ce document est chargé, en spécifiant des indicateurs de contrôle d’impression, l’appareil cible, les pages à imprimer et des options supplémentaires. Le client peut également contrôler la suite de l'impression via l'interface IContinueCallback (voir ci-dessous).

En outre, IPrint::SetInitialPageNum prend en charge la possibilité d’imprimer une série de documents en tant qu’une en numérotant des pages de manière transparente, évidemment un avantage pour les conteneurs de documents actifs comme Bureau Binder. IPrint::GetPageInfo permet d’afficher des informations de pagination simples en autorisant l’appelant à récupérer le numéro de page de départ précédemment transmis SetInitialPageNum (ou le numéro de page de démarrage par défaut interne du document) et le nombre de pages du document.

Les objets prenant en charge IPrint sont marqués dans le Registre avec la clé "Printable" stockée sous le CLSID de l'objet :

HKEY_CLASSES_ROOT\CLSID\{...} \Imprimable

IPrint est généralement implémentée sur le même objet qui prend en charge IPersistFile ou IPersistStorage. Les appelants notent la possibilité d'imprimer de façon programmée l'état permanent d'une certaine classe en recherchant la clé "Printable" dans le Registre. Actuellement, « Imprimable » indique la prise en charge d’au moins IPrint; d’autres interfaces peuvent être définies à l’avenir, qui seraient ensuite disponibles par le biais QueryInterface de laquelle IPrint représente simplement le niveau de prise en charge de base.

Pendant la procédure d'impression, vous pouvez souhaiter que le client ou le conteneur à l'origine de l'impression puisse contrôler si l'impression doit continuer. Par exemple, le conteneur peut prendre en charge une commande "Arrêter" qui doit arrêter le travail d'impression dès que possible. Pour prendre en charge cette fonctionnalité, le client d'un objet imprimable peut implémenter un petit objet récepteur de notification avec l'interface IContinueCallback :

interface IContinueCallback : IUnknown
    {
    HRESULT FContinue(void);
    HRESULT FContinuePrinting(
        [in] LONG cPagesPrinted,
        [in] LONG nCurrentPage,
        [in] LPOLESTR pszPrintStatus);
    };

Cette interface est conçue pour être utile en tant que fonction de rappel de continuation générique qui prend la place des différentes procédures de continuation dans l’API Win32 (par exemple, pour AbortProc l’impression et l’énumération EnumMetafileProc de métafichier). Cette conception d'interface est utile dans une grande variété de processus longs.

Dans les cas les plus génériques, la IContinueCallback::FContinue fonction est appelée périodiquement par tout processus long. L’objet récepteur retourne S_OK pour poursuivre l’opération et S_FALSE pour arrêter la procédure dès que possible.

FContinue, cependant, n’est pas utilisé dans le contexte de IPrint::Print; plutôt, l’impression utilise IContinueCallback::FContinuePrint. Tout objet d’impression doit appeler FContinuePrinting régulièrement en passant le nombre de pages qui ont été imprimées, le numéro de la page imprimée et une chaîne supplémentaire décrivant l’état d’impression que le client peut choisir d’afficher à l’utilisateur (par exemple, « Page 5 sur 19 »).

Voir aussi

Conteneurs de documents actifs