كيف يمكنني الحصول على تثبيت كافة ثابت-عرض الخطوط ؟

StackOverflow https://stackoverflow.com/questions/224865

  •  03-07-2019
  •  | 
  •  

سؤال

أنا أتساءل إذا كان هناك أي طرق بسيطة للحصول على قائمة بجميع عرض ثابت (أحادي المسافة) الخطوط المثبتة على النظام المستخدم في C# ؟

أنا باستخدام .net framework 3.5 حتى الوصول إلى WPF النظام.يقوم نظام ويندوز.الإعلام مساحة و LINQ للحصول على معلومات الخط, ولكن لست متأكدا ما كنت أبحث عنه.

كنت تريد أن تكون قادرة على توفير قائمة تمت تصفيتها أحادي المسافة الخطوط و/أو اختيار أحادي المسافة الخطوط من قائمة أكبر من الخطوط (كما رأينا في مقابل الحوار خيارات).

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

المحلول

وإلقاء نظرة على العنوان التالي:

http://www.pinvoke.net/default.aspx/Structures/ LOGFONT.html

استخدم واحد من الهياكل في هناك، ثم حلقة على الأسر، وinstantiating على الخط، والحصول على قيمة LOGFONT والتحقق lfPitchAndFamily.

ويتم كتابة التعليمات البرمجية التالية على الطاير ولم تختبر، ولكن شيئا من هذا القبيل ما يلي يجب أن تعمل:

foreach (FontFamily ff in System.Drawing.FontFamily.Families)
{
    if (ff.IsStyleAvailable(FontStyle.Regular))
    {
        Font font = new Font(ff, 10);
        LOGFONT lf = new LOGFONT();
        font.ToLogFont(lf);
        if (lf.lfPitchAndFamily ^ 1)
        {
            do stuff here......
        }
    }
}

نصائح أخرى

للأسف ToLogFont وظيفة لا تملأ lfPitchAndFamily مجال القيم الصحيحة.في حالتي دائما 0.

واحد تقريب للكشف عن الخطوط التي قد تكون ثابتة هي التالية

    foreach ( FontFamily ff in FontFamily.Families ) {
            if ( ff.IsStyleAvailable( FontStyle.Regular ) ) {
                float diff;
                using ( Font font = new Font( ff, 16 ) ) {
                    diff = TextRenderer.MeasureText( "WWW", font ).Width - TextRenderer.MeasureText( "...", font ).Width;
                }
                if ( Math.Abs( diff ) < float.Epsilon * 2 ) {
                    Debug.WriteLine( ff.ToString() );
                }
            }

        }

نضع في اعتبارنا أن يتم عدة ايجابيات كاذبة ، على سبيل المثال Wingdings

وAFAIK لا يمكنك أن تفعل ذلك باستخدام مكتبات BCL فقط. لديك لاستخدام WINAPI إمكانية التشغيل المتداخل.

وتحتاج إلى تحليل 2 أدنى بت من عضو .lfPitchAndFamily LOGFONT . هناك FIXED_PITCH ثابت (يعني أن الخط-عرض ثابت) التي يمكن استخدامها كقناع بت لlfPitchAndFamily.

وهنا هو مادة مفيدة:

تعداد الخطوط

<اقتباس فقرة>   

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

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