Lorsqu'on cherche à contrôler ses impressions au lieu
d'utiliser des composants spécialisés,
une question revient régulièrement parmi les
utilisateurs de Delphi:
comment connaître la taille de la page.
Ce n'est que le début : marges, résolution, taille physique,
taille logique, aspect des pixels... l'API
GetDeviceCaps
de Win32 permet
d'obtenir nombre de grandeurs pas toujours claires au
premier abord. Voici leurs relations.
L'API GetDeviceCaps
L'API GetDeviceCaps
sert très généralement à interroger les caractéristiques renvoyées par le pilote d'un périphérique disposant d'une surface de rendu. Son premier paramètre, handle
est le hande Windows de l'imprimante, obtenu depuis la fonction Printer
. Le second identifie la grandeur dont on souhaite obtenir la valeur, comme dans cet exemple:
[...] uses Printers, // Pour la fonction Printer Windows ; // Pour la fonction GetDeviceCaps [...] var resx : Integer ; [...] resx := GetDeviceCaps (Printer.handle, LOGPIXELSX) ;
Elle est utilisable tant avec des périphériques réels (traceur vectoriel, écran bitmap, imprimante bitmap, appareil photo bitmap, flux de caractères (penser au pilote d'impression texte générique)), que virtuels (imprimantes fax ou PDF, métafichier simple ou étendu, ou liste d'affichage).
Pour tous ces périphériques, l'API dispose de multiples paramètres, mais dans le cas de la production de pages par programme, les seuls qui nous concernent sont les diverses dimensions de la page et les résolutions d'impression. Le schéma suivant illustre la relation de toutes ces valeurs.
Les valeurs renvoyées par GetDeviceCaps
- Les valeurs
LOGPIXELSX
etLOGPIXELSY
sont les résolutions horizontale et verticale en pixels par pouce (1 pouce = 25,4 mm). - Les valeurs
HORZRES
etVERTRES
sont les dimensions horizontale et verticale de la zone d'impression utile, en pixels. - Les valeurs
HORZSIZE
etVERTSIZE
sont les dimensions horizontale et verticale de la zone d'impression utile, en millimètres - Les valeurs
PHYSICALHEIGHT
,PHYSICALWIDTH
,PHYSICALOFFSETX
etPHYSICALOFFSETY
sont respectivement les dimensions et les marges haute et gauche de la page, en pixels.
La zone d'impression recouvre en théorie toujours une partie de la surface physique, jusqu'à la recouvrir exactement sur de très rares imprimantes. En pratique, l'expérience montre que certains pilotes, par exemple pour la production de PDF ou de télécopies, ont des surfaces imprimables qui peuvent dépasser la surface "physique" définie par PHYSICAL{WIDTH|HEIGHT}
, avec des marges de droite et du bas qui sont alors négatives, bien que la spécification du SDK Win32 précise que ceci ne doit pas arriver. C'est donc un cas dont la prise en compte est nécessaire.
Les relations entre les résultats de GetDeviceCaps
Les marges du bas et de droite ne sont pas disponibles par cette API, mais peuvent être calculées en soustrayant des dimensions physiques les marges physiques et les dimensions de la zone d'impression.
Certaines valeurs fournies par cette API sont redondantes, et peuvent se recalculer :
HORZRES = round (HORZSIZE * LOGPIXELSX / 25.4) ; VERTRES = round (VERTSIZE * LOGPIXELSY / 25.4) ;