سؤال

لقد واجهت مشكلات في مناسبات عديدة من عدم وجود أحد خطوط Windows Core المثبتة على جهازهم (Courier New ، Comic Sans MS ، Arial على سبيل المثال). كلما حاولت إنشاء أحد هذه الأشياء ، فإنه يلقي خطأ بدلاً من العودة إلى أحد المرتبطة ، أو حقًا ، أي خط آخر.

ما هي أفضل طريقة لبناء خط إذا كنت أرغب في أن أكون ساعيًا ، لكنني لست متشوقًا بشكل خاص؟

هل كانت مفيدة؟

المحلول

يمكنك تضمين الخطوط كموارد واستخدام unsafe الكلمة الرئيسية (ويجب تجميعها باستخدام "غير آمن") للحصول على الخطوط ... إليك رمز مثال اعتدت عليه تعيين عنصر تحكم مستخدم على خط النوع "OCR"

private PrivateFontCollection pfc = new PrivateFontCollection();
private Font _fntOCRFont = null;
private enum FontEnum{
   OCR = 0
};

التي تعلن عن مجموعة خاصة من الخطوط ... يتم تضمين الخط "OCR" كمورد باستخدام اتفاقية التسمية حيث يكون "Foo" مساحة اسم ، ومن هنا سيكون اسم المورد "foo.ocraext.ttf" ... انظر إلى "Bithocrfont" هنا الذي يقوم بتحميل الخط ويضيفه إلى المجموعة:

private void InitOCRFont(){
   try{
      System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("foo.ocraext.ttf");
      if (streamFont != null){
          byte[] fontData = new byte[streamFont.Length];
          streamFont.Read(fontData, 0, (int)streamFont.Length);
          streamFont.Close();
          unsafe{
                fixed(byte *pFontData = fontData){
                   this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length);
                }
          }
      }else{
          throw new Exception("Error! Could not read built-in Font.");
      }
   }catch(Exception eX){
      throw new Exception("InitOCRFont Method - Exception occurred!\nException was: " + eX.Message);
   }
}

هنا ، قمت بتعيين عناصر التحكم داخل عنصر تحكم المستخدم لتعيين الخط على خط "OCR" من خلال التكرار من خلال المجموعة ، راجع "initializectlfont" ، وحجم الخط هو 10 وهو عبارة عن "نوع نوع من النوع":

private void InitializeCtlFont(){
    this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold);
    if (this._fntOCRFont != null){
         foreach(Control ctl in this.Controls){
            if (ctl != null && ((ctl is Label) || (ctl is TextBox))){
                        ctl.Font = this._fntOCRFont;
                    }
         }
    }
}

عندما يتم التخلص من عنصر تحكم المستخدم ، من الضروري تحرير الموارد التي يشغلها الخط كما هو موضح هنا في Dispose طريقة:

try{
   if (this._fntOCRFont != null) this._fntOCRFont.Dispose();
}catch{
}
try{
   if (this.pfc != null) this.pfc.Dispose();
}catch{
}

أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.

نصائح أخرى

حسنًا ، يمكنك استخدام FontFamily.GenericMonospace لتأخذ، لتمتلك أ خط Monospace ، بدلاً من البريد السريع على وجه التحديد:

Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular);

هناك عدد قليل من هذه العائلات الخطية العامة كذلك.

يمكنك أيضًا استخدام هذا الملاذ الأخير بعد تجربة الخط المفضل لديك والركض في استثناء.

هذا غير عادي للغاية. ستوفر Mapper Windows Font دائمًا خطًا بديلاً عندما يطلب البرنامج خطًا غير متوفر على الجهاز المستهدف. عادةً ما يكون هذا الخط البديل هو Microsoft Sans Serif على XP و Segoe UI على الإصدارات اللاحقة. لا ينبغي أن يسبب أي من هؤلاء مشكلة.

ثم مرة أخرى ، إذا كان الجهاز قد أفسد لدرجة أنه لا يحتوي على الخطوط الأساسية المتاحة ، فقد لا يكون له خط ترفيتوس متاح على الإطلاق. نعم ، هذا سوف يقصف برنامجك. بصراحة ، هذا ليس شيئًا يجب عليك التعامل معه ، إلا إذا كان هذا عميلًا مهمًا حقًا. يتم حلها بشكل تافلي من خلال فريق دعم عميلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top