bonjour, j'aimerais savoir s'il était possible de connaître la famille d'une font (sérif, sans sérif... ) et si oui comment faire ?
Merci d'avance.
bonjour, j'aimerais savoir s'il était possible de connaître la famille d'une font (sérif, sans sérif... ) et si oui comment faire ?
Merci d'avance.
Comment ça ? Connaitre le nom de la police utilisée dans tel ou tel controle ?
Non, je cherche à connaître la famille d'une police en connaissant son nom (la police "Arial" fait partie de la famille "sans sérif" par exemple...).
Y a-t-il une propriété des objets fonts qui donne cette famille ?
Bonjour,
Non ... pas de "propriété d'objet" pour celà ...
Mais deux fonctions de l'Api de Windows :
EnumFontFamilies
EnumFontFamiliesEx
Toutes deux dans la librairie gdi32
J'ai fait quelques recherches sur la msdn...
mais pas moyen de comprendre comment tirer la famille d'une police en connaissant son nom...
La fonction EnumFontFamiliesEx énumère bien toutes familles sur le disque ?
Montre donc ton code.
On verra après
Edit : moi, je suis prêt (avec un exemple pour ta police Arial)...
Mais je viens de voir tes autres discussions !!!
Certaines sont restées sans suite, bien que résolues !!!
Alors : donnant donnant...
Tu fais cet effort : je penserai à mettre ici le code que tu attends..
Tu ne le fais pas : et je ne ferai rien non plus ...
Bon..
Je vois que c'est fait.
Alors :
Sur une Form : 1 bouton de commande Command1 et une listbox List1
Ce code :
Et dans un Module.Bas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 Option Explicit Private Sub Command1_Click() Dim hDC As Long, mapolice As String Me.AutoRedraw = True mapolice = "Arial" List1.Clear EnumFontFamilies Me.hDC, mapolice, AddressOf EnumFontFamProc, ByVal 0& End Sub Private Sub Form_Activate() Set toto = List1 End Sub
ce code :
Lance et clique sur Command1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 Option Explicit Public Const LF_FACESIZE = 32 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(LF_FACESIZE) As Byte End Type Type NEWTEXTMETRIC tmHeight As Long tmAscent As Long tmDescent As Long tmInternalLeading As Long tmExternalLeading As Long tmAveCharWidth As Long tmMaxCharWidth As Long tmWeight As Long tmOverhang As Long tmDigitizedAspectX As Long tmDigitizedAspectY As Long tmFirstChar As Byte tmLastChar As Byte tmDefaultChar As Byte tmBreakChar As Byte tmItalic As Byte tmUnderlined As Byte tmStruckOut As Byte tmPitchAndFamily As Byte tmCharSet As Byte ntmFlags As Long ntmSizeEM As Long ntmCellHeight As Long ntmAveWidth As Long End Type Declare Function EnumFontFamilies Lib "gdi32" Alias "EnumFontFamiliesA" (ByVal hDC As Long, ByVal lpszFamily As String, ByVal lpEnumFontFamProc As Long, LParam As Any) As Long Public toto As ListBox Function EnumFontFamProc(lpNLF As LOGFONT, lpNTM As NEWTEXTMETRIC, ByVal FontType As Long, LParam As Long) As Long Dim FaceName As String FaceName = StrConv(lpNLF.lfFaceName, vbUnicode) toto.AddItem Left$(FaceName, InStr(FaceName, vbNullChar) - 1) EnumFontFamProc = 1 End Function
Bon... Je dois êtr evraiment con mais je ne comprends pas...
Avec ton code j'ai ça :
dans la liste...Arial
Arial CE
Arial CYR
Arial Greek
Arial TUR
Arial Baltic
Arial
Arial CE
Arial CYR
Arial Greek
Arial TUR
Arial Baltic
Arial
Arial CE
Arial CYR
Arial Greek
Arial TUR
Arial Baltic
Arial
Arial CE
Arial CYR
Arial Greek
Arial TUR
Arial Baltic
et je ne vois vraiment pas ce que ça représente... à part les jeux de caractères de la police
Donc, cela me donne toutes les polices de la famille "Arial" mais comment obtenir toutes les polices de la famille "sans serif" ?
Parce que, si je comprends bien, cela me donne toutes les polices "enfants" (celle dont la famille est la police que j'ai précisé)...
Et si, dans ton code, je remplace :
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part mapolice = "Arial"
Est-ce que ça marche ? (je ne suis pas chez moi, donc je ne peux pas essayer pour le moment...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part mapolice = "sans serif"
Pour préciser ma question : Est-il possible d'obtenir la nom de la famille ("serif", "sans serif"...) à laquelle appartient une police donnée ?
Je ne vois pas comment demander ça autrement peut-être suis-je totalement con...
Réponse à ta 1ère question :
Oui (et c'est la raison pour laquelle je t'ai donné un exemple avec possibilité de définir ta Police !!!) mais à condition (bien évidemment) de donner le nom exact de la police concernée (Y compris la casse).
Réponse à ta 2ème question :
Si, à partir d'un nom de police (Exact comme ci-dessus), tu cherches à savoir à quel "Pitch and Family" ladite police appartient, c'est très différent et tu dois savoir que ces "Pitch And Family" sont classés par numéro (et pas par nom) ...
Et dans ce cas (mais il va falloir que tu te dégourdisse un peu, quand même !...) :
Dans une Form :
Et dans un module :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Private Sub Form_Activate() police = "Arial" ' ou ce que tu veux, pourvu que le nom soit exact, y compris la casse... EnumFonts Me.hDC, vbNullString, AddressOf EnumFontProc, 0 End Sub
Lance et tu devrais comprendre....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 Private Const LF_FACESIZE = 32 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(LF_FACESIZE) As Byte End Type Declare Function EnumFonts Lib "gdi32" Alias "EnumFontsA" (ByVal hDC As Long, ByVal lpsz As String, ByVal lpFontEnumProc As Long, ByVal lParam As Long) As Long Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long) Public police As String Function EnumFontProc(ByVal lplf As Long, ByVal lptm As Long, ByVal dwType As Long, ByVal lpData As Long) As Long Dim LF As LOGFONT, FontName As String, fontfam As String, ZeroPos As Long, ZeroPos1 As Long CopyMemory LF, ByVal lplf, LenB(LF) FontName = StrConv(LF.lfFaceName, vbUnicode) fontfam = StrConv(LF.lfPitchAndFamily, vbUnicode) ZeroPos = InStr(1, FontName, Chr$(0)) ZeroPos1 = InStr(1, fontfam, Chr$(0)) If ZeroPos > 0 Then FontName = Left$(FontName, ZeroPos - 1): fontfam = Left$(fontfam, ZeroPos1 - 1) If FontName = police Then MsgBox FontName & " appartient à la famille Pitch and Family " & fontfam End If EnumFontProc = 1 End Function
Et si tu ne vois toujours pas, ma foi... continue sans moi ...![]()
Et bien je vais essayer ça ce soir... et désolé d'avoir une question sans comprendre...
Bon ben j'ai compris ce que ton code faisait...
En cherchant un peu, on doit pouvoir donner un nom à chaque valeur de "Pitch and family"...
Merci pour ton "aide"
Partager