PDA

View Full Version : کپی کردن یک فونت در فونتهای ویندوز



mehran5
سه شنبه 27 فروردین 1387, 00:45 صبح
سلام
من میخوام یک فونت رو از یک مکانی در پوشه فونت واقع در کنترل پنل کپی کنم کدش چیه؟

Evil 69
سه شنبه 27 فروردین 1387, 07:07 صبح
سلام
شما میتونی از کلاس اینوایورمنت که یک سری از اطلاعات سیستم عامل را میده استفاده کنی تا ادرس پارتیشنی رو که ویندوز روی اون نصب شده را پیدا کنی بعد می تونی فونت مورد نظر رو داخل پوشه فونت ویندوز کپی کنی و تمام

mehran5
سه شنبه 27 فروردین 1387, 10:01 صبح
ممنون ولی اگر کلاس رو لاتین بنوسید بهتره چون بهتر میشه جستجو کرد.اگه شما منبعی برای آشنایی با این کلاس دارید بفرمائید.

ezamnejad
سه شنبه 27 فروردین 1387, 11:51 صبح
نام کلاس Environment است . این هم یک مثال خوب از این کلاس که توی MSDN پیداش کردم .

gdevnb
سه شنبه 27 فروردین 1387, 12:00 عصر
اگه برنامه ای نوشتید و قصد Deploy کردن اونو دارید و این فونتها در سیستم مقصد نیستند.رحت ترین راه استفاده از برنامه های Setup هست.
موفق باشید.

mehran5
سه شنبه 27 فروردین 1387, 12:27 عصر
توی vs2005درsetup یک قسمتی بود بنام prerequistاگه اشتباه نکنم .جاشم یادم نیست کجا بود.حالا نمیدونم توی vs2003همچین چیزی در ستاپش هست یا نه .اگه باشه میشه فونت های مورد نظر رو در کامپیتر مقصد گذاشت.؟
جناب عظام نژاد از اون جایی که vs من2003, sample شما رو با ز نمیکنه ممنون میشم اگه یک عکس ا زقسمت کد اصلی مربوط به اون کلاس رو برام بذارید ؟!

vcldeveloper
سه شنبه 27 فروردین 1387, 12:51 عصر
اگر در VB.Net امکان استفاده از API های ویندوز را دارید، تابع AddFontResource برای همین کار هست.

Sub Zero
سه شنبه 27 فروردین 1387, 13:48 عصر
کپی کردن فونتها به تنهایی کافی نیست در واقع فونتها باید در سیستم Install شوند .
Install کردن فونتها مهمه ،خودم هم دنبالشم اگه کسی اطلاعاتی در این زمینه داره راهنمایی کنه.
از تابع API که جناب کشاورز معرفی کردن استفاده نکردم نمیدونم چیزی که من میخوام رو انجام میده؟

gdevnb
سه شنبه 27 فروردین 1387, 14:23 عصر
کپی کردن فونتها به تنهایی کافی نیست در واقع فونتها باید در سیستم Install شوند .


از InstallAware استفاده کن و فونت مورد نظرت رو به پوشه فونتش add کن باقی کارها رو برات انجام میده.

Sub Zero
سه شنبه 27 فروردین 1387, 14:56 عصر
از InstallAware استفاده کن و فونت مورد نظرت رو به پوشه فونتش add کن باقی کارها رو برات انجام میده.

قصد من انجام این کار از طریق برنامه نویسیه در مورد InstallAware هم هیچ اطلاعاتی ندارم لطفا بیشتر توضیح بدید.

vcldeveloper
سه شنبه 27 فروردین 1387, 18:04 عصر
از تابع API که جناب کشاورز معرفی کردن استفاده نکردم نمیدونم چیزی که من میخوام رو انجام میده؟
بله، به راهنمای مربوط به آن در MSDN مراجعه کنید.

mehran5
سه شنبه 27 فروردین 1387, 23:06 عصر
جناب کشاورز که توابع api رو معرفی کردند طرز استفاده از اون رو هم بگن.ممنون.حداقل با یک مثال کوچیک.

gdevnb
سه شنبه 27 فروردین 1387, 23:54 عصر
قصد من انجام این کار از طریق برنامه نویسیه در مورد InstallAware هم هیچ اطلاعاتی ندارم لطفا بیشتر توضیح بدید.
از این کد استفاده کن:

