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

Police pas fixe et largeur de controle

11 réponses
Avatar
Sam Vimaire
Bonjour.

Connaissant la propriété Width et Font d'un controle Label(
Autosize=False), puis-je savoir le nombre maximal de caractères
affichables par ce label ?

Mon but est de pouvoir récuperer rapidement dans un fichier externe
cette valeur pour tous les labels et textbox de mon projet.

Merci pour vos conseils.

10 réponses

1 2
Avatar
Sam Vimaire
Sam Vimaire a présenté l'énoncé suivant :
Oups..
j'ai oublié de préciser que je suis sous VB5 (pas .net)
Avatar
Sam Vimaire
Empiriquement
Pour un Label Courier NEw taille 8
je suis à 110 Twips par caratères.

Je crois que si je commence avec les Twips/pixels, j'ai pas fini..
Avatar
LE TROLL
Bonjour,

Mettre (resize = true), ainsi, il avalera ce qu'on
lui donne.

Sinon, prendre un police fixe (couRier news) par
exemple, comme ça, tu peux auparavant tester ce
que le label est susceptible d'avaler...

Je crois qu'il y a une méthode avec API, pour
connaître un largeur dans l'unité implicite de
mesure, mais bon... ça fait, peut être, un peu,
beaucoup, pour un simple petit label...

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

| Bonjour.
|
| Connaissant la propriété Width et Font d'un
controle Label(
| Autosizeúlse), puis-je savoir le nombre
maximal de caractères
| affichables par ce label ?
|
| Mon but est de pouvoir récuperer rapidement dans
un fichier externe
| cette valeur pour tous les labels et textbox de
mon projet.
|
| Merci pour vos conseils.
|
|
Avatar
Sam Vimaire
Dans son message précédent, LE TROLL a écrit :
Mettre (resize = true), ainsi, il avalera ce qu'on
lui donne.

Sinon, prendre un police fixe (couRier news) par
exemple, comme ça, tu peux auparavant tester ce
que le label est susceptible d'avaler...

Je crois qu'il y a une méthode avec API, pour
connaître un largeur dans l'unité implicite de
mesure, mais bon... ça fait, peut être, un peu,
beaucoup, pour un simple petit label...




Je ne sais pas pourquoi.. en corrigeant le message avant de le poster,
j'ai effacé des informations importantes..

oui : j'ai ommis de préciser que la police etait à Pas fixe
et que je ne peux/veux pas d'autosize
Avatar
Modeste
Bonsour® Sam Vimaire avec ferveur ;o))) vous nous disiez :

Connaissant la propriété Width et Font d'un controle Label(
Autosizeúlse), puis-je savoir le nombre maximal de caractères
affichables par ce label ?

Mon but est de pouvoir récuperer rapidement dans un fichier externe
cette valeur pour tous les labels et textbox de mon projet.



La procédure de test ci-dessous http://xcell05.free.fr/pages/api/dimtexte.htm

utilise la fonction DimTexte pour ajuster la taille d'un contrôle
CommandBarComboBox de type msoControlDropdown (liste déroulante non modifiable)
placé sur une barre d'outils à la largeur en pixels de son élément le plus long.
Ce contrôle ne disposant d'aucune propriété "AutoSize", le recours aux fonctions
API est ici nécessaire pour obtenir cet ajustement avec une précision
acceptable.


--------------------------------------------------------------------------------
Type SDimTexte
Largeur As Long
Hauteur As Long
End Type

Private Declare Function GetDC Lib "User32" _
(ByVal hwnd As Long) As Long

Private Declare Function ReleaseDC Lib "User32" _
(ByVal hwnd As Long, ByVal hDC As Long) As Long

Private Declare Function CreateFontA Lib "Gdi32" _
(ByVal H As Long, ByVal W As Long, ByVal E As Long, _
ByVal O As Long, ByVal W As Long, ByVal I As Long, _
ByVal u As Long, ByVal S As Long, ByVal C As Long, _
ByVal OP As Long, ByVal CP As Long, ByVal Q As Long, _
ByVal PAF As Long, ByVal F As String) As Long

Private Declare Function SelectObject Lib "Gdi32" _
(ByVal hDC As Long, ByVal hObject As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long

Private Declare Function GetTextExtentPoint32A Lib "Gdi32" _
(ByVal hDC As Long, ByVal lpsz As String, _
ByVal cbString As Long, lpSize As SDimTexte) As Long

Private Declare Function GetDeviceCaps Lib "Gdi32" _
(ByVal hDC As Long, ByVal nIndex As Long) As Long

'____________________________________________________________

Private Function DimTexte(Texte As String, Police As String, _
Taille As Double, Optional Gras As Boolean, _
Optional Italique As Boolean) As SDimTexte

Dim hFont As Long, hDC As Long
Dim PixpInch As Double

hDC = GetDC(0)
PixpInch = GetDeviceCaps(hDC, 90) / 72
hFont = CreateFontA(-Taille * PixpInch, 0, 0, 0, _
400 - 300 * Gras, -Italique, 0, 0, 1, 0, 0, 0, 0, Police)
If hFont = 0 Then
ReleaseDC 0, hDC
DimTexte.Largeur = 0
DimTexte.Hauteur = 0
Else
SelectObject hDC, hFont
GetTextExtentPoint32A hDC, Texte, Len(Texte), DimTexte
DeleteObject hFont
ReleaseDC 0, hDC
End If

End Function

'____________________________________________________________

Sub Test()

' Création d'un contrôle DropDown sur une barre d'outils
' avec ajustement automatique sur la largeur de l'élément
' le plus long

Dim Ctrl As CommandBarComboBox, Elt
Dim TempL As Integer, LargeurMax As Integer

' Création d'une nouvelle barre d'outils
On Error Resume Next
Application.CommandBars("Zaza").Delete
On Error GoTo 0
Application.CommandBars.Add("Zaza").Visible = True

' Création du contrôle et recherche du texte le plus long
Set Ctrl = Application.CommandBars("Zaza") _
.Controls.Add(msoControlDropdown)

For Each Elt In Array("Arm", "Stram", "Gram", _
"Pic et pic et colegram", "Bourre et bourre et ratatam")
Ctrl.AddItem Elt
' Tahoma 8 = police des CommandBarControls
TempL = DimTexte(CStr(Elt), "Tahoma", 8).Largeur
If TempL > LargeurMax Then LargeurMax = TempL
Next Elt

' Ajustement de la largeur du contrôle
Ctrl.DropDownWidth = -1
Ctrl.Width = LargeurMax + 20 ' (marge de 20 pixels supplémentaire)
Ctrl.ListIndex = 1

End Sub
-- -- @+;o)))
Avatar
jean-marc
"Sam Vimaire" wrote in message
news:
Bonjour.



