ชุมชนคนรักภาษาเบสิค - Visual Basic Community

 ลืมรหัสผ่าน
 ลงทะเบียน
ค้นหา
ดู: 4787|ตอบกลับ: 2

[VB.NET] การกำหนดฟอนต์ให้กับตัวโปรแกรม เมื่อนำไปใช้งานกับเครื่องอื่น

[คัดลอกลิงก์]

311

กระทู้

502

โพสต์

6050

เครดิต

ผู้ดูแลระบบ

ทองก้อน ทับทิมกรอบ

Rank: 9Rank: 9Rank: 9

เครดิต
6050



เวลาที่เราออกแบบหน้าตาโปรแกรมอยู่ที่เครื่องของเรา การกำหนดฟอนต์ต่างๆให้กับ Control หากใช้ฟอนต์มาตรฐานมันก็ไม่มีปัญหา เมื่อเวลาที่เราต้อง Deployment โปรแกรมของเรา เพื่อนำไปใช้งานกับเครื่องอื่น แต่กรณีที่ใส่ฟอนต์ประหลาดเพิ่มเติมโดยที่ในตัว Windows ไม่มี มันก็จะไม่สามารถแสดงผลฟอนต์ให้ถูกต้องได้ หากเราไม่นำเอาฟอนต์ไปติดตั้งที่ %WinDir%\Fonts ของเครื่องปลายทาง ซึ่งการนำฟอนต์ไปใช้งานก็จะมีวิธีหลักๆอยู่ 3 วิธี คือ ...

1. ทำชุดติดตั้ง (Setup) อันนี้ไม่ว่าจะเป็น SetupFactory หรือ Inno Setup ที่แอดมินใช้ มันสามารถติดตั้งลงใน %WinDir%\Fonts และทำการ Registry ได้อย่างถูกต้อง ไม่มีปัญหาใดๆ
2. ไม่ทำชุดติดตั้ง แต่ Registry ฟอนต์เข้าไป กรณีนี้ไม่ได้ผล 100% หากเรานำไปไว้ที่ %WinDir%\Fonts เพราะ Windows 10 จะป้องกันเอาไว้ ดังนั้นจึงต้องทำ Registry ในตำแหน่งที่โปรแกรม EXE ของเราอยู่ แต่ทว่าหากเครื่องปลายทางนั้นมีฟอนต์ที่เราจะใช้อยู่แล้ว มันก็จะทำให้เกิดข้อผิดพลาดต่อโปรแกรมอื่นที่ต้องใช้ฟอนต์ตัวเดียวกัน
3. เรียกใช้ฟอนต์ด้วยโค้ด วิธีนี้ก็คือโค้ดชุดนี้นั่นเอง แต่อาจจะไม่สะดวกหากเรามี Control อยู่จำนวนมาก เพราะเราต้องกำหนดฟอนต์ด้วยโค้ดให้กับ Control ทุกๆตัว




ดาวน์โหลดฟอนต์ Kanit

