OVH Cloud OVH Cloud

LOGFONT et définition de la police

5 réponses
Avatar
driss hanib
Bonjour à tous,

j'ai trouvé une proc pour pouvoir écrire un texte avec une rotation, que ce
soit sur l'imprimante ou une pictureBox
Par contre je n'arrive pas à définir le type de police à utiliser
je crois que c'est dans le paramètre 'lfFaceName', mais je ne sais pas
comment le remplir

Quelqu'un a-t-il éjà utilisé ce type ?

Private Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * LF_FACESIZE
End Type

De plus le type Byte peut-il être rempli par un booléen ?
par exemple lfUnderline = true ?

Merci pour votre aide

Driss

5 réponses

Avatar
Jacques93
Bonjour driss hanib,
driss hanib a écrit :
Bonjour à tous,

j'ai trouvé une proc pour pouvoir écrire un texte avec une rotation, que ce
soit sur l'imprimante ou une pictureBox
Par contre je n'arrive pas à définir le type de police à utiliser
je crois que c'est dans le paramètre 'lfFaceName', mais je ne sais pas
comment le remplir

Quelqu'un a-t-il éjà utilisé ce type ?

Private Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * LF_FACESIZE
End Type

De plus le type Byte peut-il être rempli par un booléen ?
par exemple lfUnderline = true ?

Merci pour votre aide




Il faut terminer le nom de la police par un zéro binaire, par exemple :

lfFaceName = "Arial" & chr$(0)

Le type Byte peut être renseigné par un booléen, mais il faut savoir que

Boolean Integer Byte
------- ------- ----
True -1 255
False 0 0

Pour l'API çela ne pose pas de problème, ce qui est différent de zéro
est considéré comme True.

