Impression de programmation
OLE a fourni des moyens d'identifier des documents persistants (GetClassFile) et de les charger dans leur code associé (CoCreateInstance, QueryInterface(IID_IPersistFile), QueryInterface(IID_IPersistStorage), IPersistFile::Load, et IPersistStorage::Load).Pour activer davantage de l'impression de documents, la relation contenant-contenu de document actif (à l'aide d'une notion de conception existante non livrée avec OLE 2,0 initialement) présente une interface d'impression de base-standard, IPrint, généralement - via disponible tout objet qui peut charger l'état de persistance du type de document.Chaque vue d'un document actif peut éventuellement prendre en charge l'interface d' IPrint pour fournir ces fonctions.
l'interface d' IPrint est définie comme suit :
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 utilisez simplement IPrint::Print pour indiquer au document à imprimer une fois que le document est chargé, en spécifiant des balises de paramètre général de présentation, le périphérique cible, les pages à imprimer, et des options supplémentaires.Le client peut contrôler la suite de l'impression via l'interface IContinueCallback (voir ci-dessous).
En outre, IPrint::SetInitialPageNum prend en charge la capacité d'imprimer une série de documents en tant qu'en comptant des pages de façon transparente, évidemment un avantage pour les conteneurs de documents actifs comme le classeur Office.IPrint::GetPageInfo rend l'affichage des informations de pagination simple qui permet à l'appelant de récupérer le numéro de page en commençant précédemment passé à SetInitialPageNum (ou le numéro de page en commençant interne par défaut du document) et le nombre de pages dans le document.
Les objets qui prennent en charge IPrint sont marqués dans le Registre avec la clé « imprimable » stockée sous le CLSID de l'objet :
HKEY_CLASSES_ROOT \CLSID\{…}\Printable
IPrint est généralement implémenté sur le même objet qui prend en charge IPersistFile ou IPersistStorage.Les appelants notez la fonction dans la copie par programme l'état de persistance d'une classe en effectuant une recherche dans le Registre pour la clé « imprimable ».Actuellement, « imprimable » indique la prise en charge d'au moins IPrint; d'autres interfaces peuvent être définies à l'avenir qui sont ensuite disponibles via QueryInterface où IPrint représente simplement le niveau de base de la prise en charge.
Pendant une procédure d'impression, vous pouvez souhaiter que le client ou le conteneur ayant initialisé l'impression pour contrôler si l'impression doit se poursuivre.Par exemple, le conteneur peut prendre en charge une commande « " ARRÊT IMPRESSION " » qui doit terminer le travail d'impression dès que possible.Pour prendre en charge cette fonction, le client d'un objet imprimable peut implémenter un petit objet sink 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 comme fonction de rappel générique de continuation qui remplace les différentes procédures de suite dans l'API Win32 (tel qu' AbortProc pour l'impression et EnumMetafileProc pour l'énumération de métafichier).Ce design de l'interface est utile dans une large gamme de processus longs.
Dans les cas les plus génériques, la fonction d' IContinueCallback::FContinue est appelée périodiquement par tout processus long.L'objet sink retourne S_OK pour continuer l'opération, et S_FALSE pour arrêter la procédure dès que possible.
FContinue, toutefois, n'est pas utilisé dans le contexte d' IPrint::Print; en revanche, l'impression utilise IContinueCallback::FContinuePrint.Tout objet d'impression doit régulièrement appeler FContinuePrinting passant le nombre de pages qui avait imprimé, le numéro de la page est imprimée, et une chaîne supplémentaire qui décrivent l'état d'impression que le client peut sélectionner pour afficher à l'utilisateur (tel que « page 5 à 19 ").