คืออยากให้เอาโปรแกรมไปเปิดกับเครื่องอื่นที่ไม่มี Font นี้ ได้อ่ะคับ ลองหาโค้ดหรั่งดูแล้ว ได้มาแบบนี้ แต่มันใช้ไม่ได้ครับ
มีวิธีอื่นอีกไหมที่มันใช้ได้เหมือนกัน (ลองเขียนโค้ด Copy file font ลงใน C:\Windows\Fonts ก็ไม่ได้เหมือนกัน)
Code (VB.NET)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim mPFC As New PrivateFontCollection()
Dim mstrFont As String = "thaisanslite_r1.ttf"
Dim fontStream As System.IO.Stream = Me.GetType().Assembly.GetManifestResourceStream(mstrFont)
Dim Rawdata As System.IntPtr = Marshal.AllocCoTaskMem(fontStream.Length)
Dim fontData() As Byte
ReDim fontData(fontStream.Length)
fontStream.Read(fontData, 0, fontStream.Length)
Marshal.Copy(fontData, 0, Rawdata, fontStream.Length)
mPFC.AddMemoryFont(Rawdata, fontStream.Length)
fontStream.Close()
Marshal.FreeCoTaskMem(Rawdata)
Label1.Font = New Font("Thai Sans Lite", 12, FontStyle.Regular, GraphicsUnit.Point)
End Sub
ไม่ต้องเรียกจากโฟเดอร์ Font ของ Windows ก็ได้ครับ เรียกจาก Resource ที่เราเก็บไว้เลยครับ
ตัวนี้เลยครับ
Code (VB.NET)
Private Sub LoadFont()
Try
'INIT THE FONT COLLECTION
_pfc = New PrivateFontCollection
'LOAD MEMORY POINTER FOR FONT RESOURCE
Dim fontMemPointer As IntPtr = _
Marshal.AllocCoTaskMem( _
My.Resources.DIGITALDREAMNARROW.Length)
'COPY THE DATA TO THE MEMORY LOCATION
Marshal.Copy(My.Resources.DIGITALDREAMNARROW, _
0, fontMemPointer, _
My.Resources.DIGITALDREAMNARROW.Length)
'LOAD THE MEMORY FONT INTO THE PRIVATE FONT COLLECTION
_pfc.AddMemoryFont(fontMemPointer, _
My.Resources.DIGITALDREAMNARROW.Length)
'FREE UNSAFE MEMORY
Marshal.FreeCoTaskMem(fontMemPointer)
Catch ex As Exception
'ERROR LOADING FONT. HANDLE EXCEPTION HERE
End Try
End Sub
Private _pfc As New PrivateFontCollection
_pfc.AddFontFile(Application.StartupPath & "\thaisanslite_r1.ttf")
Label1.Font = New Font(_pfc.Families(0), 18, FontStyle.Regular)