Re: impression texte

Le
François Picalausa
On May 23, 6:15 pm, "jc2nantes" <jcg4@freeSPAM.fr> wrote:
> Bonjour,
>
> Voila ce que je cerche à faire
>
> Insérer des sauts de ligne dans une chaine de caractères de longueur
> variable.
>
> Au départ j'ai
>
> a$ = "abcde lksqfd lqksdied qlkdj dazdd zd kzje zaeazelaze azazazaz=
a"
> par exemple
>
> et je veux obtenir
>
> a$ = ""abcde lksqfd lqksdied" & Chr(13) & "qlkdj dazdd zd kzje
> zaeazelaze" & Chr(13) & "azazazaza"
>
> sachant que chaque portion de la chaine ne doit pas exceder X caractère=
s et
> que ça ne doit pas couper au mileu d'un mot (on va pas gerer les ces=
ures
> quand meme!!!)
>
> Si vous avez une idée, je prends !!!

Hello,

Pour peu qu'un hdc soit disponible (Printer.hdc, par exemple), ainsi
que des dimensions de la zone à imprimer, une solution simple est
d'utiliser l'API DrawText. Voici un exemple traçant du texte sur une
form:
Private Type RECT
left As Long
top As Long
right As Long
bottom As Long
End Type

Private Declare Function DrawText Lib "User32" Alias
"DrawTextA" (ByVal hdc As Long, _
ByVal lpString As String, ByVal nCount As Long, _
lpRect As RECT, ByVal uFormat As Long) As Long

Private Declare Function Rectangle Lib "Gdi32" (ByVal hdc As Long, _
ByVal nLeftRect As Long, ByVal nTopRect As Long, _
ByVal nRightRect As Long, ByVal nBottomRect As Long) As Long

Private Const DT_WORDBREAK As Long = &H10
Private Const DT_CALCRECT As Long = &H400
Private Const DT_EXPANDTABS As Long = &H40

Private Sub Form_Paint()
Dim Text As String
Dim DrawingZone As RECT

'toute la feuille avec une bordure de 10 pixels au dessus et sur
les cotes
DrawingZone.top = 10
DrawingZone.left = 10
DrawingZone.right = Me.ScaleX(Me.ScaleWidth, Me.ScaleMode,
vbPixels) - 10

Text = "Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur
aut odit aut fugit, sed quia consequuntur magni dolores eos, qui
ratione voluptatem sequi nesciunt, neque porro quisquam est, qui
dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed
quia non numquam eius modi tempora incidunt, ut labore et dolore
magnam aliquam quaerat voluptatem"

'Calcule la taille a afficher (en coupant les mots et en
remplaçant les tabulations par un certain nombre d'espaces)
DrawText Me.hdc, Text, Len(Text), DrawingZone, DT_CALCRECT Or
DT_WORDBREAK Or DT_EXPANDTABS

'Affiche (en coupant les mots et en remplaçant les tabulations par
un certain nombre d'espaces)
DrawText Me.hdc, Text, Len(Text), DrawingZone, DT_WORDBREAK Or
DT_EXPANDTABS

'Affiche les délimitations de la zone de tracage
Rectangle Me.hdc, DrawingZone.left, DrawingZone.top,
DrawingZone.right, DrawingZone.bottom
End Sub

Private Sub Form_Resize()
'Met a jour l'affichage au redimensionnement
Me.Refresh
End Sub

Cet exemple peut être adapté aux polices à taille fixe pour définir=
la
limitation sur le nombre de colones en utilisant la relation
DrawingZone.right = DrawingZone.left + Me.TextWidth(" ") * nbrecol

Pour ce qui est de la méthode proposée par Jean-Marc, pour les polices
proportionelles, il y a, à mon sens, une légère erreur. Il ne faut pas
employer de "somme des textWidth()", parce que la taille des espaces
(ou de tout autre caractère d'ailleurs) peut varier en fonction des
caractères suivant ou précédent l'espace. Utiliser une somme de
TextWidth est donc souvent une mauvaise idée, sauf si la taille est
fixe. Par contre, il est tout à fait possible de calculer un textwidth
à partir du début de la ligne à afficher, sans plus de sommation.

François
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-marc
Le #15404641
François Picalausa wrote:
Hello,

Pour peu qu'un hdc soit disponible (Printer.hdc, par exemple), ainsi
que des dimensions de la zone à imprimer, une solution simple est
d'utiliser l'API DrawText. Voici un exemple traçant du texte sur une
form:



<snip>

Cet exemple peut être adapté aux polices à taille fixe pour définir la
limitation sur le nombre de colones en utilisant la relation
DrawingZone.right = DrawingZone.left + Me.TextWidth(" ") * nbrecol



Jolie utilisation de DrawText pour le faire graphiquement !


Pour ce qui est de la méthode proposée par Jean-Marc, pour les polices
proportionelles, il y a, à mon sens, une légère erreur. Il ne faut pas
employer de "somme des textWidth()", parce que la taille des espaces
(ou de tout autre caractère d'ailleurs) peut varier en fonction des
caractères suivant ou précédent l'espace. Utiliser une somme de
TextWidth est donc souvent une mauvaise idée, sauf si la taille est
fixe. Par contre, il est tout à fait possible de calculer un textwidth
à partir du début de la ligne à afficher, sans plus de sommation.



Tout à fait juste. j'ai voulu faire concis, j'ai fait .. Faux !

Tu as bien sur raison. Il faut itérativement calculer le textWidth obtenu
en ajoutant chaque mot, jusqu'au seuil critique. On insére ensuite les
espaces entre mots en controlant à chaque étape avec textWidth.


Merci d'avoir ainsi rectifié ma (trop rapide!) prose !


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Publicité
Poster une réponse
Anonyme