Hallo liebe Gemeinde,
ich möchte in eine RichTextBox Sonderzeichen aus einem nicht installierten Font eintragen. Der Font wird aus einer Ressource geladen.
Beim Einfügen in eine Listbox klappt alles, alle Zeichen werden richtig dargestellt. Wenn ich das gleiche mit einer Richtextbox mache werden die Zeichen Chr(0..127) richtig eingefügt.
Bei Zeichen ab Chr(128) springt der Font auf MS Sans Serif und damit ist das Ergebnis natürlich unbrauchbar. kann mir da jemand ein bischen auf die Sprünge helfen ?
Das ist der Quellcode für einen kurzen Test. Für eure Hilfe im Voraus besten Dank.
ich möchte in eine RichTextBox Sonderzeichen aus einem nicht installierten Font eintragen. Der Font wird aus einer Ressource geladen.
Beim Einfügen in eine Listbox klappt alles, alle Zeichen werden richtig dargestellt. Wenn ich das gleiche mit einer Richtextbox mache werden die Zeichen Chr(0..127) richtig eingefügt.
Bei Zeichen ab Chr(128) springt der Font auf MS Sans Serif und damit ist das Ergebnis natürlich unbrauchbar. kann mir da jemand ein bischen auf die Sprünge helfen ?
Das ist der Quellcode für einen kurzen Test. Für eure Hilfe im Voraus besten Dank.
VB.NET-Quellcode
- Public Class Form1
- Dim PF As New PrivateFont(My.Resources.Musical)
- Dim LB As New ListBox
- Dim RB As New RichTextBox
- Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- LB.Location = New Point(10, 10) : LB.Size = New Size(100, Me.ClientSize.Height - 20)
- RB.Location = New Point(120, 10) : RB.Size = LB.Size
- Me.Controls.Add(LB)
- Me.Controls.Add(RB)
- LB.Font = PF.GetFont(14)
- RB.Font = PF.GetFont(14)
- Dim s As String
- For i = 120 To 250
- s = i.ToString + " " + Chr(i) + vbCrLf
- LB.Items.Add(s)
- RB.AppendText(s)
- Next
- End Sub
- Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
- PF.Dispose()
- End Sub
- End Class
- Public Class PrivateFont
- Private Declare Function AddFontMemResourceEx Lib "Gdi32.dll" (ByVal pbFont As IntPtr, ByVal cbFont As Integer, ByVal pdv As Integer, ByRef pcFonts As Integer) As IntPtr
- Private Declare Function RemoveFontMemResourceEx Lib "Gdi32.dll" (ByVal pbFont As IntPtr) As Boolean
- Dim PrivateFonts As New System.Drawing.Text.PrivateFontCollection
- Dim fh As IntPtr
- Public Sub New(source() As Byte)
- Dim fontMemPointer As IntPtr
- fontMemPointer = System.Runtime.InteropServices.Marshal.AllocCoTaskMem(source.Length)
- System.Runtime.InteropServices.Marshal.Copy(source, 0, fontMemPointer, source.Length)
- fh = AddFontMemResourceEx(fontMemPointer, source.Length, 0, 1)
- PrivateFonts.AddMemoryFont(fontMemPointer, source.Length)
- System.Runtime.InteropServices.Marshal.FreeCoTaskMem(fontMemPointer)
- End Sub
- Public Sub Dispose()
- RemoveFontMemResourceEx(fh)
- End Sub
- Public Function GetFont(size As Integer) As Font
- Return New Font(PrivateFonts.Families(0), size)
- End Function
- End Class