Imprimer label sur plusieurs lignes

[Résolu]
Signaler
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008
-
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
-
bonjour à tous,

J'ai une picturebox qui contient plusieurs contrôls: labels, lignes, shapes,...
quand j'imprime ma picturebox, les contrôls n'apparaissent pas ce qui est tout à fait normal.

J'ai donc deux options pour imprimer un à un mes controls:
   - utiliser printer.line, printer.print
   - utiliser picture1.line, picture1.print

Seulement, dans les deux cas, les textes s'impriment sur une seule ligne alors que les textes qui sont dans mes labels sont sur plusieurs lignes (et les sauts de ligne sont donc géré automatiquement).

Y a-t-il une méthode toute faite ou est-ce que je dois bidouiller pour sauter moi-même les lignes?
Je préfèrerais la première solution car les paramètres des labels sont tous différents (longueur de la zone, largeur de la zone, taille de police du texte, nombre de caractère du texte)

Merci d'avance pour votre aide

6 réponses

Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
voir API DrawText plutot que la methode Print
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008

Slt,

merci pour ton aide.
J'ai essayé de l'utiliser mais ça ne marche pas, rien n'apparait dans ma picturebox. Peux-tu me dire ou je me suis planté?
(Je suis allé voir dans www.vbfrance.com/codes/API-DRAWTEXT-EXPLICATIONS-EXEMPLE_2781.aspx)

'Dans un module

Public Type RECT
  Left As Long
  Top As Long
  Right As Long
  Bottom As Long
End Type
Public Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Public Const DT_BOTTOM = &H8
Public Const DT_CALCRECT = &H400
Public Const DT_CENTER = &H1
Public Const DT_EXPANDTABS = &H40
Public Const DT_EXTERNALLEADING = &H200
Public Const DT_LEFT = &H0
Public Const DT_NOCLIP = &H100
Public Const DT_NOPREFIX = &H800
Public Const DT_RIGHT = &H2
Public Const DT_SINGLELINE = &H20
Public Const DT_TABSTOP = &H80
Public Const DT_TOP = &H0
Public Const DT_VCENTER = &H4
Public Const DT_WORDBREAK = &H10

'Dans ma form
      Dim R As RECT
      Dim Ret As Long

      picture2.autoRedraw = true
      R.Bottom = Label1(i).Top + Label1(i).Height
      R.Left = Label1(i).Left
      R.Top = Label1(i).Top
      R.Right = Label1(i).Left + Label1(i).Width
      Ret = DrawText(Me.Picture2.hdc, Label1(i).Caption, Len(Label1(i).Caption), R, DT_TOP + DT_CENTER)
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
utile de conserver les labels, si, plus pro, tu utilises DrawText ?

DT_TOP + DT_CENTER
ne JAMAIS utiliser +, mais bien Or:
DT_TOP Or DT_CENTER

Ret n'est pas testé ? alors n'ajoute pas cette variable.

Len(Label1(i).Caption)
pas obligatoire, tu peux mettre -1 (lire doc sur cette API)

les APIs fonctionnent en pixels, pour les coordonnées, change le ScaleMode de ta Form, ca roulera..

ajoute enfin un Picture2.Refresh...

au final, j'ai corrigé, et ca me donne le code ci-dessous:
Private Sub Command1_Click()
Dim tR As RECT
Dim oLbl As Label

Picture2.AutoRedraw = True
For Each oLbl In Label1
With tR
.Left = oLbl.Left
.Top = oLbl.Top
.Bottom = .Top + oLbl.Height
.Right = .Left + oLbl.Width
End With
DrawText Picture2.hdc, oLbl.Caption, -1, tR, DT_TOP Or DT_CENTER Or DT_WORDBREAK
Next oLbl
Picture2.Refresh
End Sub
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008

C'est bon j'ai trouvé, il faut mettre en pixel et non twip

Maintenant le texte s'affiche bien, mais pas sur plusieurs lignes. Pourquoi ?
Messages postés
33
Date d'inscription
mercredi 4 juillet 2007
Statut
Membre
Dernière intervention
19 août 2008

Autant pour moi, cela marche parfaitement, j'avais pas mis DT_WORDBREAK.

Je te remercie beaucoup de m'avoir indiqué cette API.
A+
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
69
bien que tu ais trouvé seul...

je te préparais une réponse, que je vais te filer tout de même