Ci joint un code que j'ai posté en réponse à Mr X en octobre dernier :
(J'ai changé le nom ... ;-)
--------------------------------------------------------------------

Option Explicit

Private Const LF_FACESIZE = 32

Private Const FW_DONTCARE = 0
Private Const FW_THIN = 100
Private Const FW_EXTRALIGHT = 200
Private Const FW_LIGHT = 300
Private Const FW_NORMAL = 400
Private Const FW_MEDIUM = 500
Private Const FW_SEMIBOLD = 600
Private Const FW_BOLD = 700
Private Const FW_EXTRABOLD = 800
Private Const FW_HEAVY = 900

Private Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * 32
End Type

Private Declare Function CreateFontIndirect Lib "gdi32" _
Alias "CreateFontIndirectA" (lpLogFont As LOGFONT) As Long
Private Declare Function SelectObject Lib "gdi32" _
(ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function TextOut Lib "gdi32" _
Alias "TextOutA" (ByVal hdc As Long, ByVal X As Long, _
ByVal Y As Long, ByVal lpString As String, _
ByVal nCount As Long) As Long
Private Declare Function DeleteObject Lib "gdi32" _
(ByVal hObject As Long) As Long


Private Sub Command1_Click()
DrawText Me, "Je m'appelle", 40, 40, 2700, "Times New Roman"
DrawText Me, "Driss Hanib :-)", 40, 160, 900, "Comic Sans MS"
End Sub


Private Sub DrawText(Pict As Object, Txt As String, _
X As Long, Y As Long, Angle As Long, _
Police As String)
Dim hFont As Long, OldHdc As Long
Dim lf As LOGFONT, lResult As Long

Pict.ScaleMode = vbPixels
With lf
.lfHeight = 20
.lfWidth = 10
.lfEscapement = Angle
.lfWeight = FW_NORMAL
.lfItalic = 0
.lfUnderline = True
.lfStrikeOut = 0
.lfOutPrecision = 2
.lfClipPrecision = 1
.lfQuality = 0
.lfPitchAndFamily = 0
.lfCharSet = 0
.lfFaceName = Police & Chr$(0)
End With
hFont = CreateFontIndirect(lf)
OldHdc = SelectObject(Pict.hdc, hFont)


lResult = TextOut(Pict.hdc, X, Y, Txt, Len(Txt))
lResult = SelectObject(Pict.hdc, OldHdc)
lResult = DeleteObject(hFont)
End Sub

'Tu peux faire varier l'angle de 0 à 3600, ça fonctionne sur les feuilles
'et les PictureBox (il faut la propriété hDc).

--
Cordialement,

Jacques.
Avatar
Jacques93
Oublié de mettre le lien expliquant la structure LOGFONT :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_1wmq.asp

--
Cordialement,

Jacques.
Avatar
Patrice Henrio
Bonjour,

De plus le type Byte peut-il être rempli par un booléen ?
par exemple lfUnderline = true ?



Pour ta question sur le booléen je dirai oui mais en fait il suffit de
vérifier sur un exemple.

Private Sub Command1_Click()
Dim B As Byte
B = True
Label1 = B
End Sub

Et on voit que true vaut 255 en byte, soit -1 en complément à 2

De la même façon false vaut 0

Réciproquement

Private Sub Command1_Click()
Dim BB As Boolean
BB = 0
If BB Then Label1 = "true" Else Label1 = "false"
End Sub

permet de voir que seule la valeur 0 est équivalent à false.

Ceci étant je suis contre l'utilisation des booléens comme des entiers chère
aux programmeurs en C qui, les pauvres, ne disposent pas de ce type dans
leur langage. Cela nous donne les fameuses lignes
if prédicat=true then ...
ce qui revient à dire
s'il est vrai que le prédicat est vrai alors ...
Avatar
Jacques93
Bonjour Patrice Henrio,
Patrice Henrio a écrit :
Bonjour,

De plus le type Byte peut-il être rempli par un booléen ?
par exemple lfUnderline = true ?



Pour ta question sur le booléen je dirai oui mais en fait il suffit de
vérifier sur un exemple.

Private Sub Command1_Click()
Dim B As Byte
B = True
Label1 = B
End Sub

Et on voit que true vaut 255 en byte, soit -1 en complément à 2

De la même façon false vaut 0

Réciproquement

Private Sub Command1_Click()
Dim BB As Boolean
BB = 0
If BB Then Label1 = "true" Else Label1 = "false"
End Sub

permet de voir que seule la valeur 0 est équivalent à false.

Ceci étant je suis contre l'utilisation des booléens comme des entiers chère
aux programmeurs en C qui, les pauvres, ne disposent pas de ce type dans
leur langage. Cela nous donne les fameuses lignes
if prédicat=true then ...
ce qui revient à dire
s'il est vrai que le prédicat est vrai alors ...



D'accord avec toi, mais en l'occurrence, la question de Driss portant
sur la structure LOGFONT utilisée par l'API CreateFontIndirect, on est
donc en C ... ;-)

Par ailleurs, il existe les fonctions de conversion. Par exemple :

Debug.Print CBool(255)
Debug.Print CBool(-1)
Debug.Print CBool(0)
Debug.Print CByte(True)
Debug.Print CByte(False)

--
Cordialement,

Jacques.
Avatar
driss hanib
Merci à Jacques93 et Patrice Henrio pour leur réponses rapides et
complètes..

je vais mettre cela immédiatment en pratique

Driss
"driss hanib" a écrit dans le message de news:
%
Bonjour à tous,

j'ai trouvé une proc pour pouvoir écrire un texte avec une rotation, que
ce soit sur l'imprimante ou une pictureBox
Par contre je n'arrive pas à définir le type de police à utiliser
je crois que c'est dans le paramètre 'lfFaceName', mais je ne sais pas
comment le remplir

Quelqu'un a-t-il éjà utilisé ce type ?

Private Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * LF_FACESIZE
End Type

De plus le type Byte peut-il être rempli par un booléen ?
par exemple lfUnderline = true ?

Merci pour votre aide

Driss