Utilisation des fonctions d`impression Sommaire
Transcription
Utilisation des fonctions d`impression Sommaire
Utilisation des fonctions d’impression Sommaire 1. Introduction 2. Principe de construction d’une édition 2.1. Choix de l’imprimante 2.2. Définitions des paramètres généraux (optionnel) 2.3. Ouverture de l'édition 2.4. Définition des paramètres propres à l’édition (optionnel) 2.5. Création d’une page à éditer 2.5.1. Imprimer un texte simple 2.5.2. Imprimer un texte dans un rectangle en tronquant 2.5.3. Imprimer un texte dans un rectangle avec renvoi à la ligne 2.5.4. Imprimer un texte avec attributs 2.5.5. Impression de graphismes 2.5.6. Impression d'images 2.6. Création d'une nouvelle page 2.7. Terminer l'impression 3. Un exemple 3.1. Création du cadre général 3.2. Impression de la première page 3.3. Impression de la deuxième page 3.4. Fin de l'impression 3.5. Résultats imprimés Page 1 sur 24 Utilisation des fonctions d’impression 1. Introduction Sommaire Panoramic a de superbes possibilités de présentation de données à l’écran, mais manque de possibilités de produire des éditions sur papier. D’ailleurs, la notion d’imprimante est inconnue de Panoramic. Il y a pourtant un moyen de produire de superbes éditions, du simple listage papier, en passant par des pages composées de textes, graphiques et schémas jusqu’à la composition d’album photos. Ceci peut être réalisé par les fonctions d’impression de KGF.dll KGF.dll est une extension pour Panoramic, contenant un vaste choix de fonctions. Elles sont toutes documentées. Néanmoins, le présent tutoriel a l’ambition de guider le Panoramicien à travers la grande variété des fonctions d’impression, du plus simple au plus complexe, afin de servir de guide pour la création d’éditions vraiment professionnelles. KGF.dll peut être téléchargé sur mon WevDav : URL : http://www.mydrive.ch/ username : panoramic@klausgunther password : panoramic123 ou sur mon site internet : URL : http://klauspanoramic.funpic.org/ Onglet: Externes Toutes les fonctions sont amplement documentées, en Français et Anglais. Voici la liste des fichiers disponibles : KGF.dll la DLL elle-même KGF_SUB.bas une enveloppe (wrapper) autour de KGF.dll à l’aide de procédures KGF.chm fichier d’aide en format Windows Help KGF.doc même documentation en format Word KGF.pdf même documentation en format PDF Je ne reviendrai pas ici sur l’utilisation des fonctions DLL qui font l’objet d’autres tutoriels. Mais tous les exemples du présent tutoriel seront donnés en 2 versions : une version utilisant les fonctions de KGF.dll directement, et le même programme utilisant KGF_SUB.bas pour une écriture plus simple et intuitive. Page 2 sur 24 Utilisation des fonctions d’impression 2. Principe de construction d’une édition Sommaire Une édition sous Windows est considérée comme une suite de pages, avec un certain nombre d’attributs valables globalement pour toute l’édition. L’ensemble de l’édition est placée dans le gestionnaire des files d’attente des imprimantes, et elle sera imprimée lorsque l’imprimante sera disponible. Des options dans le gestionnaire des impressions permettent de déterminer, entre autres, si une page peut être imprimée dès qu’elle sera disponible, ou si l’impression ne peut démarrer que lorsque l’édition complète est disponible dans le gestionnaire des files d’attente. Pour créer une édition, il faut passer par les étapes suivantes : a. choix de l’imprimante b. définitions des paramètres généraux (optionnel) c. ouverture de l’édition d. définition des paramètres propres à l’édition (optionnel) e. création d’une page à éditer f. demande de nouvelle page g. création de la page à éditer h. fermeture de l’édition en répétant les étapes f et g autant de fois que nécessaire s’il y a plus d’une seule page. Toutes ces étapes peuvent être réalisées par des fonctions de KGF.dll. Page 3 sur 24 Utilisation des fonctions d’impression 2.1. Choix de l’imprimante Sommaire Les fonctions de gestion des impressions de KGF.dll travaillent avec l’imprimante par défaut de Windows. Il faut donc disposer d’un moyen de changer l’imprimante par défaut, ou de la sélectionner interactivement. Ceci est fait par la fonction SelectWindowsPrinter. Cette fonction ouvre une boite de dialogue Windows présentant toutes les imprimantes installées. Lorsqu’on sélectionne une de ces imprimantes, fonction retourne la valeur 1 ainsi que le nom de l’imprimante, dans une chaîne de caractères. En cas d’abandon de sélection, la fonction retourne 0. KGF.dll : nom$ = string$(255,chr$(32)) res% = DLL_call2("SelectWindowsPrinter",adr(nom$),len(nom$)) nom$ = trim$(nom$) KGF_SUB/bas: SelectWindowsPrinter() Variables résultat: SelectWindowsPrinter = code retour (0 ou 1) SelectWindowsPrinter$ = nom de l’imprimante choisie Exemple de code : KGF.dll : nom$ = string$(255," ") res% = DLL_call2("SelectWindowsPrinter",adr(nom$),len(nom$)) nom$ = trim$(nom$) if res%=0 message "Edition abandonnée . " … end_if KGF_SUB.bas: SelectWindowsPrinter() if SelectWindowsPrinter=0 message "Edition abandonnée . " … end_if Cette fonction sélectionne simplement une imprimante pour la définir comme imprimante par défaut. Elle ne fait rien d'autre. Page 4 sur 24 Utilisation des fonctions d’impression 2.2. Définitions des paramètres généraux (optionnel) Sommaire Dans ce groupe, on trouve les paramètres généraux affectant toutes les éditions à partir de ce moment. Ils doivent être établis avant le début de toute édition, si on veut les utiliser. A ce jour, ceci ne concerne que l'orientation de l'édition: portait ou paysage. Le défaut est portrait. Ce paramètre est géré par la fonction PrinterManager. Ici, on ne décrira que l'aspect "orientation" – la fonction sera discutée en détail plus loin. Par défaut, l'édition est considérée être en mode portrait. KGF.dll : res% = DLL_call4("PrinterManager",4,adr(phnd%),adr(chnd%),orient%) orient%: 0 = portrait 1 = paysage KGF_SUB.bas: PrinterManagerOrientation(orient%) Variables résultat: PrinterManagerOrientation = code retour (1=réussite 0=erreur) Exemple de code : KGF.dll : res% = DLL_call4("PrinterManager",4,adr(phnd%),adr(chnd%),1) if res%=0 message "La mise en paysage a échouée. " … end_if KGF_SUB.bas: PrinterManagerOrientation(1) if PrinterManagerOrientation=0 message "La mise en paysage a échouée. " … end_if Page 5 sur 24 Utilisation des fonctions d’impression 2.3. Ouverture de l'édition Sommaire Avant de pourvoir imprimer quoi que ce soit, il faut ouvrir une édition, un peu comme si l'on ouvrait un fichier, avant d'écrire dedans. Ceci est fait par la fonction PrinterManager: KGF.dll : res% = DLL_call4("PrinterManager",f%,adr(phnd%),adr(chnd%),opt%) 1 = Début impression 2 = Nouvelle page 3 = Fin impression 4 = Orientation définie par opt% 5 = Copies définie par opt% 6 = Titre de l'impression 7 = Annuler la cible à effacer donnée par opt% KGF_SUB.bas: PrinterManagerStartDoc() : ' PrinterManager f%=1 PrinterManagerNewPage() : ' PrinterManager f%=2 PrinterManagerEndDoc() : ' PrinterManager f%=3 PrinterManagerOrientation(opt%) : ' PrinterManager f%=4 PrinterManagerCopies(opt%) : ' PrinterManager f%=5 PrinterManagerTitle(titre$) : ' PrinterManager f%=6 PrinterManagerReset(opt%) : ' PrinterManager f%=7 Donc, pour déclarer l'ouverture de l'édition, on utilise la fonction PrinterManager code 1 ou la procédure PrinterManagerStartDoc(): KGF.dll : res% = DLL_call4("PrinterManager",1,adr(phnd%),adr(chnd%),0) if res%=0 message "L'ouverture de l'édition a échouée. " … end_if KGF_SUB.bas: PrinterManagerStartDoc() if PrinterManagerStartDoc=0 message "L'ouverture de l'édition a échouée. " … end_if Page 6 sur 24 Utilisation des fonctions d’impression 2.4. Définition des paramètres propres à l’édition (optionnel) Sommaire Les paramètres propres à l'édition ouverte sont le nombre de copies et le titre de l'édition. Ce dernier sera utilisé pour identifier l'édition dans le gestionnaire des files d'attentes des imprimantes. Cas du nombre de copies: KGF.dll : res% = DLL_call4("PrinterManager",5,adr(phnd%),adr(chnd%),opt%) KGF_SUB.bas: PrinterManagerCopies(opt%) Variables résultat: PrinterManagerCopies = code retour (1=réussite 0=erreur) Exemple de code : KGF.dll : res% = DLL_call4("PrinterManager",5,adr(phnd%),adr(chnd%),3) if res%=0 message "La demande de 3 copies a échouée. " … end_if KGF_SUB.bas: PrinterManagerTitle("Factures") if PrinterManagerTitle=0 message "La demande de 3 copies a échouée. " … end_if Page 7 sur 24 Utilisation des fonctions d’impression Cas du titre de l'édition: KGF.dll : res% = DLL_call4("PrinterManager",6,adr(phnd%),adr(chnd%),adr(t$)) KGF_SUB.bas: PrinterManagerTitle(t$) Variables résultat: PrinterManagerTitle = code retour (1=réussite 0=erreur) Exemple de code : KGF.dll : T$ = "Factures" res% = DLL_call4("PrinterManager",6,adr(phnd%),adr(chnd%),adr(t$)) if res%=0 message "L'édition des factures a échouée. " … end_if KGF_SUB.bas: PrinterManagerCopies(3) if PrinterManagerCopies=0 message "L'édition des factures a échouée. " … end_if Page 8 sur 24 Utilisation des fonctions d’impression 2.5. Création d’une page à éditer Sommaire Dans cette rubrique, nous trouvons tout ce qui permet de placer quelque chose sur la page actuelle en cours de construction. Ceci concerne du texte, mais également des graphismes, des images, ainsi que tout ce qui est annexe comme choix des couleurs, positionnement dans la page et récupération d'informations sur l'édition. Toutes ces possibilités seront détaillées dans les sections suivantes. Mais il faut bien garder en vue que tout agir sur la page en cours de construction, sans déborder, ni sur la page précédente, ni sur la page suivante. L'impression de texte se fait par la fonction PrinterFunction, dont 3 codes fonction fournissent différentes manières d'imprimer un texte, ainsi que la fonction PrinterPrintText. Chacune de ces possibilités a ses spécificités, et ensemble, elles fournissent un puissant outil de production de texte écrit. L'impression de graphismes se fait par la fonction PrinterFunction. Il s'agit de formes simples: lignes, rectangles et ellipses. L'impression d'images (clip-arts, dessins, photos, icônes) se fait par la fonction PrinterFunction. Textes st graphismes peuvent être imprimés en couleurs. Il y a la notion de couleur avant-plan pour les textes, et arrière-plan pour le fond sur lequel le texte ou le graphisme sera apposé. L'arrière-plan d'un texte ou d'un graphisme peut être transparent ce qui permet de véritables superpositions sans effacer ce qui est en-dessous. Pour les textes, on peut bien sûr choisir police, taille et attributs. Pour les grapismes, on peut faire des remplissages à la manière de 2D_FLOOD de Panoramic, si 'imprimante supporte la fonction de remplissage – sinon, le remplissage est simplement ignoré. Toute action, que ce soit l'impression d'un texte, la production d'un graphisme etc, se produit à l'endroit nommé "position active". Cette position correspond au départ aux coordonnées (0,0, et évolue au fur et à mesure des interventions sur la feuille. Elle est en général positionné là où le dernier pixel d'une opération a été positionné. On peur modifier cette position, separément pour les coordonnées horizontales et verticales, par la fonction PrinterFunction. Et ceci peut être fait par un positionnement absolu en donnant directement la position en pixels, ou en positionnement relatif en donnant des écarts horizontaux et/ou verticaux. Enfin, la fonction PrinterFunction permet de récupérer beaucoup d'informations sur l'imprimante et la page en cours d'élaboration. Ceci donne une maîtrise totale de la mise en page. Je renvoie à la documentation de KGF.dll pour des informations détaillées du passage de paramètres poue ces fonctions. Je voulais juste donner un aperçu des possibilités offertes par ces fonctions de gestion des impressions. Dans ce qui suit, on va explorer quelques-unes de ces possibilités pour produire une page imprimée. Page 9 sur 24 Utilisation des fonctions d’impression Format d'appel de la fonction PrinterFunction: KGF.dll : res% = DLL_call6("PrinterFunction",f%,adr(phnd%),adr(chnd%),opt1%,opt2%,opt3%) 1 = Imprimer un texte avec fond transparent ou opaque 2 = Dessiner une forme à partir de la position active 3 = Remplissage de la forme contenant la position active 4 = Positionner en mode absolu ou relatif 5 = Choisir police, taille et attributs et épaisseur de trait 6 = Choisir couleur avant-plan et arri-re-plan 7 = Imprimer une image à partir d'un fichier BMP, JPG, GIF,ICO, … 8 = Retourner une des mesures physiques de la page 9 = Retourner une des valeurs utiles 10 = Imprimer un texte dans un rectangle en tronquant 11 = Imprimer un texte dans un rectangle avec renvoi à la ligne KGF_SUB.bas: PrinterFunctionText(txt$,opt%) PrinterFunctionForm(forme%,w%,h%,r%) PrinterFunctionFlood(mode%,R%,G%,B%) PrinterFunctionRelativePosition(dx%,dy%) PrinterFunctionAbsolutePosition(x%,y%) PrinterFunctionStyle(pol$,siz%,R%,G%,B%,gras%,ital%,sous%,barr%) PrinterFunctionColor(colorf%,colorb%,penw%) PrinterFunctionImage(nom$,w%,h%) PrinterFunctionGetMetrics(code%) PrinterFunctionGetValues(code%,txt$) PrinterFunctionPrintTextInRectangleTruncate(txt$,larg%,haut%,fond%) PrinterFunctionPrintTextInRectangleWrap(txt$,larg%,haut%,fond%) : ' f%=1 : ' f%=2 : ' f%=3 : ' f%=4 : ' f%=4 : ' f%=5 : ' f%=6 : ' f%=7 : ' f%=8 : ' f%=9 : ' f%=10 : ' f%=11 Format d'appel de la fonction PrinterPrintText: KGF.dll : res%= DLL_call6("PrinterPrintText,",adr(txt$),adr(pol$),adr(attr$),coulsiz%,adr(x%),adr(y%)) KGF_SUB.bas: PrinterPrintText(txt$,pol$,attr$,R%,G%,B%,siz%,x%,y%) Page 10 sur 24 Utilisation des fonctions d’impression 2.5.1. Imprimer un texte simple Sommaire On imprime un texte avec fond transparent ou opaque, à la position active et avec la police et les attributs actuels, par la fonction PrinterFunction code 1: KGF.dll : Text$ = "Mon premier text" Fond%=1 : ' 1 si fond transparent, 0 sinon res% = DLL_call6("PrinterFunction",1,adr(phnd%),adr(chnd%),adr(txt$),len(txt $),fond%) KGF_SUB.bas: Fond%=1 : ' 1 si fond transparent, 0 sinon PrinterFunctionText("Mon premier text",fond%) 2.5.2. Imprimer un texte dans un rectangle en tronquant Sommaire Le texte sera imprimé à l'intérieur d'un rectangle tracé à partir de la position actuelle, avec l'épaisseur du trait actuel, et avec la couleur avant-plan actuel. Le texte sera inscrit dans ce rectangle, et tout ce qui dépasse sera simplement coupé. KGF.dll : Text$ = "Mon deuxième text" Fond%=1 : ' 1 si fond transparent, 0 sinon opt3% = (200*32768+30)*2 + fond% : ' largeur 200, hauteur 30 res% = DLL_call6("PrinterFunction",10,adr(phnd%),adr(chnd%),adr(txt$),len(tx KGF_SUB.bas: Fond%=1 : ' 1 si fond transparent, 0 sinon PrinterFunctionTextInRectangleTruncate ("Mon deuxième text",200,30,fond%) Page 11 sur 24 Utilisation des fonctions d’impression 2.5.3. Imprimer un texte dans un rectangle avec renvoi à la ligne Sommaire Le texte sera imprimé à l'intérieur d'un rectangle tracé à partir de la position actuelle, avec l'épaisseur du trait actuel, et avec la couleur avant-plan actuel. Le texte sera inscrit dans ce rectangle, et la partie des lignes dépassant le rectangle à droite sera renvoyée à la ligne. Tout ce qui dépasse le rectangle en bas sera coupé. KGF.dll : Text$ = "Mon troisième text" Fond%=1 : ' 1 si fond transparent, 0 sinon opt3% = (200*32768+30)*2 + fond% : ' largeur 200, hauteur 30 res% = DLL_call6("PrinterFunction",11,adr(phnd%),adr(chnd%),adr(txt$),len(tx KGF_SUB.bas: Fond%=1 : ' 1 si fond transparent, 0 sinon PrinterFunctionTextInRectangleWrap("Mon troisième text",200,30,fond%) 2.5.4. Imprimer un texte avec attributs Sommaire On peut aussi imprimer un texte (sans cadre) en donnant directement la police, sa taille et ses attributs, la couleur et la position relative ou absolue. Pour cela, on utilise la fonction PrinterPrintText décrite ci-dessus. KGF.dll : Text$ = "Mon quatrième text" Pol$ = "Arial" Attr$ = "BIAxAy" : ' gras, italique, position absolue n x et y coulsiz% = ( (0*256+0)*256+255 )*256 + 16 : ' rouge, taille 16 x% = 400 : y% = 550 : ' position (400,550) res% = DLL_call6("PrinterPrintText",adr(text$),adr(pol$),adr(attr$),coulsiz% ,adr(x%),adr(y%)) KGF_SUB.bas: Text$ = "Mon quatrième text" Pol$ = "Arial" Attr$ = "BIAxAy" : ' gras, italique, position absolue n x et y x% = 400 : y% = 550 : ' position (400,550) PrinterPrintText(text$,"Arial",attr$,255,0,0,16,x%,y%) Page 12 sur 24 Utilisation des fonctions d’impression 2.5.5. Impression de graphismes Sommaire Les graphismes sont des formes géométriques simples, générées directement dans la page. Ce sont des lignes, des rectangles et des ellipses. Pour cela, on utilisa la fonction PrinterFunction code 2. Le dessin s'effectue toujours dans un rectangle englobant la forme choisie. Le coin supérieur haut de ce rectangle est la position actuelle. Dans le cas d'un rectangle, on peut définir un rayon de courbe d'arrondi pour les angles. Le paramètre opt1% choisit la forme à déssiner: 0 = ligne, 1 = rectangle, 2 = ellipse. Les paramètres opt2% et opt3% représentent respectivement la largeur et l'hauteur du rectangle englobant. Dans le cas d'un rectangle, on détermine le rayon de courbure des arrondis d'angle en ajoutant ce rayon multiplié par 256 au paramètre opt1%: opt1% = 1 + rayon%*256. Donc, pour une ligne: KGF.dll : ' on trace une ligne horizontale de 800 pixels res% = DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),0,800,2) KGF_SUB.bas: PrinterFunctionForm(0,800,2,0) Et pour un rectangle: KGF.dll : r% = 30 : ' rayon d'arrondi de 30 pixels f% = 1 + r%*256 : ' fonction "tracer rectangle" arrondi avec rayon 30 res% = DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),f%,400,200) KGF_SUB.bas: PrinterFunctionForm(1,400,200,30) Et pour une ellipse: KGF.dll : res% = DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),2,400,200) KGF_SUB.bas: PrinterFunctionForm(2,400,200,0) Page 13 sur 24 Utilisation des fonctions d’impression 2.5.6. Impression d'images Sommaire Les images sont des graphismes contenus dans un fichier de type BMP, JPG, GIF, ICO etc. Ces fichiers peuvent contenir des dessins, schémas, photos, scans etc. L'impression est faite par la fonction PrinterFunction code 7. On donne le nom du fichier avec son chemin d'accès, ainsi la largeur et la hauteur du rectangle recevant l'image. Cet espace sera dessiné à partir de la position actuelle. L'image sera rétrécie ou agrandie pour s'ajuster au rectangle imposé. KGF.dll : img$ = "C:\test\OaPhoto.jpg" res% = DLL_call6("PrinterFunction",7,adr(phnd%),adr(chnd%),adr(img$),400,200) KGF_SUB.bas: PrinterFunctionImage("C:\test\OaPhoto.jpg",400,200) Page 14 sur 24 Utilisation des fonctions d’impression 2.6. Création d'une nouvelle page Sommaire Lorsqu'une page est complète, on a deux possibilités: soit on passe à la page suivante, soit un termine l'impression. La fin de l'impression est décrite en chapitre 2.7.. Pour passer à une nouvelle page, on utilise la fonction PrinterManager code 2. Ceci clôt la page actuelle et la soumet au gestionnaire des files d'attente des imprimantes, et présente une nouvelle page vide, avec la position active en (0,0). Cette nouvelle page pourra alors être construite comme la précédente, et ainsi de suite. KGF.dll : res% = DLL_call6("PrinterManager",2,adr(phnd%),adr(chnd%),0) KGF_SUB.bas: PrinterManagerNewPage() 2.7. Terminer l'impression Sommaire Pour terminer une édition, on utilise la fonction PrinterManager code 3. La page actuelle sera alors envoyée au gestionnaire des files d'attente des imprimantes, puis on lui signale que l'édition est complète. Enfin, on libère toutes les ressources internes utilisées pour gérer l'impression. KGF.dll : res% = DLL_call6("PrinterManager",3,adr(phnd%),adr(chnd%),0) KGF_SUB.bas: PrinterManagerEndDoc() Page 15 sur 24 Utilisation des fonctions d’impression 3. Un exemple Sommaire Les chapitres précédents étaient destinés à donner un aperçu des possibilités des fonctions de gestion des impressions. Ce n'est pas complet – il y a bien plus de possibilités. Pour des informations exhaustives sur ces fonctions, je renvoie à la documentation de KGF.dll, section "Gestion des impressions". Nous allons maintenant établie, pas à pas, un programme d'édition utilisant quelques-unes des possibilités décrites ci-dessus. Ce programme pourra servir de point de départ pour la réalisations de vos éditions. Page 16 sur 24 Utilisation des fonctions d’impression 3.1. Création du cadre général Sommaire Commençons par créer le cadre général, avec le choix de l'imprimante, l'ouverture de l'impression et la fermeture. L'utilisation du choix de l'imprimante est bien sûr optionnel. Dans le cas d'une seule imprimante, la question ne se pose même pas. Et dans le cas d'imprimantes multiples, si l'on ne souhaite pas de changer d'imprimante par défaut, il n'est pas nécessaire non plus d'appeler cette fonction. Le présent exemple montrera 2 pages, mais ceci est à adapter bien sûr selon les besoins, par une boucle par exemple. KGF.dll : dim nom$, res%, phnd%, chnd% dll_on "KGF.dll" ouvrir_impression() imprimer_page1() imprimer_page2() fermer_impression() end sub ouvrir_impression() nom$ = string$(255," ") res% = DLL_call2("SelectWindowsPrinter",adr(nom$),len(nom$)) nom$ = trim$(nom$) if res%=0 message "Edition abandonnée. " … end_if res% = DLL_call4("PrinterManager",1,adr(phnd%),adr(chnd%),0) if res%=0 message "L'ouverture de l'édition a échouée. " … end_if end_sub sub imprimer_page1() end_sub sub imprimer_page2() end_sub sub fermer_impression() res% = DLL_call4("PrinterManager",3,adr(phnd%),adr(chnd%),0) end_sub Page 17 sur 24 Utilisation des fonctions d’impression KGF_SUB.bas: KGF_initialize("KGF.dll") ouvrir_impression() imprimer_page1() imprimer_page2() fermer_impression() end sub ouvrir_impression() SelectWindowsPrinter() if SelectWindowsPrinter=0 message "Edition abandonnée. " … end_if PrinterManagerStartDoc() if PrinterManagerStartDoc=0 message "L'ouverture de l'édition a échouée. " … end_if end_sub sub imprimer_page1() end_sub sub imprimer_page2() end_sub sub fermer_impression() PrinterManagerEndDoc() end_sub 3.2. Impression de la première page Sommaire Après l'ouverture de l'impression, on dispose d'une page vide, la position actuelle étant fixée à (0,0). Cela correspond au coin en haut à gauche de la partie imprimable de la feuille de papier qui, par défaut, est placé en mode portrait. Avec les imprimantes courantes, cela correspond à une feuille de machine à écrire en format Din A4. Les dimensions en pixels et la taille de la partie imprimable dépendent de la résolution de l'imprimante qui est en général configurable. La fonction PrinterFunction offre le moyen de connaître exactement les dimensions utiles de la page. Ceci permet d'ajuster les positions et dimensions des zones imprimées au contexte spécifique de l'imprimante et de son paramétrage. Pour les besoins ce programme exemple, on va supposer une feuille verticale Din A4, en résolution 300 dpi. Tout ce qui suit est à placer à l'intérieur de la procédure imprimer_page1() du cadre développé ci-dessus. Page 18 sur 24 Utilisation des fonctions d’impression On va commencer par dessiner un cadre noir de 4 pixels d'épaisseur autour de la feuille, puis, on va colorer légèrement l'intérieur: KGF.dll : dim_local r%, f%, c% ' positionner 20 pixels à l'intérieur de la feuille res% = DLL_call6("PrinterFunction",4,adr(phnd%),adr(chnd%),0,20,20) ' épaisseur de trait de 4 pixels res% = DLL_call6("PrinterFunction",6,adr(phnd%),adr(chnd%),0-1,01,10) ' cadre global sous forme de rectangle res%=DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),1,4900,6950) ' remplir par un bleu léger c% = (255*256+200)*256+200 res%=DLL_call6("PrinterFunction",3,adr(phnd%),adr(chnd%),1,c%) KGF_SUB.bas: dim_local r%, f%, c% ' positionner 20 pixels à l'intérieur de la feuille PrinterFunctionAbsolutePosition(20,20) ' épaisseur de trait de 4 pixels PrinterFunctionColor(0-1,0-1,4) ' cadre global sous forme de rectangle PrinterFunctionForm(1,4900,6950,0) ' remplir par un bleu léger c% = (255*256+200)*256+200 PrinterFunctionFlood(1,200,200,255) On va imprimer un texte en position (1000,500), couleur rouge, police Arial, taille 18, en gras et italique: KGF.dll : ' imprimer un texte en (1000,500), rouge, Arial, 18, gras, italique: dim_local text$, pol$, attr$, coulsiz%, x%, y% text$ = "Ceci est un exemple de gestion des impressions." pol$ = "Arial" attr$ = "BIAxAy" : ' gras, italique, position absolue n x et y coulsiz% = ( (0*256+0)*256+255 )*256 + 16 : ' rouge, taille 16 x% = 1000 : y% = 500 : ' position (1000,500) res% = DLL_call6("PrinterPrintText",adr(text$),adr(pol$),adr(attr$),coulsiz%, adr(x%),adr(y%)) KGF_SUB.bas: ' imprimer un texte en (1000,500), rouge, Arial, 18, gras, italique: dim_local text$, pol$, attr$ text$ = "Ceci est un exemple de gestion des impressions." pol$ = "Arial" attr$ = "BIAxAy" : ' gras, italique, position absolue n x et y PrinterPrintText(text$,pol$,attr$,255,0,0,16,1000,500) Page 19 sur 24 Utilisation des fonctions d’impression On va ajouter un cercle bleu de 200 pixels de rayon, centre (2000,500), avec une épaisseur de trait de 20 pixels, puis un cercle bleu de 200 pixels de rayon, centre (3000,500), avec une épaisseur de trait de 40 pixels: KGF.dll : ' cercle bleu, 200 pixels de rayon, centre (2000,500), ' épaisseur 20 pixels: ' positionner en (1000-200,500-200) res% = DLL_call6("PrinterFunction",4,adr(phnd%),adr(chnd%),0,1800,300) ' couleur bleur, épaisseur de trait de 20 pixels c% = (255*256+0)*256+0 res% = DLL_call6("PrinterFunction",6,adr(phnd%),adr(chnd%),c%,01,20) ' cercle de 200 pixels de rayon res%=DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),2,400,400) ' cercle bleu, 200 pixels de rayon, centre (3000,500), ' épaisseur 40 pixels, fond transparent ' positionner en (1000-200,500-200) res% = DLL_call6("PrinterFunction",4,adr(phnd%),adr(chnd%),0,2800,300) ' couleur bleur, épaisseur de trait de 40 pixels c% = (255*256+0)*256+0 res% = DLL_call6("PrinterFunction",6,adr(phnd%),adr(chnd%),c%,02,40) ' cercle de 200 pixels de rayon res%=DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),2,400,400) KGF_SUB.bas: ' cercle bleu, 200 pixels de rayon, centre (2000,500), ' épaisseur 20 pixels: ' positionner en (2000-200,500-200) PrinterFunctionAbsolutePosition(1800,300) ' couleur bleur, épaisseur de trait de 20 pixels c% = (255*256+0)*256+0 PrinterFunctionColor(c%,0-1,20) ' cercle de 200 pixels de rayon PrinterFunctionForm(2,400,400,0) ' cercle bleu, 200 pixels de rayon, centre (3000,500), ' épaisseur 40 pixels, fond transparent ' positionner en (3000-200,500-200) PrinterFunctionAbsolutePosition(2800,300) ' couleur bleur, épaisseur de trait de 40 pixels c% = (255*256+0)*256+0 PrinterFunctionColor(c%,0-2,40) ' cercle de 200 pixels de rayon PrinterFunctionForm(2,400,400,0) Page 20 sur 24 Utilisation des fonctions d’impression Et pour finir la première page, on va imprimer un texte noir dans un rectangle noir d'épaisseur de trait de 1 pixel, avec des coins arrondis, et renvoi à la ligne: KGF.dll : ' texte noir dans rectangle noir épaisseur de trait de 1 pixel, ' coins arrondis rayon 40, et renvoi à la ligne: ' positionner en (2000,1000) res% = DLL_call6("PrinterFunction",4,adr(phnd%),adr(chnd%),0,2000,1000) ' couleur noir, épmisseur de trait 1 res% = DLL_call6("PrinterFunction",6,adr(phnd%),adr(chnd%),0,0-1,5) ' écrire le texte dans un rectangle de de 1000x500 pixels txt$ = " Cette phrase sera imprimée avec un renvoi automatique à la ligne?" c% = (2000*32768 + 1000)*2 + 1 res% = DLL_call6("PrinterFunction",11,adr(phnd%),adr(chnd%),adr(txt$),len(txt $),c%) ' tracer le rectangle de 2000x500 res%=DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),1,2000,500) KGF_SUB.bas: ' texte noir dans rectangle noir épaisseur de trait de 1 pixel, ' coins arrondis rayon 40, et renvoi à la ligne: ' positionner en (2000,1000) PrinterFunctionAbsolutePosition(2000,1000) ' couleur noir, épmisseur de trait 1 PrinterFunctionColor(0,0-1,1) ' écrire le texte dans un rectangle de de 1000x500 pixels txt$ = " Cette phrase sera imprimée avec un renvoi automatique à la ligne?" PrinterFunctionPrintTextInRectangleWrap(txt$,2000,1000,1) ' tracer le rectangle de 2000x500 PrinterFunctionForm(1,2000,1000,0) Voilà, la première page est terminée. Les différentes parties de code présentées dans cette section sont à copier dans la procedure imprimer_page1(), les unes après les autres. On va procéder à l'éjection de la page dans le traitement de la deuxième page. Page 21 sur 24 Utilisation des fonctions d’impression 3.3. Impression de la deuxième page Sommaire Tout ce qui suit, sera à copier dans la procédure imprimer_page2(). Nous allons commencer par éjecter la page 1 et produire ainsi une nouvelle page blanche sur laquelle nous allons construire la deuxième page: KGF.dll : ' éjecter la page et préparer une nouvelle page res% = DLL_call4("PrinterManager",2,adr(phnd%),adr(chnd%),0) KGF_SUB.bas: ' éjecter la page et préparer une nouvelle page PrinterManagerNewPage() Maintenant, nous allons placer deux fois le texte en rectangle de la première page, côte à côte. Le premier texte sera ajusté dans un carré de 1000x1000 pixels: KGF.dll : dim_local txt$, c% ' texte noir dans rectangle noir épaisseur de trait de 1 pixel, ' coins arrondis rayon 40, et renvoi à la ligne: ' positionner en (1000,1000) res% = DLL_call6("PrinterFunction",4,adr(phnd%),adr(chnd%),0,1000,1000) ' couleur noir, épmisseur de trait 1 res% = DLL_call6("PrinterFunction",6,adr(phnd%),adr(chnd%),0,0-1,5) ' écrire le texte dans un rectangle de de 1000x1000 pixels txt$ = " Cette phrase sera imprimée avec un renvoi automatique à la ligne?" c% = (1000*32768 + 1000)*2 + 1 res% = DLL_call6("PrinterFunction",11,adr(phnd%),adr(chnd%),adr(txt$),len(txt $),c%) ' tracer le rectangle de 1000x1000 res%=DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),1,1000,1000) KGF_SUB.bas: ' texte noir dans rectangle noir épaisseur de trait de 1 pixel, ' coins arrondis rayon 40, et renvoi à la ligne: ' positionner en (1000,1000) PrinterFunctionAbsolutePosition(1000,1000) ' couleur noir, épmisseur de trait 1 PrinterFunctionColor(0,0-1,1) ' écrire le texte dans un rectangle de de 1000x1000 pixels txt$ = " Cette phrase sera imprimée avec un renvoi automatique à la ligne?" PrinterFunctionPrintTextInRectangleWrap(txt$,1000,1000,1) ' tracer le rectangle de 2000x500 PrinterFunctionForm(1,1000,1000,0) Page 22 sur 24 Utilisation des fonctions d’impression Le second texte sera présentée de façon identique à celle de la première page, placé à droite du rectange qui vient d'être écrit: KGF.dll : ' texte noir dans rectangle noir épaisseur de trait de 1 pixel, ' coins arrondis rayon 40, et renvoi à la ligne: ' positionner en (2200,1000) res% = DLL_call6("PrinterFunction",4,adr(phnd%),adr(chnd%),0,2200,1000) ' couleur noir, épaisseur de trait 1 res% = DLL_call6("PrinterFunction",6,adr(phnd%),adr(chnd%),0,0-1,5) ' écrire le texte dans un rectangle de de 1000x500 pixels txt$ = " Cette phrase sera imprimée avec un renvoi automatique à la ligne?" c% = (2000*32768 + 1000)*2 + 1 res% = DLL_call6("PrinterFunction",11,adr(phnd%),adr(chnd%),adr(txt$),len(txt $),c%) ' tracer le rectangle de 2000x500 res%=DLL_call6("PrinterFunction",2,adr(phnd%),adr(chnd%),1,2000,500) KGF_SUB.bas: ' texte noir dans rectangle noir épaisseur de trait de 1 pixel, ' coins arrondis rayon 40, et renvoi à la ligne: ' positionner en (2200,1000) PrinterFunctionAbsolutePosition(2200,1000) ' couleur noir, épisseur de trait 1 PrinterFunctionColor(0,0-1,1) ' écrire le texte dans un rectangle de de 1000x500 pixels txt$ = " Cette phrase sera imprimée avec un renvoi automatique à la ligne?" PrinterFunctionPrintTextInRectangleWrap(txt$,2000,1000,1) ' tracer le rectangle de 2000x500 PrinterFunctionForm(1,2000,1000,0) Voilà, la seconde page est terminée. Les différentes parties de code présentées dans cette section sont à copier dans la procedure imprimer_page2(), les unes après les autres. La page sera éjectée automatiquement lors de la fermeture de l'édition. Page 23 sur 24 Utilisation des fonctions d’impression 3.4. Fin de l'impression Sommaire Notre édition est maintenant complète. Il faut maintenant informer le gestionnaire des files d'attente que l'impression est finie. Ceci est fait par la fonction PrinterManager code 3. La page actuelle est automatiquement éjectée, c'est pourquoi il ne faut pas appeler PrinterManager avec le code 2 pour nouvelle page, car sinon, on obtiendrait une page blanche en fin d'édition. Nous avons déjà établi ce code dans le cadre du programme, en section 3.1. 3.5. Résultats imprimés Sommaire Page 1: Page 2: Page 24 sur 24