سلام،
میخوام در هنگام Load شدن فرم، یه فونت به پوشه Fonts ویندوز اضافه بشه.
خیلی جستجو کردم، ظاهراً باید از AddFontResource استفاده کنی، اما این هم کارساز نبود. از Copy هم استفاده کردم اما اصلا فونت رو کپی نمیکنه. نمیدونم مشکلش کجا هست.
Printable View
سلام،
میخوام در هنگام Load شدن فرم، یه فونت به پوشه Fonts ویندوز اضافه بشه.
خیلی جستجو کردم، ظاهراً باید از AddFontResource استفاده کنی، اما این هم کارساز نبود. از Copy هم استفاده کردم اما اصلا فونت رو کپی نمیکنه. نمیدونم مشکلش کجا هست.
دقیق یادم نیست اما فکر میکنم باید از api ویندوز استفاده کنید :9:نقل قول:
اما از طریق کپی کردن خیلی راحت میتوانید این کار رو انجام دهید نمونه کد
[PHP]
try
{
File.Copy(@"c:\Fontname.TTF", @"C:\WINDOWS\Fonts\fontname.TTF");
}
catch (Exception Except)
{
MessageBox.Show(Except.Message);
}[/PHP]
من با VB مینویسم و این اگر اشتباه نکنم C# هست. هرچند فرقی نمیکنه، معادل همین رو تو VB نوشتم اما کار نکرد...نقل قول:
تو این آدرس به مشکل شما پرداخته شده، حالا نکته مهم اینجاست که اگر میخواید تغییرات دائمی باشه و بعد از ریبوت شدن ویندوز فونت موردنظر پاک نشه باید حتما تغییراتی رو که انجام دادید رو در رجیستری ویندوز هم وارد کنید. (راهنمایی لازم در همین آدرس قرار داره.)
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
نقل قول:
ممنون، ولی این به زبان VB نیست، زیاد خوب متوجه نشدم.
ضمن اینکه چون میخوام تو Crystal Report از فونت استفاده کنم، فکر کنم حتماً باید کامپیوتر Restart بشه. اما اگر اشتباه میکنم و نیاز به Restart نیست، صرفاً در صورتی که فقط تو همون بازه ی زمانی استفاده از نرم افزار، فونت کار کنه، و بعد Restart کار نکنه هم مشکلی ندارم.
من تو عمرم اصلن از کریستال ریپورت استفاده نکردم:دی
ولی شما بیاید و از این کد استفاده کنید، و همزمان در پروژه تون از کریستال استفاده کنید ببینید نیاز به restart هست یا خیر.
نمونه ی کامل تر:کد:Class Program
<DllImport("gdi32", EntryPoint := "AddFontResource")> _
Public Shared Function AddFontResourceA(lpFileName As String) As Integer
End Function
Private Shared Sub Main()
Dim arr As String() = Environment.GetCommandLineArgs()
Dim FontPath As [String] = arr(1)
AddFontResourceA(DestinationFile)
End Sub
End Class
برای تبدیل کدهای C# به VB از آدرس روبرو میتونید کمک بگیرید : [ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]کد:Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports System.Runtime.InteropServices
Namespace FontResource
Class Program
Private Shared HWND_BROADCAST As New IntPtr(&Hffff)
Private Shared HWND_TOP As New IntPtr(0)
Private Shared HWND_BOTTOM As New IntPtr(1)
Private Shared HWND_TOPMOST As New IntPtr(-1)
Private Shared HWND_NOTOPMOST As New IntPtr(-2)
Private Shared HWND_MESSAGE As New IntPtr(-3)
<DllImport("gdi32.dll")> _
Private Shared Function AddFontResource(lpFilename As String) As Integer
End Function
<DllImport("gdi32.dll")> _
Private Shared Function RemoveFontResource(lpFileName As String) As Boolean
End Function
<DllImport("user32.dll", CharSet := CharSet.Auto)> _
Private Shared Function SendMessage(hWnd As IntPtr, wMsg As WindowsMessages, wParam As IntPtr, lParam As IntPtr) As Integer
End Function
Private Shared Sub Main(args As String())
If args.Length < 2 Then
Usage()
Return
End If
Dim fontFile As New FileInfo(args(1))
If Not fontFile.Exists Then
Console.WriteLine("Font file not found." & vbLf)
Usage()
Return
End If
Select Case args(0)
Case "add"
AddFontResource(args(1))
Exit Select
Case "rem"
RemoveFontResource(args(1))
Exit Select
Case Else
Usage()
Return
End Select
'This version of SendMessage is a blocking call until all windows respond.
Dim result As Long = SendMessage(HWND_BROADCAST, WindowsMessages.WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero)
'Alternatively PostMessage instead of SendMessage to prevent application hang
'bool posted = API.PostMessage(HWND_BROADCAST, WindowsMessages.WM_FONTCHANGE, IntPtr.Zero, IntPtr.Zero);
Console.WriteLine([String].Format("WM_FONTCHANGE broadcast returned {0}", result))
End Sub
Public Shared Sub Usage()
Console.WriteLine("FontResource [add|rem] <font>")
Console.WriteLine(vbLf & "Any changes will not persist a reboot - to do so, remove the font entry from the registry.")
End Sub
Public Enum WindowsMessages
'Snipped for length - see the list of WM_ calls on this site.
End Enum
End Class
End Namespace
مشابه این رو قبلاً استفاده کردم، اما کار نکرد.نقل قول:
یه جا تو سایت MSDN بود، که لینکش رو الان هرچی میگردم پیدا نمیکنم، اما طبق گفته ی اون، اگر بخوای همون لحظه از فونت استفاده کنی و بعد Restart دیگه نخوایش، از دستور AddFontResourceA باید استفاده کرد. (جواب نداد!)
اما اگر بخوای بعد Restart هم کار کنه، باید اول تو فولدر فونت کپی کنی و بعد از AddFontResourceA استفاده کنی (باز هم جواب نداد).
به چه صورت فونت مورد نظرتون رو برای کریستال ریپورت ست می کنید؟ اینکار رو بصورت رانتایم برای فیلد موردنظرتون انجام بدید ببنید درست میشه یا خیر.
بسم الله.
سلام.
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
اگر میخوای موقع نصب نرم افزارت فونت نصب بشه موقع Setup مثل شکل زیر استفاده کن:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
برای درج فونت در سیستم عامل هم میتونید از api به نام gdi32.dll استفاده کنید به شکل زیر که دوستان هم به اون اشاره ای کردند:[PHP]
[DllImport("gdi32.dll", EntryPoint = "AddFontResourceW", SetLastError = true)]
public static extern int AddFontResource([In][MarshalAs(UnmanagedType.LPWStr)] string lpFileName);
[DllImport("gdi32.dll", EntryPoint = "RemoveFontResourceW", SetLastError = true)]
public static extern int RemoveFontResource([In][MarshalAs(UnmanagedType.LPWStr)]string lpFileName);[/PHP]
نمونه کد سی شارپ که میتونید ازش استفاده کنید:
[PHP]
using System;
using System.Runtime.InteropServices;
using System.ComponentModel;
namespace InstallMyFontExample
{
class Program
{
static void Main(string[] args)
{
int result = -1;
int error = 0;
// Try remove the font.
result = RemoveFontResource(@"C:\MY_FONT_LOCATION\MY_NEW_FO NT.TTF");
error = Marshal.GetLastWin32Error();
if (error != 0)
{
Console.WriteLine(new Win32Exception(error).Message);
}
else
{
Console.WriteLine((result == 0) ? "Font was not found." :
"Font removed successfully.");
}
// Try install the font.
result = AddFontResource(@"C:\MY_FONT_LOCATION\MY_NEW_FONT. TTF");
error = Marshal.GetLastWin32Error();
if (error != 0)
{
Console.WriteLine(new Win32Exception(error).Message);
}
else
{
Console.WriteLine((result == 0) ? "Font is already installed." :
"Font installed successfully.");
}
Console.ReadKey();
}
}
}
[/PHP]
موفق و سربلند باشید در پناه حق.