Hello,

Connaissant la propriété Width et Font d'un controle Label(
Autosizeúlse), puis-je savoir le nombre maximal de caractères
affichables par ce label ?



Non, c'est impossible. Et ce pour une très bonne raison:
Pour une Font donnée (de taille non fixe), tous les caractères
n'occupent pas la même place.
Ainsi une chaine contenant 20 "i" prend beaucoup moins de place
qu'une chaine de 20 "W".

On ne peut donc jamais dire combien de caractère quelconques
peuvent tenir dans un label de taille X.

Ce qu'on peut faire, c'est calculer pour une taille donnée la
largeur du plus grand caractère (par exemple "W") et dire qu'on
peut mettre au maximum N fois le caractères le plus large,
ce qui garantit alors qu'on peut mettre de façon certaine
N caractères quelconque.
On peut donc trouver un Majorant absolu, mais il sera peut être
très pessimiste (donc petit).

Ce qu'on peut aussi faire (avec la propriété TextWidth) c'est dire
si une chaine en particulier (par exemple "ABRACADABRA") va tenir
ou pas dans le label avec sa largeur et sa fonte connue.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Patrice Henrio
Sam Vimaire a écrit :
Dans son message précédent, LE TROLL a écrit :
Mettre (resize = true), ainsi, il avalera ce qu'on lui donne.

Sinon, prendre un police fixe (couRier news) par exemple, comme ça, tu
peux auparavant tester ce que le label est susceptible d'avaler...

Je crois qu'il y a une méthode avec API, pour connaître un largeur
dans l'unité implicite de mesure, mais bon... ça fait, peut être, un
peu, beaucoup, pour un simple petit label...




Je ne sais pas pourquoi.. en corrigeant le message avant de le poster,
j'ai effacé des informations importantes..

oui : j'ai ommis de préciser que la police etait à Pas fixe
et que je ne peux/veux pas d'autosize




Dans ce cas, pour chaque police à pas fixe on peut calculer la largeur
en twips.

Pour cela utiliser un label autosize, rentrer N caractères dedans,
retrouver la largeur par la propriété width (en faisant attention que
l'on est bien en twips) puis diviser cette largeur par N. Le résultat
doit être indépendant de N et des caractères rentrés. Ensuite on crée un
tableau de deux colonnes avec la police en colonne 1 et la taille d'un
caractère (phase initialisation du programme). Enfin après lecture de la
taille d'un label (avec autosizeúlse) diviser cette taille par la
taille d'un caractère de la police concerné.
Avatar
Sam Vimaire
Merci à tous pour vos réponses
Avatar
LE TROLL
Ah ben, mieux vaut tard que jamais...

Un label n'est pas trop fait pour du
traitement de texte, peut être que le choix de
l'objet ???

Une solution parmi d'autres sans doute:
Dans la police désirée, tu fais un passage avec
tous les caractères qui peuvent arriver chr(x), tu
mesures et mémorises, puis ensuite, connaissant la
largeur, avec une variable indicée ou un sélect
case, tu va lire la taille de la lettre, mais bon,
je redis... normalement, un label avec l'autosize
et la gestion de left (pour centrer le label),
plus les possibilités de centrage du texte, ça
devrait suffire...

Peut être que si tu disais quel est le
problème dans son entier, il y aurait une solution
plus adaptée ?


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

| Dans son message précédent, LE TROLL a écrit :
| > Mettre (resize = true), ainsi, il avalera ce
qu'on
| > lui donne.
| >
| > Sinon, prendre un police fixe (couRier news)
par
| > exemple, comme ça, tu peux auparavant tester
ce
| > que le label est susceptible d'avaler...
| >
| > Je crois qu'il y a une méthode avec API, pour
| > connaître un largeur dans l'unité implicite de
| > mesure, mais bon... ça fait, peut être, un
peu,
| > beaucoup, pour un simple petit label...
|
|
| Je ne sais pas pourquoi.. en corrigeant le
message avant de le poster,
| j'ai effacé des informations importantes..
|
| oui : j'ai ommis de préciser que la police etait
à Pas fixe
| et que je ne peux/veux pas d'autosize
|
|
Avatar
Sam Vimaire
Pour compliquer les choses.
Le comportement n'est pas le meme selon le controle.

Le Caption "Russe" d'une Frame en Courrier New est correctement affiche
Le caption "Russe" d'un label en Courrier New ne l'est pas.
1 2