# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > Setup و Deployment >  کپی کردن یک فونت در فونتهای ویندوز

## mehran5

سلام 
من میخوام یک فونت رو از یک مکانی در پوشه فونت واقع در کنترل پنل کپی کنم کدش چیه؟

----------


## Evil 69

سلام 
شما میتونی از کلاس اینوایورمنت که یک سری از اطلاعات سیستم عامل را میده استفاده کنی تا ادرس پارتیشنی رو که ویندوز روی اون نصب شده را پیدا کنی بعد می تونی فونت مورد نظر رو داخل پوشه فونت ویندوز کپی کنی و تمام

----------


## mehran5

ممنون ولی اگر کلاس رو لاتین بنوسید بهتره چون بهتر میشه جستجو کرد.اگه شما منبعی برای آشنایی با این کلاس دارید بفرمائید.

----------


## ezamnejad

نام کلاس Environment  است . این هم یک مثال خوب از این کلاس که توی MSDN پیداش کردم .

----------


## gdevnb

اگه برنامه ای نوشتید و قصد Deploy کردن اونو دارید و این فونتها در سیستم مقصد نیستند.رحت ترین راه استفاده از برنامه های Setup هست.
موفق باشید.

----------


## mehran5

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

----------


## vcldeveloper

اگر در VB.Net امکان استفاده از API های ویندوز را دارید، تابع AddFontResource برای همین کار هست.

----------


## Sub Zero

کپی کردن فونتها به تنهایی کافی نیست در واقع فونتها باید در سیستم *Install* شوند .
Install* کردن فونتها مهمه* ،خودم هم دنبالشم اگه کسی اطلاعاتی در این زمینه داره راهنمایی کنه.
از تابع API که جناب کشاورز معرفی کردن استفاده نکردم نمیدونم چیزی که من میخوام رو انجام میده؟

----------


## gdevnb

> کپی کردن فونتها به تنهایی کافی نیست در واقع فونتها باید در سیستم *Install* شوند .


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

----------


## Sub Zero

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


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

----------


## vcldeveloper

> از تابع API که جناب کشاورز معرفی کردن استفاده نکردم نمیدونم چیزی که من میخوام رو انجام میده؟


بله، به راهنمای مربوط به آن در MSDN مراجعه کنید.

----------


## mehran5

جناب کشاورز که توابع api رو معرفی کردند طرز استفاده از اون رو هم بگن.ممنون.حداقل با یک مثال کوچیک.

----------


## gdevnb

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


از این کد استفاده کن:
int i = AddFontResource("c:\\microN55.ttf");
http://msdn.microsoft.com/library/de...ntext_2ylq.asp

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

----------


## Sub Zero

خوب من از کدهای زیر استفاده کردم :
 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

> اما تابع Api به تنهایی جواب نمیداد ومجبور شدم از  دستور شماره 1 هم استفاده کنم .


اون تابع API فقط فونت رو نصب میکنه، یعنی فونت بدون اینکه سیستم نیازی به ریست داشته باشه، آماده استفاده میشه. بیشتر زمانی استفاده میشه که یک برنامه می خواد از فونت خاصی استفاده کنه و با اتمام کارش هم فونت از لیست فونت ها خارج بشه. اگر می خواید فونت برای همیشه نصب شده باقی بمونه، باید همین کاری که کردید رو انجام بدید.
در ضمن، دقت کنید که بعد از فراخوانی AddFontResource باید پیام WM_FONTCHANGE هم به تمام پنجره های سطح اول ارسال بشه، یعنی از تابع SendMessage به این شکل استفاده بشه:
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0)من نمی دونم معادل تابع API بالا در VB.Net چی هست.

----------


## Reza Safa

سلام دوست عزیز 
چند روش وجود دارد که شکا براحتی میتوانید این عمل را انجام دهید
1 - فونت های مورد نیاز خود را همراه با برنامه خود Setup سازی کنی
2 - از توابه api  استفاده کنی
3 - از رجیستری استفاده کنی
 .....
دوستان خدار را شکر همه روشها را گذاشتن من هم دو روش اول و پیشنهاد می کنم

----------


## mehran5

ببخشید جناب سابزیرو فونت ها در اپلیکیشن باید در پوشه خاصی باشند یا مثل بقیه فایلهای  معمولی  در پوشه اپلیکیشن باشند درسته؟

----------


## mehran5

حالا اگه بخوایم از طریق ستاپ در vs2003 این کار رو انجام بدیم باید چه کار کنیم.؟

----------


## Sub Zero

> من نمی دونم معادل تابع 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

----------


## mazoolagh

> در ضمن یک روش دیگه برای استفاده اختصاصی فونتها پیدا کردم در این روش فونت به منابع خود برنامه اضافه شده و فقط برنامه شما توانایی استفاده از اون فونت رو داره در این روش نیازی به کپی و نصب فونت نیست . البته خودم هنوز امتحانش نکردم


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

----------


## mehran5

میشه بگین توس vs2003 چطوری میشه اون رو انجام داد)embeded resourc(.ممنون.

----------


## mazoolagh

من 2003 کار نکردم ولی در 2005 باید از solution explorer فایل فونت رو راست کلیک کنین و properties اون رو باز کنین و فیلد build action رو برابر embede resource قرار بدین.

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

----------


## mehran5

مسیرش دقیقا چیه؟ممنون.

----------