มาดูโค้ดฉบับเต็มกันเถอะ ...
  1. Imports System.IO
  2. Imports System.Environment
  3. Imports System.Drawing.Text

  4. Public Class frmCustomFont
  5.     Dim pfc As New PrivateFontCollection()

  6.     Private Sub frmInstallFont_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
  7.         Try
  8.             '// Check Font exist.
  9.             If My.Computer.FileSystem.FileExists(Environment.GetEnvironmentVariable("windir") & "\fonts\Kanit-regular.ttf") Then
  10.                 MessageBox.Show("Font already exist.")
  11.             Else
  12.                 MessageBox.Show("Font not found.")
  13.             End If
  14.             '// Load Font to Control.
  15.             pfc.AddFontFile(MyPath(Application.StartupPath) & "Kanit-Regular.ttf")
  16.             Me.btnLoad.Font = New Font(pfc.Families(0), 9, FontStyle.Regular)
  17.             Me.btnExit.Font = New Font(pfc.Families(0), 9, FontStyle.Regular)
  18.         Catch ex As Exception
  19.             MessageBox.Show(ex.Message)
  20.         End Try
  21.     End Sub

  22.     Private Sub btnLoad_Click(sender As System.Object, e As System.EventArgs) Handles btnLoad.Click
  23.         Call InitializeGrid()
  24.         Call FillData()
  25.     End Sub

  26.     ' / --------------------------------------------------------------------
  27.     Private Sub FillData()
  28.         Dim dt As New DataTable
  29.         dt.Columns.Add("ID")
  30.         dt.Columns.Add("Name")
  31.         dt.Columns.Add("PositionName")
  32.         dt.Columns.Add("Salary")
  33.         dt.Columns.Add("HireDate")
  34.         dt.Rows.Add("00001", "นายทองก้อน ทับทิมกรอบ", "Managing Director", "99,999.99", "01/01/2562")
  35.         dt.Rows.Add("00002", "นายบุญห่อ พ่อรวย", "Labour", "15,000.00", "01/06/2562")
  36.         dt.Rows.Add("00003", "นางสาวคำหล้า น่ารัก", "Secretary", "19,999.50", "13/02/2562")
  37.         dt.Rows.Add("00004", "นางบัวผัน ทันใจ", "House Keeper", "9,000.99", "24/01/2562")
  38.         DataGridView1.DataSource = dt
  39.     End Sub

  40.     ' / --------------------------------------------------------------------
  41.     '// การตั้งค่าเริ่มต้นให้กับตารางกริดในแบบ @Run Time
  42.     Private Sub InitializeGrid()
  43.         With DataGridView1
  44.             .RowHeadersVisible = False
  45.             .AllowUserToAddRows = False
  46.             .AllowUserToDeleteRows = False
  47.             .AllowUserToResizeRows = False
  48.             .MultiSelect = False
  49.             .SelectionMode = DataGridViewSelectionMode.FullRowSelect
  50.             .ReadOnly = True
  51.             .RowTemplate.MinimumHeight = 30
  52.             .RowTemplate.Height = 30
  53.             .Font = New Font(pfc.Families(0), 10, FontStyle.Regular)
  54.             '/ จัดความกว้างของแต่ละหลัก โดยการจัดเรียงฟิลด์จาก QUERY ดังนี้
  55.             .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
  56.             '/ Adjust Header Styles
  57.             With .ColumnHeadersDefaultCellStyle
  58.                 .BackColor = Color.Navy
  59.                 .ForeColor = Color.White
  60.                 .Font = New Font(pfc.Families(0), 11, FontStyle.Regular)
  61.             End With
  62.         End With
  63.     End Sub

  64.     ' / --------------------------------------------------------------------------------
  65.     ' / Get my project path
  66.     ' / AppPath = C:\My Project\bin\debug
  67.     ' / Replace "\bin\debug" with ""
  68.     ' / Return : C:\My Project\
  69.     Function MyPath(ByVal AppPath As String) As String
  70.         '/ MessageBox.Show(AppPath);
  71.         AppPath = AppPath.ToLower()
  72.         '/ Return Value
  73.         MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "")
  74.         '// If not found folder then put the \ (BackSlash) at the end.
  75.         If Microsoft.VisualBasic.Right(MyPath, 1) <> Chr(92) Then MyPath = MyPath & Chr(92)
  76.     End Function

  77.     Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
  78.         Me.Close()
  79.     End Sub

  80. End Class
คัดลอกไปที่คลิปบอร์ด

ดาวน์โหลดโค้ดฉบับเต็ม VB.NET (2010) ได้ที่นี่ ...

ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง

คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน

x
สิ่งที่ดีกว่าการให้ คือการให้แบบไม่มีที่สิ้นสุด

0

กระทู้

5

โพสต์

133

เครดิต

Member

Rank: 2

เครดิต
133
โพสต์ 2019-9-26 21:32:37 | ดูโพสต์ทั้งหมด

