Как использовать шрифт .TTF, который .NET говорит «Не является шрифтом TrueType» в программе .NET? - PullRequest
1 голос
/ 21 августа 2010

Я скачал шрифт [Betsy Flanagan] [1], который я хотел бы использовать в своей программе, который показывает сочетания клавиш на экране и их значение в различных программах.

Однако при выборе шрифта в Visual Studio 2010 для метки я получаю сообщение об ошибке, в котором говорится: «Поддерживаются только шрифты TrueType. Это не шрифт TrueType».

Можно ли как-нибудь отобразить текст с помощью этого шрифта в программе .NET? Поскольку это специализированная форма, похожая на тост, с одним ярлыком, который должен иметь этот конкретный шрифт, мне все равно, будет ли это хаком (например, P / Invoke или подобным).

Примечание : это приложение .NET 4.0 Winforms.

Ответы [ 2 ]

2 голосов
/ 22 августа 2010

Если это шрифт, который вы пытаетесь использовать , то, возможно, ваш локальный экземпляр поврежден?

VS2010 вел себя хорошо, когда я пытался установить метки и другие элементы управления winforms для Бетси.Загрузите тот, который я связал, и посмотрите, работает ли он.Я полагаю, что если у вас установлен действительный TTF, VS не собирается исключать.

1 голос
/ 21 августа 2010

Посмотрите на этот код, который загружает встроенный шрифт в качестве ресурса и используется в элементах управления, где это применимо, в примере показано использование встраивания шрифта OCR

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

    private FontSize _fntSizeDefault = FontSize.Small;
    private float _fFontSize = 0.0F;

    private void InitOCRFont(){
        try{
            System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("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("Exception was: " + eX.Message);
    }
}

private void ConvertFontEnumToFloat(){
    switch(this._fntSizeDefault){
        case FontSize.Small :
            this._fFontSize = 8.0F;
            break;
        case FontSize.Medium :
            this._fFontSize = 10.0F;
            break;
        case FontSize.Large :
            this._fFontSize = 12.0F;
            break;
    }
}

Типичный вызов кода будетчто-то вроде этого:

this.ConvertFontEnumToFloat();
this._fntOCRFont = new Font(this.pfc.Families[(int)FontEnum.OCR], this._fFontSize, System.Drawing.FontStyle.Bold);
if (this._fntOCRFont != null){
   // Do something here... perhaps assign it to a control
}

Функция InitOCRFont использует unsafe, что означает, что опция компилятора unsafe включена, читает из встроенного ресурса и загружает в PrivateFontCollection.Функция ConvertFontEnumToFloat использует жестко закодированное значение с плавающей запятой, чтобы указать размер, основанный на перечислении шрифта.Закончив работу с кодом, обязательно избавьтесь от экземпляра PrivateFontCollection в методе Dispose указанного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...