Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Re: impression texte

1 réponse
Avatar
François Picalausa
On May 23, 6:15 pm, "jc2nantes" <jcg4...@freeSPAM.fr> wrote:
> Bonjour,
>
> Voila ce que je cerche =E0 faire...
>
> Ins=E9rer des sauts de ligne dans une chaine de caract=E8res de longueur
> variable.
>
> Au d=E9part j'ai
>
> a$ =3D "abcde lksqfd lqksdied qlkdj dazdd zd kzje zaeazelaze azazazaz=
a"
> par exemple
>
> et je veux obtenir
>
> a$ =3D ""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=E8re=
s et
> que =E7a ne doit pas couper au mileu d'un mot... (on va pas gerer les ces=
ures
> quand meme!!!)
>
> Si vous avez une id=E9e, je prends !!!

Hello,

Pour peu qu'un hdc soit disponible (Printer.hdc, par exemple), ainsi
que des dimensions de la zone =E0 imprimer, une solution simple est
d'utiliser l'API DrawText. Voici un exemple tra=E7ant 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 =3D &H10
Private Const DT_CALCRECT As Long =3D &H400
Private Const DT_EXPANDTABS As Long =3D &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 =3D 10
DrawingZone.left =3D 10
DrawingZone.right =3D Me.ScaleX(Me.ScaleWidth, Me.ScaleMode,
vbPixels) - 10

Text =3D "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=E7ant 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=E7ant les tabulations par
un certain nombre d'espaces)
DrawText Me.hdc, Text, Len(Text), DrawingZone, DT_WORDBREAK Or
DT_EXPANDTABS

'Affiche les d=E9limitations 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 =EAtre adapt=E9 aux polices =E0 taille fixe pour d=E9finir=
la
limitation sur le nombre de colones en utilisant la relation
DrawingZone.right =3D DrawingZone.left + Me.TextWidth(" ") * nbrecol

Pour ce qui est de la m=E9thode propos=E9e par Jean-Marc, pour les polices
proportionelles, il y a, =E0 mon sens, une l=E9g=E8re erreur. Il ne faut pas
employer de "somme des textWidth()", parce que la taille des espaces
(ou de tout autre caract=E8re d'ailleurs) peut varier en fonction des
caract=E8res suivant ou pr=E9c=E9dent l'espace. Utiliser une somme de
TextWidth est donc souvent une mauvaise id=E9e, sauf si la taille est
fixe. Par contre, il est tout =E0 fait possible de calculer un textwidth
=E0 partir du d=E9but de la ligne =E0 afficher, sans plus de sommation.

Fran=E7ois

1 réponse

Avatar
Jean-marc
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/