int i = AddFontResource("c:\\microN55.ttf");
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_2ylq.asp

InstallAware یه برنامه Setup سازه که خود ماکروسافت ویژوال استدیوشو با این نرم افزار پک کرده.
www.Installaware.com
موفق باشید

Sub Zero
چهارشنبه 28 فروردین 1387, 17:23 عصر
خوب من از کدهای زیر استفاده کردم :

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 فراموش نشه

vcldeveloper
چهارشنبه 28 فروردین 1387, 18:00 عصر
اما تابع Api به تنهایی جواب نمیداد ومجبور شدم از دستور شماره 1 هم استفاده کنم .اون تابع API فقط فونت رو نصب میکنه، یعنی فونت بدون اینکه سیستم نیازی به ریست داشته باشه، آماده استفاده میشه. بیشتر زمانی استفاده میشه که یک برنامه می خواد از فونت خاصی استفاده کنه و با اتمام کارش هم فونت از لیست فونت ها خارج بشه. اگر می خواید فونت برای همیشه نصب شده باقی بمونه، باید همین کاری که کردید رو انجام بدید.
در ضمن، دقت کنید که بعد از فراخوانی AddFontResource باید پیام WM_FONTCHANGE هم به تمام پنجره های سطح اول ارسال بشه، یعنی از تابع SendMessage به این شکل استفاده بشه:

SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0)من نمی دونم معادل تابع API بالا در VB.Net چی هست.

Reza Safa
چهارشنبه 28 فروردین 1387, 22:25 عصر
سلام دوست عزیز
چند روش وجود دارد که شکا براحتی میتوانید این عمل را انجام دهید
1 - فونت های مورد نیاز خود را همراه با برنامه خود Setup سازی کنی
2 - از توابه api استفاده کنی
3 - از رجیستری استفاده کنی
.....
دوستان خدار را شکر همه روشها را گذاشتن من هم دو روش اول و پیشنهاد می کنم

mehran5
چهارشنبه 28 فروردین 1387, 23:12 عصر
ببخشید جناب سابزیرو فونت ها در اپلیکیشن باید در پوشه خاصی باشند یا مثل بقیه فایلهای معمولی در پوشه اپلیکیشن باشند درسته؟

mehran5
چهارشنبه 28 فروردین 1387, 23:15 عصر
حالا اگه بخوایم از طریق ستاپ در vs2003 این کار رو انجام بدیم باید چه کار کنیم.؟

Sub Zero
پنج شنبه 29 فروردین 1387, 11:49 صبح
من نمی دونم معادل تابع 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 (http://www.tek-tips.com/faqs.cfm?fid=4747)

mazoolagh
جمعه 30 فروردین 1387, 10:38 صبح
در ضمن یک روش دیگه برای استفاده اختصاصی فونتها پیدا کردم در این روش فونت به منابع خود برنامه اضافه شده و فقط برنامه شما توانایی استفاده از اون فونت رو داره در این روش نیازی به کپی و نصب فونت نیست . البته خودم هنوز امتحانش نکردم

این روش خیلی خوبی است و مدتهاست که بعنوان یک استاندارد دفاکتو برای استفاده خصوصی از فونتها استفاده میشه و کاملاً امتحان شده است. فقط یک نکته هست که فایلهای فونتها رو باید بعنوان embeded resource تعریف کنین و گرنه کار نمیکنه.
همینطور بهتر هست که قبل از استفاده از این چک کنین که فونت نصب نشده باشه.

mehran5
جمعه 30 فروردین 1387, 18:11 عصر
میشه بگین توس vs2003 چطوری میشه اون رو انجام داد)embeded resourc(.ممنون.

mazoolagh
شنبه 31 فروردین 1387, 20:53 عصر
من 2003 کار نکردم ولی در 2005 باید از solution explorer فایل فونت رو راست کلیک کنین و properties اون رو باز کنین و فیلد build action رو برابر embede resource قرار بدین.

احتمالاً در 2003 هم شبیه همین هست.

mehran5
دوشنبه 02 اردیبهشت 1387, 23:12 عصر
مسیرش دقیقا چیه؟ممنون.