Bonjour !
J'essaye actuellement d'utiliser les API Win32 avec VB.Net, et plus particulièrement la fonction "GetKerningPairs" qui permet de retrouver toutes les valeurs de kerning d'une police. Le problème est que j'ai toute les peines du monde à écrire ma fonction car je n'ai jamais trop compris comment travailler avec les IntPtr et autres.
J'ai beau chercher partout, impossible de trouver un exemple en VB, ni même en C#.
Voici où j'en suis...
J'ai donc commencé par déclarer les méthodes dont j'ai besoin "GetKerningPairs" et "SelectObject" comme ceci:
Déjà là, je ne suis pas sûr de mon coup pour le 3ème paramètre de GetKerningPairs. Dois-je lui fournir un IntPtr ou directement un tableau de la structure "KerningPair" ... que voici:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <DllImport("gdi32.dll")> _ Private Shared Function GetKerningPairs(ByVal hdc As IntPtr, ByVal nNumPairs As UInteger, ByRef kernPairs As IntPtr) As UInteger End Function <DllImport("gdi32.dll")> _ Private Shared Function SelectObject(ByVal hdc As IntPtr, ByVal hObject As IntPtr) As IntPtr End Function
Et voici donc ma méthode qui pose problème. Je ne vois pas comment extraire des structures "KerningPair" du IntPtr une fois rempli. ET pour tout dire, je ne suis même pas sûr que le début soit bon.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 <StructLayout(LayoutKind.Sequential)> _ Public Structure KerningPair Public LeftChar As Char Public RightChar As Char Public KerningValue As Integer Public Sub New(ByVal chrLeft As Char, ByVal chrRight As Char, ByVal kerningVal As Integer) LeftChar = chrLeft : RightChar = chrRight : KerningValue = kerningVal End Sub Public Overrides Function ToString() As String Return String.Format("{{First={0}, Second={1}, Amount={2}}}", LeftChar, RightChar, KerningValue) End Function End Structure
Ca fait maintenant bien 3 jours que j'essaye de trouver une alternative, mais en vain. J'essaye aussi de comprendre de façon plus général comment utiliser du code non managé, mais c'est là que je me rends compte de la différence entre un vrai développeur et un bricolo sous .Net
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 Public Shared Function ExtractKerningPairs(ByVal font As Font) As List(Of KerningPair) Dim g As Graphics Dim hdc, hFont, old, kernPairs As IntPtr Dim numPairs As UInteger g = Graphics.FromHwnd(IntPtr.Zero) hdc = g.GetHdc hFont = font.ToHfont old = SelectObject(hdc, hFont) numPairs = GetKerningPairs(hdc, 0, Nothing) kernPairs = Marshal.AllocHGlobal(CInt(numPairs)) GetKerningPairs(hdc, numPairs, kernPairs) Dim res As New List(Of KerningPair) '?????????????????? SelectObject(hdc, old) Marshal.FreeHGlobal(kernPairs) g.ReleaseHdc(hdc) g.Dispose() Return res End Function
Merci d'avance pour votre aide.
Partager