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

Objet Label en mode "Autosize"

11 réponses
Avatar
Eric F.
Bonjour,
J'ai une application VB6 qui fait défiler un par un des caractères d'une
police donnée sur un objet "Label". Le label a sa propriété Autosize validée
pour que le fond coloré de ce label encadre parfaitement le caractère
affiché.
Un problème apparaît sur certains caractères de police Italic: les
dimensions du label sont plus petites que la largeur réelle du caractère !!
Comment puis-je déterminer la largeur réelle du caractère à afficher afin de
faire correspondre exactement les dimensions du "Label" ?
Merci d'avance pour votre aide.
Eric F.

10 réponses

1 2
Avatar
LE TROLL
Bonjour,

Peut être en écrivant avec Print ???

------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Eric F." a écrit dans le message de news:

| Bonjour,
| J'ai une application VB6 qui fait défiler un par un des caractères d'une
| police donnée sur un objet "Label". Le label a sa propriété Autosize
validée
| pour que le fond coloré de ce label encadre parfaitement le caractère
| affiché.
| Un problème apparaît sur certains caractères de police Italic: les
| dimensions du label sont plus petites que la largeur réelle du caractère
!!
| Comment puis-je déterminer la largeur réelle du caractère à afficher afin
de
| faire correspondre exactement les dimensions du "Label" ?
| Merci d'avance pour votre aide.
| Eric F.
Avatar
Eric F.
Merci Letroll pour ta réponse, mais cela ne résoud, malheureusement, pas le
problème.
La taille retournée pourtant à travers l'objet Font et la méthode
TextWidth(), est toujours erronée pour certain caractère italic. Ceci est
flagrant pour le caractère "Florin". Le coin bas gauche et haut droit ne sont
pas couvert par le fond du label...

"LE TROLL" a écrit :

Bonjour,

Peut être en écrivant avec Print ???

------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Eric F." a écrit dans le message de news:

| Bonjour,
| J'ai une application VB6 qui fait défiler un par un des caractères d'une
| police donnée sur un objet "Label". Le label a sa propriété Autosize
validée
| pour que le fond coloré de ce label encadre parfaitement le caractère
| affiché.
| Un problème apparaît sur certains caractères de police Italic: les
| dimensions du label sont plus petites que la largeur réelle du caractère
!!
| Comment puis-je déterminer la largeur réelle du caractère à afficher afin
de
| faire correspondre exactement les dimensions du "Label" ?
| Merci d'avance pour votre aide.
| Eric F.





Avatar
Jacques93
Bonjour Eric F.
Eric F. a écrit :
Bonjour,
J'ai une application VB6 qui fait défiler un par un des caractères d'une
police donnée sur un objet "Label". Le label a sa propriété Autosize validée
pour que le fond coloré de ce label encadre parfaitement le caractère
affiché.
Un problème apparaît sur certains caractères de police Italic: les
dimensions du label sont plus petites que la largeur réelle du caractère !!
Comment puis-je déterminer la largeur réelle du caractère à afficher afin de
faire correspondre exactement les dimensions du "Label" ?
Merci d'avance pour votre aide.
Eric F.



Il semble en effet que la propriété AutoSize ne tienne pas compte de
l'attribut 'Italique', pas plus que l'API 'GetTextExtentPoint32' :

<http://msdn.microsoft.com/en-us/library/ms534223(VS.85).aspx>

en tout cas pour la largeur. Pour obtenir la valeur correcte il faut
utiliser 'GetCharABCWidths' :

<http://msdn.microsoft.com/en-us/library/ms534215(VS.85).aspx>

Dans les 2 cas il faut passer en paramètre un Device Context (hDC), d'où
la nécessité d'une PictureBox (qui peut être non visible).

J' ai essayé ceci qui semble marcher :

Option Explicit

Private Type Size
cx As Long
cy As Long
End Type

Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias _
"GetTextExtentPoint32A" ( _
ByVal hdc As Long, _
ByVal lpsz As String, _
ByVal cbString As Long, _
lpSize As Size) As Long

Private Type ABC
abcA As Long
abcB As Long
abcC As Long
End Type

