Imprimer correctement même lorsque printer.fonttransparent bugge...

Description

Lorsqu'on veut imprimer une feuille sur laquelle on a tracé, par exemple, un cadre de couleur et qu'on y a écrit dedans, il arrive que les espaces entre les caractères du texte ne laissent pas apparaître ce qui se trouve à l'arrière-plan (voir capture).

Même si cela marche à l'écran et même si l'on a bien paramétré la propriété Printer.FontTransparent à True, le texte s'inscrit parfois dans un cadre au sein du cadre de couleur. D'après Microsoft, le changement de cette propriété reste sans effet sur Windows 95/98/Me : http://support.microsof.com/default.aspx?scid=kb;en-us;145726 (merci à Christian qui m'a tutoyé dans le forum).

Pour pallier ce problème, Microsoft préconise, juste avant le Printer.Print "Tata", l'utilisation de l'API SetBkMode chaque fois que l'on modifie les paramètres de l'imprimante.

Source / Exemple :


'DECLARATION DE L'API
'====================
'Cette fonction définit le mode d'arrière-plan pour l'affichage de texte ou de lignes.
'La valeur renvoyée, de type integer, est l'ancien mode utilisé ou zéro si l'opération échoue.
'hdc correspond au handle du contexte de périphérique dans lequel le mode d'arrière-pla pour le
'    tracé de texte ou de ligne est modifié.
'nBkMode est l'identificateurs (OPAQUE ou TRANSPARENT) spécifiant le mode d'arrière-plan pour le
'    tracé de texte ou de lignes.

Private Declare Function SetBkMode Lib "gdi32" (ByVal hdc As Long, ByVal nBkMode As Long) As Long

Private iBKMode As Integer

Private Const TRANSPARENT = 1
Private Const OPAQUE = 2

Dim Texte As String

'(...)

Private Sub ImprimerAvecAPI(Destination As Object)

    Destination.Line (0, 0)-(Destination.ScaleWidth, 1200), vbYellow, BF
    
    Destination.CurrentY = 20
    
    Destination.FontTransparent = True
    Texte = "destination.FontTransparent  = " & Destination.FontTransparent
    Destination.CurrentX = (Destination.ScaleWidth - Destination.TextWidth(Texte)) / 2
    
    'Voici la ligne de code que Microsoft préconise pour régler le problème
    iBKMode = SetBkMode(Destination.hdc, TRANSPARENT)
    
    Destination.Print Texte
    
    Destination.Print ""
    
    Destination.CurrentX = 15
    Texte = "Par contre avec l'API SetBkMode, cela marche aussi bien à l'écran que sur l'imprimante.  Imprimez et vous verrez..."
    Destination.Print Texte
    
    Destination.Print ""
    
    Destination.FontTransparent = False
    Texte = "destination.FontTransparent  = " & Destination.FontTransparent
    Destination.CurrentX = (Destination.ScaleWidth - Destination.TextWidth(Texte)) / 2
    
    'J'obtiens le même résultat que j'active ou non la ligne de code suivante ;
    'mais il n'en est peut-être pas de même sur toute les imprimantes...
    'iBKMode = SetBkMode(destination.hdc, OPAQUE)
    
    Destination.Print Texte
    
    If TypeOf Destination Is Printer Then Destination.EndDoc: MsgBox "Impression lancée..."

End Sub

Conclusion :


AUTRE EXEMPLE D'UTILISATION : voir ma source "Imprimer du texte qui tourne" n°7945 que j'ai mise à jour avec cette fontion

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.