#c# #.net #windows #fonts #filesystems
#c# #.net #Windows #шрифты #файловые системы
Вопрос:
Каков наилучший способ чтения всех шрифтов Windows в поле со списком? В принципе, я пытался сделать это:
равно Microsoft Word
Я могу сделать:
string[] fonts = Directory.GetFiles(@"C:windowsfonts");
и показывать каждый файл в поле со списком, но это правильно? У вас нет компонента, который выполняет эту работу?
Заранее спасибо.
Ответ №1:
Посмотрите на EnumFontFamiliesEx
и EnumFonts
.
Намного лучше InstalledFontCollection
. Я не знал, что он существует.
Ответ №2:
Попробуйте это:
using System.Drawing.Text;
InstalledFontCollection myFonts = new InstalledFontCollection();
foreach (FontFamily ff in myFonts.Families)
comboBox1.Items.Add(ff.Name);
}
Комментарии:
1.
InstalledFontCollection
естьIDisposable
. Перенесите использование вusing
оператор and.
Ответ №3:
Есть некоторые .Найдите шрифты в папке шрифтов. C # не использует эти растровые шрифты — вы не можете отображать эти шрифты с помощью функции drawstring. Чтобы получить все шрифты, которые вы можете отобразить, просто используйте этот код, который я нашел здесь: http://www.java2s.com/Code/CSharp/GUI-Windows-Form/Getallsysteminstalledfont.htm
using System;
using System.Drawing;
using System.Drawing.Text;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
public class Test{
static void Main()
{
InstalledFontCollection fonts = new InstalledFontCollection();
for(int i = 0; i < fonts.Families.Length; i )
{
Console.WriteLine(fonts.Families[i].Name);
}
}
}
Ответ №4:
Вы можете создать пользовательский элемент управления, который автоматически загружает шрифты, установленные в Windows:
namespace MyProject
{
public class FontComboBox : ComboBox
{
public FontComboBox()
{
MaxDropDownItems = 20;
IntegralHeight = false;
Sorted = false;
DropDownStyle = ComboBoxStyle.DropDownList;
DrawMode = DrawMode.OwnerDrawVariable;
}
public void Populate(bool b)
{
both = b;
foreach (FontFamily ff in FontFamily.Families)
{
if(ff.IsStyleAvailable(FontStyle.Regular))
Items.Add(ff.Name);
}
if(Items.Count > 0)
SelectedIndex=0;
//ttimg = new Bitmap(GetType(),"ttfbmp.bmp");
ttimg = new Bitmap(Resources.ttfbmp);
}
protected override void OnMeasureItem(System.Windows.Forms.MeasureItemEventArgs e)
{
if(e.Index > -1)
{
int w = 0;
string fontstring = Items[e.Index].ToString();
Graphics g = CreateGraphics();
e.ItemHeight = (int)g.MeasureString(fontstring, new Font(fontstring,10)).Height;
w = (int)g.MeasureString(fontstring, new Font(fontstring,10)).Width;
if(both)
{
int h1 = (int)g.MeasureString(samplestr, new Font(fontstring,10)).Height;
int h2 = (int)g.MeasureString(Items[e.Index].ToString(), new Font("Arial",10)).Height;
int w1 = (int)g.MeasureString(samplestr, new Font(fontstring,10)).Width;
int w2 = (int)g.MeasureString(Items[e.Index].ToString(), new Font("Arial",10)).Width;
if(h1 > h2 )
h2 = h1;
e.ItemHeight = h2;
w = w1 w2;
}
w = ttimg.Width*2;
if(w > maxwid)
maxwid=w;
if(e.ItemHeight > 20)
e.ItemHeight = 20;
}
base.OnMeasureItem(e);
}
protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)
{
if(e.Index > -1)
{
string fontstring = Items[e.Index].ToString();
nfont = new Font(fontstring,10);
Font afont = new Font("Arial",10);
if(both)
{
Graphics g = CreateGraphics();
int w = (int)g.MeasureString(fontstring, afont).Width;
if((e.State amp; DrawItemState.Focus)==0)
{
e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window),
e.Bounds.X ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
e.Graphics.DrawString(fontstring,afont,new SolidBrush(SystemColors.WindowText),
e.Bounds.X ttimg.Width*2,e.Bounds.Y);
e.Graphics.DrawString(samplestr,nfont,new SolidBrush(SystemColors.WindowText),
e.Bounds.X w ttimg.Width*2,e.Bounds.Y);
}
else
{
e.Graphics.FillRectangle(new SolidBrush(SystemColors.Highlight),
e.Bounds.X ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
e.Graphics.DrawString(fontstring,afont,new SolidBrush(SystemColors.HighlightText),
e.Bounds.X ttimg.Width*2,e.Bounds.Y);
e.Graphics.DrawString(samplestr,nfont,new SolidBrush(SystemColors.HighlightText),
e.Bounds.X w ttimg.Width*2,e.Bounds.Y);
}
}
else
{
if((e.State amp; DrawItemState.Focus)==0)
{
e.Graphics.FillRectangle(new SolidBrush(SystemColors.Window),
e.Bounds.X ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
e.Graphics.DrawString(fontstring,nfont,new SolidBrush(SystemColors.WindowText),
e.Bounds.X ttimg.Width*2,e.Bounds.Y);
}
else
{
e.Graphics.FillRectangle(new SolidBrush(SystemColors.Highlight),
e.Bounds.X ttimg.Width,e.Bounds.Y,e.Bounds.Width,e.Bounds.Height);
e.Graphics.DrawString(fontstring,nfont,new SolidBrush(SystemColors.HighlightText),
e.Bounds.X ttimg.Width*2,e.Bounds.Y);
}
}
e.Graphics.DrawImage(ttimg, new Point(e.Bounds.X, e.Bounds.Y));
}
base.OnDrawItem(e);
}
Font nfont;
bool both = false;
int maxwid = 0;
string samplestr = " - " Resources.AppTitle;
Image ttimg;
protected override void OnDropDown(System.EventArgs e)
{
this.DropDownWidth = maxwid 30;
}
}
}