Private Declare Function GetCharABCWidths Lib "gdi32" Alias _
"GetCharABCWidthsA" ( _
ByVal hdc As Long, _
ByVal uFirstChar As Long, _
ByVal uLastChar As Long, _
lpabc As ABC) As Long


Private Sub Command1_Click()
Dim sz As Size
Dim abcVB As ABC

GetTextExtentPoint32 Me.Picture1.hdc, Label1.Caption, 1, sz
GetCharABCWidths Me.Picture1.hdc, _
Asc(Label1.Caption), _
Asc(Label1.Caption), abcVB
Me.Label1.Height = sz.cy * Screen.TwipsPerPixelY
Me.Label1.Width = abcVB.abcB * Screen.TwipsPerPixelX
End Sub

Private Sub Form_Load()
With Me.Label1
.AutoSize = False
.Font = "Symbol"
.FontSize = 16
.FontItalic = True
.Caption = Chr$(166)
.BackColor = vbYellow
End With
With Me.Picture1
.Font = "Symbol"
.FontSize = 16
.FontItalic = True
.Visible = False
End With
End Sub

--

Cordialement,

Jacques.
Avatar
LE TROLL
Bonjour,

Ah ben, tu viens souvent, on vois tu tu es intéressé par ta quesstion,
ça fait toujours plaisir...

Pour moi ça marche très bien , voir code, sauf que "Florin", je n'ai
pas, alors c'est une police peut être rajoutée, ça peut venir de là ?

La méthode Print fonctionne aussi très bien, il suffit de s'arranger
pour ne rien mettre à sa droite qui puisse déranger l'affichage le plus gros
(voir code). Mais de toute façon, tu ne vas pas mettre un objet à la droite
du label, ça ferait louche un objet qui bouge tout seul :o)

Sinon, avec print, je crois qu'il existe une API qui écrit et calcule la
taille, ce qui permet de connaître la position après le texte, donc sa
longueur, sinon il te faut étalonner, mais je ne me souviens plus de son nom
(à l'API), et je ne sais pas m'en servir, peut être ici quelqu'un te dira ?

' TestLabel : test texte label form1 : OBJETS = 1 = LABEL1
Sub Form_Activate()
Form1.AutoRedraw = True
Form1.ScaleMode = vbPixels
FontName = "courier new"
FontSize = 72
FontItalic = True
Form1.ForeColor = &HFF& ' rouge
CurrentX = 234
CurrentY = 99
'Print "Salut"
Print "Salut"
'
Label1.Alignment = 2 ' center
Label1.AutoSize = True
Label1.Appearance = 0 ' flat
Label1.BorderStyle = 0 ' non
Label1.FontName = "courier new"
Label1.FontSize = 72
Label1.FontItalic = True
Label1.ForeColor = &HFF& ' rouge
Label1.Left = 30
Label1.Top = 250
Label1.Caption = "Bonjour"
End Sub


------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Eric F." a écrit dans le message de news:

| Merci Letroll pour ta réponse, mais cela ne résoud, malheureusement, pas
le
| problème.
| La taille retournée pourtant à travers l'objet Font et la méthode
| TextWidth(), est toujours erronée pour certain caractère italic. Ceci est
| flagrant pour le caractère "Florin". Le coin bas gauche et haut droit ne
sont
| pas couvert par le fond du label...
|
| "LE TROLL" a écrit :
|
| > Bonjour,
| >
| > Peut être en écrivant avec Print ???
| >
| > ------
| > Romans, logiciels, email, site personnel
| > http://irolog.free.fr/joe.htm
|
> ------------------------------------------------------------------------------------
| > "Eric F." a écrit dans le message de
news:
| >
| > | Bonjour,
| > | J'ai une application VB6 qui fait défiler un par un des caractères
d'une
| > | police donnée sur un objet "Label". Le label a sa propriété Autosize
| > validée
| > | pour que le fond coloré de ce label encadre parfaitement le caractère
| > | affiché.
| > | Un problème apparaît sur certains caractères de police Italic: les
| > | dimensions du label sont plus petites que la largeur réelle du
caractère
| > !!
| > | Comment puis-je déterminer la largeur réelle du caractère à afficher
afin
| > de
| > | faire correspondre exactement les dimensions du "Label" ?
| > | Merci d'avance pour votre aide.
| > | Eric F.
| >
| >
| >
Avatar
LE TROLL
Bonjour Jacques :o)

