سلام
من میخوام یک فونت رو از یک مکانی در پوشه فونت واقع در کنترل پنل کپی کنم کدش چیه؟
سلام
من میخوام یک فونت رو از یک مکانی در پوشه فونت واقع در کنترل پنل کپی کنم کدش چیه؟
سلام
شما میتونی از کلاس اینوایورمنت که یک سری از اطلاعات سیستم عامل را میده استفاده کنی تا ادرس پارتیشنی رو که ویندوز روی اون نصب شده را پیدا کنی بعد می تونی فونت مورد نظر رو داخل پوشه فونت ویندوز کپی کنی و تمام
ممنون ولی اگر کلاس رو لاتین بنوسید بهتره چون بهتر میشه جستجو کرد.اگه شما منبعی برای آشنایی با این کلاس دارید بفرمائید.
نام کلاس Environment است . این هم یک مثال خوب از این کلاس که توی MSDN پیداش کردم .
اگه برنامه ای نوشتید و قصد Deploy کردن اونو دارید و این فونتها در سیستم مقصد نیستند.رحت ترین راه استفاده از برنامه های Setup هست.
موفق باشید.
توی vs2005درsetup یک قسمتی بود بنام prerequistاگه اشتباه نکنم .جاشم یادم نیست کجا بود.حالا نمیدونم توی vs2003همچین چیزی در ستاپش هست یا نه .اگه باشه میشه فونت های مورد نظر رو در کامپیتر مقصد گذاشت.؟
جناب عظام نژاد از اون جایی که vs من2003, sample شما رو با ز نمیکنه ممنون میشم اگه یک عکس ا زقسمت کد اصلی مربوط به اون کلاس رو برام بذارید ؟!
آخرین ویرایش به وسیله mehran5 : سه شنبه 27 فروردین 1387 در 12:52 عصر
اگر در VB.Net امکان استفاده از API های ویندوز را دارید، تابع AddFontResource برای همین کار هست.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
کپی کردن فونتها به تنهایی کافی نیست در واقع فونتها باید در سیستم Install شوند .
Install کردن فونتها مهمه ،خودم هم دنبالشم اگه کسی اطلاعاتی در این زمینه داره راهنمایی کنه.
از تابع API که جناب کشاورز معرفی کردن استفاده نکردم نمیدونم چیزی که من میخوام رو انجام میده؟
بله، به راهنمای مربوط به آن در MSDN مراجعه کنید.از تابع API که جناب کشاورز معرفی کردن استفاده نکردم نمیدونم چیزی که من میخوام رو انجام میده؟
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
جناب کشاورز که توابع api رو معرفی کردند طرز استفاده از اون رو هم بگن.ممنون.حداقل با یک مثال کوچیک.
از این کد استفاده کن:
int i = AddFontResource("c:\\microN55.ttf");
http://msdn.microsoft.com/library/de...ntext_2ylq.asp
InstallAware یه برنامه Setup سازه که خود ماکروسافت ویژوال استدیوشو با این نرم افزار پک کرده.
www.Installaware.com
موفق باشید
خوب من از کدهای زیر استفاده کردم :
Private Declare Function AddFontResource Lib "gdi32" Alias "AddFontResourceA" (ByVal lpFileName As String) As Integer
Sub InstallFonts()
Dim PathFont As String = String.Format("{0}\Fonts", My.Application.Info.DirectoryPath)
Dim Directory As New DirectoryInfo(PathFont)
For Each File As FileInfo In Directory.GetFiles
If Not File.Extension = ".TTF" Then Continue For
[1] File.CopyTo(Path.GetDirectoryName(System.Environme nt.SystemDirectory) & "\Fonts\" & File.Name, True)
[2] AddFontResource(Path.GetDirectoryName(System.Envir onment.SystemDirectory) & "\Fonts\" & File.Name)
Next
End Sub
اما تابع Api به تنهایی جواب نمیداد ومجبور شدم از دستور شماره 1 هم استفاده کنم .
بقیه دوستان اگه ممکنه بدون دستور شماره 1 امتحان کنند ببینند جواب میگیرند .
Imports System.Io فراموش نشه
اون تابع API فقط فونت رو نصب میکنه، یعنی فونت بدون اینکه سیستم نیازی به ریست داشته باشه، آماده استفاده میشه. بیشتر زمانی استفاده میشه که یک برنامه می خواد از فونت خاصی استفاده کنه و با اتمام کارش هم فونت از لیست فونت ها خارج بشه. اگر می خواید فونت برای همیشه نصب شده باقی بمونه، باید همین کاری که کردید رو انجام بدید.اما تابع Api به تنهایی جواب نمیداد ومجبور شدم از دستور شماره 1 هم استفاده کنم .
در ضمن، دقت کنید که بعد از فراخوانی AddFontResource باید پیام WM_FONTCHANGE هم به تمام پنجره های سطح اول ارسال بشه، یعنی از تابع SendMessage به این شکل استفاده بشه:
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0)من نمی دونم معادل تابع API بالا در VB.Net چی هست.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
سلام دوست عزیز
چند روش وجود دارد که شکا براحتی میتوانید این عمل را انجام دهید
1 - فونت های مورد نیاز خود را همراه با برنامه خود Setup سازی کنی
2 - از توابه api استفاده کنی
3 - از رجیستری استفاده کنی
.....
دوستان خدار را شکر همه روشها را گذاشتن من هم دو روش اول و پیشنهاد می کنم
ببخشید جناب سابزیرو فونت ها در اپلیکیشن باید در پوشه خاصی باشند یا مثل بقیه فایلهای معمولی در پوشه اپلیکیشن باشند درسته؟
حالا اگه بخوایم از طریق ستاپ در vs2003 این کار رو انجام بدیم باید چه کار کنیم.؟
من نمی دونم معادل تابع API بالا در VB.Net چی هست.Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Object) As Integer
SendMessage(&HFFFF&, &H1D, 0, 0)
فرقی نمیکنه در چه فولدری ذخیره بشه اما من ترجیحا به همان صورتی که نوشتم عمل کردم برنامه من به گونه ای تنظیم شده که فقط برای اولین اجرا (اولین اجرا بعد از نصب برنامه) فونتها رو کپی ونصب میکنه . با تمامی این تفاصیر بازهم بلافاصله نصب فونتها جواب نداد ومجبور شدم برنامه رو ببندم ودوباره اجرا کنم .ببخشید جناب سابزیرو فونت ها در اپلیکیشن باید در پوشه خاصی باشند یا مثل بقیه فایلهای معمولی در پوشه اپلیکیشن باشند درسته؟
----------------
در ضمن یک روش دیگه برای استفاده اختصاصی فونتها پیدا کردم در این روش فونت به منابع خود برنامه اضافه شده و فقط برنامه شما توانایی استفاده از اون فونت رو داره در این روش نیازی به کپی و نصب فونت نیست . البته خودم هنوز امتحانش نکردم .:
Private Declare Auto Function AddFontMemResourceEx Lib "Gdi32.dll" _
(ByVal pbFont As IntPtr, ByVal cbFont As Integer, _
ByVal pdv As Integer, ByRef pcFonts As Integer) As IntPtr
Public Function GetFont(ByVal FontResource() As String) As _
Drawing.Text.PrivateFontCollection
'Get the namespace of the application
Dim NameSpc As String = _
Reflection.Assembly.GetExecutingAssembly().GetName ().Name.ToString()
Dim FntStrm As IO.Stream
Dim FntFC As New Drawing.Text.PrivateFontCollection()
Dim i As Integer
For i = 0 To FontResource.GetUpperBound(0)
'Get the resource stream area where the font is located
FntStrm = _
Reflection.Assembly.GetExecutingAssembly().GetMani festResourceStream( _
NameSpc + "." + FontResource(i))
'Load the font off the stream into a byte array
Dim ByteStrm(CType(FntStrm.Length, Integer)) As Byte
FntStrm.Read(ByteStrm, 0, Int(CType(FntStrm.Length, Integer)))
'Allocate some memory on the global heap
Dim FntPtr As IntPtr = _
Runtime.InteropServices.Marshal.AllocHGlobal( _
Runtime.InteropServices.Marshal.SizeOf(GetType(Byt e)) * _
ByteStrm.Length)
'Copy the byte array holding the font into the allocated memory.
Runtime.InteropServices.Marshal.Copy(ByteStrm, 0, _
FntPtr, ByteStrm.Length)
'Add the font to the PrivateFontCollection
FntFC.AddMemoryFont(FntPtr, ByteStrm.Length)
Dim pcFonts As Int32
pcFonts = 1
AddFontMemResourceEx(FntPtr, ByteStrm.Length, 0, pcFonts)
'Free the memory
Runtime.InteropServices.Marshal.FreeHGlobal(FntPtr )
Next
Return FntFC
End Function
منبع :http://www.tek-tips.com
آخرین ویرایش به وسیله Sub Zero : پنج شنبه 29 فروردین 1387 در 12:21 عصر
این روش خیلی خوبی است و مدتهاست که بعنوان یک استاندارد دفاکتو برای استفاده خصوصی از فونتها استفاده میشه و کاملاً امتحان شده است. فقط یک نکته هست که فایلهای فونتها رو باید بعنوان embeded resource تعریف کنین و گرنه کار نمیکنه.در ضمن یک روش دیگه برای استفاده اختصاصی فونتها پیدا کردم در این روش فونت به منابع خود برنامه اضافه شده و فقط برنامه شما توانایی استفاده از اون فونت رو داره در این روش نیازی به کپی و نصب فونت نیست . البته خودم هنوز امتحانش نکردم
همینطور بهتر هست که قبل از استفاده از این چک کنین که فونت نصب نشده باشه.
میشه بگین توس vs2003 چطوری میشه اون رو انجام داد)embeded resourc(.ممنون.
من 2003 کار نکردم ولی در 2005 باید از solution explorer فایل فونت رو راست کلیک کنین و properties اون رو باز کنین و فیلد build action رو برابر embede resource قرار بدین.
احتمالاً در 2003 هم شبیه همین هست.
مسیرش دقیقا چیه؟ممنون.