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

Documents pareils