2010-05-28 8 views
7

में संसाधन फ़ॉन्ट का उपयोग सीधे VB.net/C# में स्टैंडअलोन एप्लिकेशन [डेस्कटॉप एप्लिकेशन] के लिए स्थानीय फ़ाइल सिस्टम में फ़ॉन्ट सहेजने के बिना संसाधन फ़ॉन्ट का उपयोग कैसे करें?VB.net/C#

+0

@ सैमसोल: CS.NET जैसी कोई चीज़ नहीं है। आपने कभी उस बारे में कब सुना? भाषा सिर्फ "सी #" है। –

उत्तर

14

कि संभव है, आप PrivateFontCollection.AddMemoryFont() विधि का उपयोग करना होगा। उदाहरण के लिए, मैं एक संसाधन के रूप में एक फ़ॉन्ट फ़ाइल नाम "test.ttf" जोड़ा गया है और इस तरह इसका इस्तेमाल किया:

using System.Drawing.Text; 
using System.Runtime.InteropServices; 
... 
public partial class Form1 : Form { 
    private static PrivateFontCollection myFonts; 
    private static IntPtr fontBuffer; 

    public Form1() { 
     InitializeComponent(); 
     if (myFonts == null) { 
      myFonts = new PrivateFontCollection(); 
      byte[] font = Properties.Resources.test; 
      fontBuffer = Marshal.AllocCoTaskMem(font.Length); 
      Marshal.Copy(font, 0, fontBuffer, font.Length); 
      myFonts.AddMemoryFont(fontBuffer, font.Length); 
     } 
    } 

    protected override void OnPaint(PaintEventArgs e) { 
     FontFamily fam = myFonts.Families[0]; 
     using (Font fnt = new Font(fam, 16)) { 
      TextRenderer.DrawText(e.Graphics, "Private font", fnt, Point.Empty, Color.Black); 
      //e.Graphics.DrawString("Private font", fnt, Brushes.Black, 0, 0); 
     } 
    } 
} 

ध्यान दें कि fontBuffer चर स्थिर जानबूझकर है। जब आप AddMemoryFont() का उपयोग करते हैं तो मेमोरी प्रबंधन मुश्किल होता है, जब तक फ़ॉन्ट का उपयोग किया जा सकता है तब तक स्मृति को वैध रहने की आवश्यकता होती है और PrivateFontCollection अभी तक निपटान नहीं किया जाता है। सुनिश्चित करें कि मार्शल को कॉल न करें। FreeCoTaskMem() यदि आपके पास यह गारंटी नहीं है, तो यह बहुत सामान्य बग है जो पाठ भ्रष्टाचार का निदान करने के लिए बहुत कठिन कारण बनता है। जब आप भाग्यशाली होते हैं तो आपको केवल AccessViolationException मिलता है। कार्यक्रम के जीवन के लिए इसे वैध रखना सरल समाधान है।

+0

शानदार। पोस्ट करने का शुक्रिया। – Harsha

+1

@ हंसपैसेंट: क्या होगा यदि मैं जिस फ़ॉन्ट फ़ाइल को जोड़ना चाहता हूं वह '.ttf' –

+1

के बजाय '.bin' एक्सटेंशन है, तो मुझे काम करने से पहले PInvoke का उपयोग करने की आवश्यकता थी। फ़ंक्शन ['AddFontMemResourceEx'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd183325 (v = vs.85) .aspx) का उपयोग किया जाना था ... शायद क्योंकि 'PrivateFontCollection .AddMemoryFont() 'फ़ॉन्ट को सिस्टम मेमोरी में होने की अपेक्षा करता है। मुझे यह भी आश्चर्य है कि इस तथ्य के साथ इसका कोई संबंध नहीं है कि मैं फ़ॉन्ट के साथ स्पष्ट प्रतिपादन के बजाय टेक्स्टबॉक्स का फ़ॉन्ट बदल रहा था। (फिर भी 'PrivateFontCollection.AddFontFile()' का उपयोग करके अभी भी PInvoke फ़ंक्शन के बिना काम किया है)। –