Ben moi je viens d'essayer, avec l'Italique ça marche très bien, enfin
la police que j'ai prise, vois ce code :

' TestLabel : test texte label form1 : OBJETS = 1 = LABEL1
Sub Form_Activate()
Form1.AutoRedraw = True
Form1.ScaleMode = vbPixels
FontName = "courier new"
FontSize = 72
FontItalic = True
Form1.ForeColor = &HFF& ' rouge
CurrentX = 234
CurrentY = 99
Print "Salut"
'
Label1.Alignment = 2 ' center
Label1.AutoSize = True
Label1.Appearance = 0 ' flat
Label1.BorderStyle = 0 ' non
Label1.FontName = "courier new"
Label1.FontSize = 72
Label1.FontItalic = True
Label1.ForeColor = &HFF& ' rouge
Label1.Left = 30
Label1.Top = 250
Label1.Caption = "Bonjour"
End Sub

--
Merci beaucoup, au revoir et à bientôt :o)
------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:
OHDkKf$
| Bonjour Eric F.
| Eric F. a écrit :
| > Bonjour,
| > J'ai une application VB6 qui fait défiler un par un des caractères d'une
| > police donnée sur un objet "Label". Le label a sa propriété Autosize
validée
| > pour que le fond coloré de ce label encadre parfaitement le caractère
| > affiché.
| > Un problème apparaît sur certains caractères de police Italic: les
| > dimensions du label sont plus petites que la largeur réelle du caractère
!!
| > Comment puis-je déterminer la largeur réelle du caractère à afficher
afin de
| > faire correspondre exactement les dimensions du "Label" ?
| > Merci d'avance pour votre aide.
| > Eric F.
|
| Il semble en effet que la propriété AutoSize ne tienne pas compte de
| l'attribut 'Italique', pas plus que l'API 'GetTextExtentPoint32' :
|
| <http://msdn.microsoft.com/en-us/library/ms534223(VS.85).aspx>
|
| en tout cas pour la largeur. Pour obtenir la valeur correcte il faut
| utiliser 'GetCharABCWidths' :
|
| <http://msdn.microsoft.com/en-us/library/ms534215(VS.85).aspx>
|
| Dans les 2 cas il faut passer en paramètre un Device Context (hDC), d'où
| la nécessité d'une PictureBox (qui peut être non visible).
|
| J' ai essayé ceci qui semble marcher :
|
| Option Explicit
|
| Private Type Size
| cx As Long
| cy As Long
| End Type
|
| Private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias _
| "GetTextExtentPoint32A" ( _
| ByVal hdc As Long, _
| ByVal lpsz As String, _
| ByVal cbString As Long, _
| lpSize As Size) As Long
|
| Private Type ABC
| abcA As Long
| abcB As Long
| abcC As Long
| End Type
|
| Private Declare Function GetCharABCWidths Lib "gdi32" Alias _
| "GetCharABCWidthsA" ( _
| ByVal hdc As Long, _
| ByVal uFirstChar As Long, _
| ByVal uLastChar As Long, _
| lpabc As ABC) As Long
|
|
| Private Sub Command1_Click()
| Dim sz As Size
| Dim abcVB As ABC
|
| GetTextExtentPoint32 Me.Picture1.hdc, Label1.Caption, 1, sz
| GetCharABCWidths Me.Picture1.hdc, _
| Asc(Label1.Caption), _
| Asc(Label1.Caption), abcVB
| Me.Label1.Height = sz.cy * Screen.TwipsPerPixelY
| Me.Label1.Width = abcVB.abcB * Screen.TwipsPerPixelX
| End Sub
|
| Private Sub Form_Load()
| With Me.Label1
| .AutoSize = False
| .Font = "Symbol"
| .FontSize = 16
| .FontItalic = True
| .Caption = Chr$(166)
| .BackColor = vbYellow
| End With
| With Me.Picture1
| .Font = "Symbol"
| .FontSize = 16
| .FontItalic = True
| .Visible = False
| End With
| End Sub
|
| --
|
| Cordialement,
|
| Jacques.
Avatar
Jacques93
Bonjour LE TROLL,
LE TROLL a écrit :
Bonjour Jacques :o)

