|
จากตอนที่แล้วในการนำฟอนต์พิเศษไปใช้งานกับเครื่องอื่น จะเป็นการกำหนดฟอนต์ให้กับ Control ต่างๆด้วยวิธีการเขียนโค้ด วิธีนี้ง่ายแต่ไม่สะดวกมากนัก ในกรณที่เรามี Control ต่างๆเยอะแยะมากมาย ดังนั้นจึงใช้วิธีการแก้ปัญหาด้วยการทำ Registry ให้กับฟอนต์แทน แต่แอดมินไม่ได้ใช้วิธีการคัดลอกฟอนต์ไปเก็บที่ %WinDir%\Fonts แล้วทำการรีจิสทรี้เหมือนคนอื่นๆเขา แต่จะใช้จุดตำแหน่งที่โปรแกรมของเราอยู่นั่นแหละเป็นที่เก็บฟอนต์ และทำการรีจิสทรี้ฟอนต์จาก ณ จุดนั้น เพื่อป้องกันปัญหา Access Denied ของตัว Windows เอง ... อนึ่ง!!! ในการทำรีจีสทรี้ฟอนต์ แอดมินเลือกการใช้ Win32 API (Application Programming Interface) ครั้นพอเราจบทำงานของโปรแกรม ก็จะสั่งให้ลบ Value ของฟอนต์รีจีสทรี้ออกไป เพื่อให้มิตรรักแฟนคลับภาษาเบสิคได้ศึกษาการเพิ่ม/ลบค่าในรีจีสทรี้ครับผม ...
การปรับโปรแกรมของเราให้ทำงานแบบโหมด Administrator ...
ดูจาก RegEdit เมื่อฟอนต์ถูกสั่งให้รีจีสทรี้ และจะหายไปเมื่อปิดโปรแกรม ...
มาดูโค้ดฉบับเต็มกันเถอะ ...
- Imports System.Runtime.InteropServices
- Imports Microsoft.Win32
- Public Class frmRegistryFont
- <DllImport("gdi32")> _
- Public Shared Function AddFontResource(ByVal lpFileName As String) As Integer
- End Function
- <DllImport("user32.dll")> _
- Public Shared Function SendMessage(ByVal hWnd As Integer, ByVal Msg As UInteger, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
- End Function
- <DllImport("kernel32.dll", SetLastError:=True)> _
- Shared Function WriteProfileString(ByVal lpszSection As String, ByVal lpszKeyName As String, ByVal lpszString As String) As Integer
- End Function
- ' / --------------------------------------------------------------------
- ' / Registry Font with API32 (Application Programming Interface).
- Private Sub frmRegistryFont_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
- Me.TextBox1.Text = "ทดสอบการใช้งานฟอนต์แบบการรีจิสทรี้วินโดส์ว"
- Try
- '// Check Font exist.
- If My.Computer.FileSystem.FileExists(Environment.GetEnvironmentVariable("windir") & "\fonts\Kanit-regular.ttf") Then
- MessageBox.Show("Font already exist.")
- Else
- MessageBox.Show("Font not found.")
- '// Set Administrator
- Dim oRegKey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers", True)
- oRegKey.SetValue("RegistryFont.Exe", "~ RUNASADMIN")
- oRegKey.Close()
- '// Use API (Application Programming Interface).
- Dim Ret As Integer
- Dim Res As Integer
- Dim FontPath As String = MyPath(Application.StartupPath) & "Kanit-regular.ttf"
- '// ระมัดระวังในการตั้งชื่อฟอนต์ อย่าให้ไปซ้ำกับที่มีอยู่ในระบบ
- Dim FontName As String = "Kanit (TrueType)"
- Const WM_FONTCHANGE As Integer = &H1D
- Const HWND_BROADCAST As Integer = &HFFFF
- Ret = AddFontResource(FontPath)
- Res = SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
- Ret = WriteProfileString("fonts", FontName, FontPath)
- End If
- Catch ex As Exception
- MessageBox.Show(ex.Message)
- End Try
- End Sub
- ' / --------------------------------------------------------------------
- '// Before finishing the program, delete the value.
- Private Sub frmRegistryFont_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
- Dim FontName As String = "Kanit (TrueType)"
- If My.Computer.Registry.GetValue("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", "Kanit (TrueType)", Nothing) Is Nothing Then
- MsgBox(FontName & " does not exist.")
- Else
- MsgBox(FontName & " exist.")
- Dim rk As RegistryKey = My.Computer.Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts", True)
- If rk IsNot Nothing Then
- rk.DeleteValue(FontName)
- rk.Close()
- End If
- End If
- End Sub
- Private Sub btnLoad_Click(sender As System.Object, e As System.EventArgs) Handles btnLoad.Click
- Call InitializeGrid()
- Call FillData()
- End Sub
- ' / --------------------------------------------------------------------
- Private Sub FillData()
- Dim dt As New DataTable
- dt.Columns.Add("ID")
- dt.Columns.Add("Name")
- dt.Columns.Add("PositionName")
- dt.Columns.Add("Salary")
- dt.Columns.Add("HireDate")
- dt.Rows.Add("00001", "นายทองก้อน ทับทิมกรอบ", "Managing Director", "99,999.99", "01/01/2562")
- dt.Rows.Add("00002", "นายบุญห่อ พ่อรวย", "Labour", "15,000.00", "01/06/2562")
- dt.Rows.Add("00003", "นางสาวคำหล้า น่ารัก", "Secretary", "19,999.50", "13/02/2562")
- dt.Rows.Add("00004", "นางบัวผัน ทันใจ", "House Keeper", "9,000.99", "24/01/2562")
- DataGridView1.DataSource = dt
- End Sub
- ' / --------------------------------------------------------------------
- '// การตั้งค่าเริ่มต้นให้กับตารางกริดในแบบ @Run Time
- Private Sub InitializeGrid()
- With DataGridView1
- .RowHeadersVisible = False
- .AllowUserToAddRows = False
- .AllowUserToDeleteRows = False
- .AllowUserToResizeRows = False
- .MultiSelect = False
- .SelectionMode = DataGridViewSelectionMode.FullRowSelect
- .ReadOnly = True
- .RowTemplate.MinimumHeight = 30
- .RowTemplate.Height = 30
- .Font = New Font("Kanit", 10, FontStyle.Regular)
- '/ จัดความกว้างของแต่ละหลัก โดยการจัดเรียงฟิลด์จาก QUERY ดังนี้
- .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
- '/ Adjust Header Styles
- With .ColumnHeadersDefaultCellStyle
- .BackColor = Color.Navy
- .ForeColor = Color.White
- .Font = New Font("Kanit", 11)
- End With
- End With
- End Sub
- ' / --------------------------------------------------------------------
- ' / Get my project path
- ' / AppPath = C:\My Project\bin\debug
- ' / Replace "\bin\debug" with ""
- ' / Return : C:\My Project\
- Function MyPath(ByVal AppPath As String) As String
- '/ MessageBox.Show(AppPath);
- AppPath = AppPath.ToLower()
- '/ Return Value
- MyPath = AppPath.Replace("\bin\debug", "").Replace("\bin\release", "").Replace("\bin\x86\debug", "")
- '// If not found folder then put the \ (BackSlash) at the end.
- If Microsoft.VisualBasic.Right(MyPath, 1) <> Chr(92) Then MyPath = MyPath & Chr(92)
- End Function
- Private Sub btnExit_Click(sender As System.Object, e As System.EventArgs) Handles btnExit.Click
- Me.Close()
- End Sub
- End Class
คัดลอกไปที่คลิปบอร์ด
ดาวน์โหลดโค้ดชุดเต็ม VB.NET (2010) ได้จากที่นี่ ...
|
ขออภัย! โพสต์นี้มีไฟล์แนบหรือรูปภาพที่ไม่ได้รับอนุญาตให้คุณเข้าถึง
คุณจำเป็นต้อง ลงชื่อเข้าใช้ เพื่อดาวน์โหลดหรือดูไฟล์แนบนี้ คุณยังไม่มีบัญชีใช่ไหม? ลงทะเบียน
x
|