Вопрос

Я столкнулся с проблемами в многочисленных случаях пользователей, не имеющих одного из шрифтов Windows Core, установленных на их машине (например, Courier New, Comic Sans MS, Arial например). Всякий раз, когда я пытаюсь построить один из них, он бросает ошибку, а не падать на связанный или на самом деле, Любые другой шрифт.

Какой лучший способ построить шрифт, если бы хотел, чтобы это было курьером, но я не особенно предан этому?

Это было полезно?

Решение

Вы можете встроить шрифты как ресурсы и использовать unsafe Ключевое слово (и должно быть составлено с «небезопасным»), чтобы получить шрифты ... Вот пример код, который я использовал для установки пользовательского элемента управления на шрифт типа «OCR»

Частный PrivateFontCollection PFC = Новый PrivateFontCollection (); Частный шрифт _fntocrfont = null; Частный Enum Fontenum {OCR = 0};

Это объявляет частную коллекцию шрифтов ... шрифт «OCR» встроен в качестве ресурса с использованием конвенции именования, где «foo» - это пространство имен, следовательно, именем ресурса будет «Foo.ocraext.ttf» ... посмотрите на «INECORFONT» здесь, который загружает шрифт и добавляет его в коллекцию:

Частная пустота INITOCRFONT () {TRY {SYSTEM.IO.STREAM PEATEPONT = IS.GETTYPE (). asbine.getmanifestresourcestream ("foo.ocraext.ttf"); if (streamfont! = null) {byte [] fontdata = новый байт [streamfont.length]; streamfont.read (fontdata, 0, (int) streamfont.length); streamfont.close (); небезопасно (Byte * pfontdata = fontdata) {its.pfc.addmemoryfont ((system.intptr) pfontdata, fontdata.length); }}} else {Нажмите новое исключение («Ошибка! Не удалось прочитать встроенный шрифт».); }} CALL (Exception Ex) {бросить новый исключение («Метод INEOCRFONT - исключение!  Nexception был:« + ex.message); }}

Здесь я устанавливаю элементы управления в управлении пользователя, чтобы установить шрифт для того, чтобы шрифт «OCR», итерацию через коллекцию, см. «INATIVEIZECTLFONT», размер шрифта 10 и является смелым «типом»:

Частная пустота INATIVEIZECTLFONT () {this._fntocrfont = new font (this.pfc.families [0], 10.0f, system.drawing.fontstyle.bold); if (this._fntocrfont! = null) {foreach (control ctl в thiss.controls) {если (ctl! = null && ((ctl - это метка) || (ctl textbox))) {ctl.font = this._fntocrfont ; }}}}

Когда пользовательский контроль получает распоряжение, обязательно освободить ресурсы, занятые шрифтом, как показано здесь, в Dispose Метод:

попробуйте {если (this._fntocrfont! = null) this._fntocrfont.dispose (); } Catch {} попробуйте {если (this.pfc! = null) this.pfc.dispose (); }ловить{ }

Надеюсь, это поможет, наилучшие пожелания, Том.

Другие советы

Ну, вы могли бы использовать FontFamily.GenericMonospace получить а. Моносмос шрифт вместо конкретно курьера:

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

Есть еще несколько таких общих семейств шрифтов, а также.

Вы также можете использовать это как последний курорт после попытки предпочтительного шрифта и запустить исключение.

Это очень необычно. Mapper Windows Font Mapper всегда будет предоставлять заменительный шрифт, когда ваша программа запрашивает шрифт, который недоступен на целевой машине. Этот заменительный шрифт обычно будет Microsoft Sans Serif на XP, Segoe UI на более поздних версиях. Ни один из них никогда не вызывает проблему.

Опять же, если машина настолько испорчена, что у него нет доступных основных шрифтов, у него не может быть шрифта TrueType, доступных вообще. Да, это будет бомбить вашу программу. Честно говоря, это не то, с которым вам нужно будет иметь дело, если это действительно ценный клиент. Это иначе тривиально решено командой поддержки вашего клиента.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top