này sẽ được tải một phông chữ thành một bộ sưu tập font chữ riêng, và tránh bất kỳ tham chiếu đối tượng và bộ nhớ lỗi thời gian chạy mà bạn có thể thấy bằng cách sử dụng các ví dụ ở trên.
Vì lý do hiệu suất, chúng tôi chỉ muốn tải phông chữ một lần và giữ tham chiếu đến phông chữ cho nhiều thao tác vẽ giữa các cuộc gọi. Bí quyết là để đảm bảo PrivateFontCollection
không đi ra ngoài phạm vi nếu bạn giữ một tham chiếu đến đối tượng Font
mà bạn đã tạo.
Thêm một số biến tĩnh (chia sẻ)
Private Shared _sharedFont As Font
Private Shared _sharedFontCollection As Text.PrivateFontCollection
Private Shared _sharedFontSize As Integer
Sau đó tuyên bố các chức năng này
Private Function LoadSharedFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font
'Check if font name or size has changed, then clear cache
If size <> _sharedFontSize Then _sharedFont = Nothing
If _sharedFont Is Nothing Then
'Make this shared so this variable doesnt go out of scope and is garbage collected
_sharedFontCollection = New Text.PrivateFontCollection()
_sharedFont = LoadFont(fontName, size, style)
_sharedFontSize = size
End If
Return _sharedFont
End Function
và
Private Function LoadFont(ByVal fontName As String, ByVal size As Integer, ByVal style As FontStyle) As Font
Dim executingAssembly As System.Reflection.Assembly = Reflection.Assembly.GetCallingAssembly()
Dim myNamespace As String = executingAssembly.GetName().Name.ToString()
Try
Using fontstream = executingAssembly.GetManifestResourceStream(myNamespace + "." + fontName)
Dim fontBytes(CInt(fontstream.Length)) As Byte
fontstream.Read(fontBytes, 0, CInt(fontstream.Length))
Dim fontData As System.IntPtr = Marshal.AllocCoTaskMem(fontBytes.Length)
Marshal.Copy(fontBytes, 0, fontData, fontBytes.Length)
_sharedFontCollection.AddMemoryFont(fontData, fontBytes.Length)
Marshal.FreeCoTaskMem(fontData)
End Using
Return New Font(_sharedFontCollection.Families(0), size, style)
Catch ex As Exception
'An unexpected error has occurred so return a default Font just in case.
Return New Drawing.Font("Arial", size, FontStyle.Regular)
End Try
End Function
Sử dụng như sau:
Dim font = LoadSharedFont("OpenSans-CondBold.ttf", 12, FontStyle.Bold)
và cách tôi thay đổi phông chữ của nhãn sau này? – Ladessa
Hãy thử 'label.Font = new Font (pfc.Families [0], 18, FontStyle.Regular);' – KF2
Tôi nhận được ngoại lệ null trong 'Stream fontStream = this.GetType(). Assembly.GetManifestResourceStream (" BOOKOS .TTF "); ' nhưng tôi đã thêm tệp phông chữ vào tài nguyên. Thuộc tính * build * của BOOKOS.TFF được nhúng ... đúng không? – Ladessa