ของผมใช้แบบนี้ครับไม่ต้องลงฟอนต์ไว้ที่เครื่องเก็บไว้ในตัวโปรแกรมเลย

1.เพิ่มฟอนต์ที่ต้องการไว้ที่ Resources [ยกตัวอย่างฟอนต์ชื่อว่า TST_std_letter1_Regular]
2.สร้าง Module ตั้งชื่อว่า CustomFont
3.ใส่โค้ดลง Module ตามนี้
  1. Imports System.Drawing.Text
  2. Imports System.Runtime.InteropServices
  3. Module CustomFont
  4.     'PRIVATE FONT COLLECTION TO HOLD THE DYNAMIC FONT
  5.     Private _pfc As PrivateFontCollection = Nothing
  6.     Public ReadOnly Property GetInstance(ByVal Size As Single, ByVal style As FontStyle) As Drawing.Font
  7.         Get
  8.             'IF THIS IS THE FIRST TIME GETTING AN INSTANCE
  9.             'LOAD THE FONT FROM RESOURCES
  10.             If _pfc Is Nothing Then LoadFont()
  11.             'RETURN A NEW FONT OBJECT BASED ON THE SIZE AND STYLE PASSED IN
  12.             Return New Drawing.Font(_pfc.Families(0), Size, style)
  13.         End Get
  14.     End Property
  15.     Private Sub LoadFont()
  16.         Try
  17.             'INIT THE FONT COLLECTION
  18.             _pfc = New PrivateFontCollection
  19.             'LOAD MEMORY POINTER FOR FONT RESOURCE
  20.             Dim fontMemPointer As IntPtr = Marshal.AllocCoTaskMem(My.Resources.TST_std_letter1_Regular.Length)
  21.             'COPY THE DATA TO THE MEMORY LOCATION
  22.             Marshal.Copy(My.Resources.TST_std_letter1_Regular, 0, fontMemPointer, My.Resources.TST_std_letter1_Regular.Length)
  23.             'LOAD THE MEMORY FONT INTO THE PRIVATE FONT COLLECTION
  24.             _pfc.AddMemoryFont(fontMemPointer, My.Resources.TST_std_letter1_Regular.Length)
  25.             'FREE UNSAFE MEMORY
  26.             Marshal.FreeCoTaskMem(fontMemPointer)
  27.         Catch ex As Exception
  28.             'ERROR LOADING FONT. HANDLE EXCEPTION HERE
  29.         End Try
  30.     End Sub

  31. End Module
คัดลอกไปที่คลิปบอร์ด
4.กลับไปใส่โค้ดหน้าฟอร์มโดยโค้ดที่เรียกใช้ฟอนต์ดังนี้
  1. Public Class Form1

  2.     Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  3.         Label1.UseCompatibleTextRendering = True
  4.         Label1.Font = CustomFont.GetInstance(12, FontStyle.Regular)
  5.         Label1.Text = "ฟอนต์ที่ใช้ทดสอบคือฟอนต์ TST STD LETTER 1"
คัดลอกไปที่คลิปบอร์ด





0

กระทู้

33

โพสต์

372

เครดิต

Full Member

Rank: 3Rank: 3

เครดิต
372
โพสต์ 2019-10-3 00:28:38 | ดูโพสต์ทั้งหมด

ขอบคุณคับ
ขออภัย! คุณไม่ได้รับสิทธิ์ในการดำเนินการในส่วนนี้ กรุณาเลือกอย่างใดอย่างหนึ่ง ลงชื่อเข้าใช้ | ลงทะเบียน

รายละเอียดเครดิต

ข้อความล้วน|อุปกรณ์พกพา|ประวัติการแบน|G2GNet.com  

GMT+7, 2024-4-25 23:23 , Processed in 0.205544 second(s), 4 queries , File On.

Powered by Discuz! X3.4, Rev.62

Copyright © 2001-2020 Tencent Cloud.

ตอบกระทู้ ขึ้นไปด้านบน ไปที่หน้ารายการกระทู้