Ben moi je viens d'essayer, avec l'Italique ça marche très bien, enfin
la police que j'ai prise, vois ce code :

' TestLabel : test texte label form1 : OBJETS = 1 = LABEL1
Sub Form_Activate()
Form1.AutoRedraw = True
Form1.ScaleMode = vbPixels
FontName = "courier new"
FontSize = 72
FontItalic = True
Form1.ForeColor = &HFF& ' rouge
CurrentX = 234
CurrentY = 99
Print "Salut"
'
Label1.Alignment = 2 ' center
Label1.AutoSize = True
Label1.Appearance = 0 ' flat
Label1.BorderStyle = 0 ' non
Label1.FontName = "courier new"
Label1.FontSize = 72
Label1.FontItalic = True
Label1.ForeColor = &HFF& ' rouge
Label1.Left = 30
Label1.Top = 250
Label1.Caption = "Bonjour"
End Sub




Essaie avec :

Label1.Alignment = 2 ' center
Label1.AutoSize = True
Label1.Appearance = 0 ' flat
Label1.BorderStyle = 0 ' non
Label1.FontName = "Symbol" '"courier new"
Label1.FontSize = 72
Label1.FontItalic = True
Label1.ForeColor = &HFF& ' rouge
Label1.Left = 30
Label1.Top = 250
Label1.Caption = Chr$(166) '"Bonjour"

cela affiche le symbole monétaire du Florin, c'est ce que j'ai compris
du message d'Eric F. Tu verras qu'il y a bien un problème :-)
--

Cordialement,

Jacques.
Avatar
Eric F.
Merci à tous les 2 pour vos réponses riches.
Je vais essayer la méthode de Jacques et je vous tiens au courant.

Cordialement.

"Jacques93" a écrit :

Bonjour LE TROLL,
LE TROLL a écrit :
> Bonjour Jacques :o)
>
> Ben moi je viens d'essayer, avec l'Italique ça marche très bien, enfin
> la police que j'ai prise, vois ce code :
>
> ' TestLabel : test texte label form1 : OBJETS = 1 = LABEL1
> Sub Form_Activate()
> Form1.AutoRedraw = True
> Form1.ScaleMode = vbPixels
> FontName = "courier new"
> FontSize = 72
> FontItalic = True
> Form1.ForeColor = &HFF& ' rouge
> CurrentX = 234
> CurrentY = 99
> Print "Salut"
> '
> Label1.Alignment = 2 ' center
> Label1.AutoSize = True
> Label1.Appearance = 0 ' flat
> Label1.BorderStyle = 0 ' non
> Label1.FontName = "courier new"
> Label1.FontSize = 72
> Label1.FontItalic = True
> Label1.ForeColor = &HFF& ' rouge
> Label1.Left = 30
> Label1.Top = 250
> Label1.Caption = "Bonjour"
> End Sub
>

Essaie avec :

Label1.Alignment = 2 ' center
Label1.AutoSize = True
Label1.Appearance = 0 ' flat
Label1.BorderStyle = 0 ' non
Label1.FontName = "Symbol" '"courier new"
Label1.FontSize = 72
Label1.FontItalic = True
Label1.ForeColor = &HFF& ' rouge
Label1.Left = 30
Label1.Top = 250
Label1.Caption = Chr$(166) '"Bonjour"

cela affiche le symbole monétaire du Florin, c'est ce que j'ai compris
du message d'Eric F. Tu verras qu'il y a bien un problème :-)
--

Cordialement,

Jacques.



Avatar
LE TROLL
Je croyais que "florin" était une police...

Ben, si on fait ça, ça va :

