Вы можете вставлять шрифты в качестве ресурсов и использовать ключевое слово unsafe
(и его необходимо скомпилировать с помощью «небезопасно») для получения шрифтов ... Вот пример кода, который я использовал для установки пользовательского элемента управления шрифтом типа «OCR»
private PrivateFontCollection pfc = new PrivateFontCollection();
private Font _fntOCRFont = null;
private enum FontEnum{
OCR = 0
};
что объявляет частную коллекцию шрифтов ... шрифт «OCR» встраивается в качестве ресурса, используя соглашение об именовании, где «Foo» является пространством имен, следовательно, имя ресурса будет «Foo .ocraext.ttf '... Посмотрите на «InitOCRFont» здесь, который загружает шрифт и добавляет его в коллекцию:
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{
}
Надеется, что это помогает, с наилучшими пожеланиями, Том.
Tommie, спасибо за прекрасный ответ. Боюсь, что это не принесет мне много пользы. Нам не разрешено распространять все эти шрифты, мое приложение должно быть бит-глухим агностиком, и даже предполагается, что он будет работать на Mac через Mono. Я искренне надеюсь, что мне не придётся прибегать к решению довольно этого жесткого ядра ... –
@David: Я не уверен, что Mono под Mac будет иметь PrivateFontCollection .... поскольку это зависит от Windows, так или иначе, Я бы подумал, что это бесполезно ....если нет более общего способа сделать это ... для того, чтобы чистая кросс-платформа работала, никаких pinvokes и никаких API-интерфейсов Win32 ... – t0mm13b