由於內置字體對話框在選擇非真正類型字體時返回「不是真正類型字體」異常,我試圖創建一個自定義使用字體家族的字體對話框,用於過濾非真正的字體。爲C#設計一個自定義字體對話框/選擇器,用於過濾非真實類型字體
該控件工作完美,但我需要這個對話框的大小和樣式選擇器。我發佈了當前的代碼。請幫我添加一個大小和樣式選擇器。它也可能對你有用。
public class FontListBox : ListBox
{
private List<Font> _fonts = new List<Font>();
private Brush _foreBrush;
public FontListBox()
{
DrawMode = DrawMode.OwnerDrawFixed;
ItemHeight = 20;
foreach (FontFamily ff in FontFamily.Families)
{
// determine the first available style, as all fonts don't support all styles
FontStyle? availableStyle = null;
foreach (FontStyle style in Enum.GetValues(typeof(FontStyle)))
{
if (ff.IsStyleAvailable(style))
{
availableStyle = style;
break;
}
}
if (availableStyle.HasValue)
{
Font font = null;
try
{
// do your own Font initialization here
// discard the one you don't like :-)
font = new Font(ff, 12, availableStyle.Value);
}
catch
{
}
if (font != null)
{
_fonts.Add(font);
Items.Add(font);
}
}
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (_fonts != null)
{
foreach (Font font in _fonts)
{
font.Dispose();
}
_fonts = null;
}
if (_foreBrush != null)
{
_foreBrush.Dispose();
_foreBrush = null;
}
}
public override Color ForeColor
{
get
{
return base.ForeColor;
}
set
{
base.ForeColor = value;
if (_foreBrush != null)
{
_foreBrush.Dispose();
}
_foreBrush = null;
}
}
private Brush ForeBrush
{
get
{
if (_foreBrush == null)
{
_foreBrush = new SolidBrush(ForeColor);
}
return _foreBrush;
}
}
protected override void OnDrawItem(DrawItemEventArgs e)
{
base.OnDrawItem(e);
if (e.Index < 0)
return;
e.DrawBackground();
e.DrawFocusRectangle();
Rectangle bounds = e.Bounds;
Font font = (Font)Items[e.Index];
e.Graphics.DrawString(font.Name, font, ForeBrush, bounds.Left, bounds.Top);
}
}
public partial class MyFontDialog : Form
{
private FontListBox _fontListBox;
public MyFontDialog()
{
InitializeComponent();
_fontListBox = new FontListBox();
_fontListBox.Dock = DockStyle.Fill;
Controls.Add(_fontListBox);
}
}
我主持這個項目在SourceForge https://sourceforge.net/p/newfontpicker/
FontDialog類已經過濾非TrueType字體。這裏真正的解決方案是卸載具有不良元數據的字體。 – 2011-12-29 15:13:40
否。請參閱http://c-madeeasy.blogspot.com/2011/11/unsolved-this-is-not-true-type-font.html – techno 2011-12-29 15:15:08
它試圖過濾掉這些opentype字體,但仍然存在一些字體。參見http://connect.microsoft.com/VisualStudio/feedback/details/708872/this-is-not-a-true-type-font-only-true-type-fonts-are-accepted-exception – techno 2011-12-29 15:16:18