' TestLabel : test texte label form1 : OBJETS = 1 = LABEL1
Sub Form_Activate()
Form1.AutoRedraw = True
Form1.ScaleMode = vbPixels
FontName = "symbol" ' "courier new"
FontSize = 72
FontItalic = True
Form1.ForeColor = &HFF& ' rouge
CurrentX = 234
CurrentY = 99
Print Chr(166) ' "Salut" ' ÇA MARCHE
'
Label1.Alignment = 2 ' center
Label1.Appearance = 0 ' flat
Label1.BorderStyle = 0 ' non
Label1.FontSize = 72
Label1.FontItalic = True
Label1.ForeColor = &HFF& ' rouge
Label1.Left = 30
Label1.Top = 250
Label1.AutoSize = True
GoTo un
Label1.FontName = "courier new"
Label1.Caption = "Bonjour"
un:
Label1.FontName = "Symbol"
Label1.Caption = " " & Chr(166) & " "
End Sub

------
Romans, logiciels, email, site personnel
http://irolog.free.fr/joe.htm
------------------------------------------------------------------------------------
"Jacques93" a écrit dans le message de news:
e186Lv$
| Bonjour LE TROLL,
| LE TROLL a écrit :
| > Bonjour Jacques :o)
| >
| > Ben moi je viens d'essayer, avec l'Italique ça marche très bien,
enfin
| > la police que j'ai prise, vois ce code :
| >
| > ' TestLabel : test texte label form1 : OBJETS = 1 = LABEL1
| > Sub Form_Activate()
| > Form1.AutoRedraw = True
| > Form1.ScaleMode = vbPixels
| > FontName = "courier new"
| > FontSize = 72
| > FontItalic = True
| > Form1.ForeColor = &HFF& ' rouge
| > CurrentX = 234
| > CurrentY = 99
| > Print "Salut"
| > '
| > Label1.Alignment = 2 ' center
| > Label1.AutoSize = True
| > Label1.Appearance = 0 ' flat
| > Label1.BorderStyle = 0 ' non
| > Label1.FontName = "courier new"
| > Label1.FontSize = 72
| > Label1.FontItalic = True
| > Label1.ForeColor = &HFF& ' rouge
| > Label1.Left = 30
| > Label1.Top = 250
| > Label1.Caption = "Bonjour"
| > End Sub
| >
|
| Essaie avec :
|
| Label1.Alignment = 2 ' center
| Label1.AutoSize = True
| Label1.Appearance = 0 ' flat
| Label1.BorderStyle = 0 ' non
| Label1.FontName = "Symbol" '"courier new"
| Label1.FontSize = 72
| Label1.FontItalic = True
| Label1.ForeColor = &HFF& ' rouge
| Label1.Left = 30
| Label1.Top = 250
| Label1.Caption = Chr$(166) '"Bonjour"
|
| cela affiche le symbole monétaire du Florin, c'est ce que j'ai compris
| du message d'Eric F. Tu verras qu'il y a bien un problème :-)
| --
|
| Cordialement,
|
| Jacques.
Avatar
Jacques93
LE TROLL a écrit :
Je croyais que "florin" était une police...



Y'en a peut être ... Sinon :

<http://fr.wikipedia.org/wiki/Florin>


Ben, si on fait ça, ça va :




[...]

Label1.FontName = "Symbol"
Label1.Caption = " " & Chr(166) & " "



ça peut être une solution, mais qui ne répond pas à la demande

application VB6 qui fait défiler UN par UN

là tu y va trois, par trois ;-)

--

Cordialement,

Jacques.
Avatar
Eric F.
Bonjour à tous les 2 et désolé de ne vous répondre que maintenant...
Merci Jacques pour la fonction API GetCharABCWidthsA et du lien Microsoft
qui explique bien la fonction! Elle répond bien à mon problème des largeurs
de caractères !

"Jacques93" a écrit :

LE TROLL a écrit :
> Je croyais que "florin" était une police...

Y'en a peut être ... Sinon :

<http://fr.wikipedia.org/wiki/Florin>

>
> Ben, si on fait ça, ça va :
>

[...]

> Label1.FontName = "Symbol"
> Label1.Caption = " " & Chr(166) & " "

ça peut être une solution, mais qui ne répond pas à la demande

application VB6 qui fait défiler UN par UN

là tu y va trois, par trois ;-)

--

Cordialement,

Jacques.



1 2