2010-01-27 18 views
0

Est-ce que quelqu'un sait comment changer le crénage (espace entre les caractères) dans vb.net? Par exemple, je voudrais remplacer "STRING" par "S T R I N G". Si possible je voudrais pouvoir créer ma propre police où je peux spécifier le crénage comme je souhaite! Merci d'avance!Kerning in vb.net

+1

Comment affichez-vous la chaîne? Le crénage est une propriété de la police de caractères, pas de la chaîne, donc cela dépend entièrement du système qui la restitue. –

+0

Son plutôt l'espacement des caractères – YOU

+1

@ S.Mark: similaire, mais différent. L'idée derrière le crénage est d'essayer d'améliorer la cohérence des espaces visuels qui résultent des formes des symboles eux-mêmes, et est typiquement différent pour chaque paire de symboles adjacents. Pour cette raison, vous avez besoin d'un algorithme pour assigner les valeurs de crénage pour vous ou pour le faire manuellement. Peut-être que le PO parlait juste du suivi (espacement des caractères). –

Répondre

3

La seule façon que j'ai trouvé est de P/Invoke. Assumming un formulaire générique avec un bouton générique ce code fonctionnera.

Imports System.Runtime.InteropServices 

Public Class Form1 
    Declare Function SetTextCharacterExtra Lib "gdi32" Alias "SetTextCharacterExtra" (ByVal hDC As Integer, ByVal nCharExtra As Integer) As Integer 
    <DllImport("gdi32")> _ 
    Private Shared Function TextOut(ByVal hdc As IntPtr, ByVal x As Integer, ByVal y As Integer, ByVal textstring As String, ByVal charCount As Integer) As Boolean 
    End Function 
    <DllImport("gdi32")> _ 
    Private Shared Function SelectObject(ByVal hdc As IntPtr, ByVal hgdiobj As IntPtr) As IntPtr 
    End Function 
    <DllImport("gdi32")> _ 
    Private Shared Function DeleteObject(ByVal objectHandle As IntPtr) As Boolean 
    End Function 
    <DllImport("gdi32")> _ 
    Private Shared Function SetBkColor(ByVal hdc As IntPtr, ByVal crColor As Integer) As UInt32 
    End Function 
    <DllImport("gdi32")> _ 
    Private Shared Function SetTextColor(ByVal hdc As IntPtr, ByVal crColor As Integer) As UInt32 
    End Function 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
     Using G = Graphics.FromHwnd(Me.Handle) 
      Using myFont As New System.Drawing.Font("Arial", 20, FontStyle.Regular, GraphicsUnit.Pixel) 
       'Regular Way 
       Dim LeftEdge = 20 
       G.DrawString("Hello", myFont, Brushes.Red, LeftEdge, 40) 

       'If you want kerning 
       Dim Kerning As Integer = 6 'I think this is twips 
       Dim Hdc As IntPtr 
       Dim FontPtr As IntPtr 
       Try 
        'Grab the Graphic object's handle 
        Hdc = G.GetHdc() 
        'Set the current GDI font 
        FontPtr = SelectObject(Hdc, myFont.ToHfont()) 
        'Set the drawing surface background color 
        SetBkColor(Hdc, ColorTranslator.ToWin32(Me.BackColor)) 
        'Set the text color 
        SetTextColor(Hdc, ColorTranslator.ToWin32(Color.Red)) 
        'Set the kerning 
        SetTextCharacterExtra(Hdc, Kerning) 
        Dim Text = "Hello" 
        'Draw the text at (20,60), Kerning will be applied so reset the left edge to half of kerning 
        TextOut(Hdc, LeftEdge + (Kerning \ 2), 60, Text, Text.Length) 
       Catch ex As Exception 

       Finally 
        'Release the font 
        DeleteObject(FontPtr) 
        'Release the handle on the graphics object 
        G.ReleaseHdc() 
       End Try 
      End Using 
     End Using 
    End Sub 
End Class 
-3

Vous pouvez utiliser CSS. Je règle généralement l'attribut de style letter-spacing dans ma page aspx.

+2

CSS dans vb.net? Je n'étais pas au courant que c'était possible, sauf dans un contrôle de navigateur intégré. – Cyclone