Как отобразить FontFamily в Combobox?
У меня есть поле со списком, и мне нужно заполнить его всеми доступными шрифтами в системе - их реальное имя, стиль и т. Д.
Из всей информации, которую я могу найти в Интернете, я могу собрать событие DrawItem, но я продолжаю сталкиваться со следующей ошибкой: "Невозможно вызвать не делегат типа" System.Drawing.Font "". Фактически, я заимствовал строку для линия с других сайтов и внесла некоторые изменения. Итак, я подумал, что это должно сработать.
Вот как я заполняю список элементов в ComboBox:
method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs);
var thefont:Font;
begin
if (ComboBox4.Items.Count>0) then
ComboBox4.Items.Clear;
for each oneFontFamily in FontFamily.Families do
begin
if (oneFontFamily.IsStyleAvailable(FontStyle.Regular)) then
thefont := new Font(oneFontFamily.Name, 15)
else if (oneFontFamily.IsStyleAvailable(FontStyle.Bold)) then
thefont := new Font(oneFontFamily.Name, 15,FontStyle.Bold)
else if (oneFontFamily.IsStyleAvailable(FontStyle.Italic)) then
thefont := new Font(oneFontFamily.Name, 15,FontStyle.Italic)
else if (oneFontFamily.IsStyleAvailable(FontStyle.Strikeout)) then
thefont := new Font(oneFontFamily.Name, 15, FontStyle.Strikeout)
else if (oneFontFamily.isStyleAvailable(FontStyle.Underline)) then
thefont := new Font(oneFontFamily.Name, 15, FontStyle.Underline);
if (thefont <> nil) then
ComboBox4.Items.Add(theFont);
end;
end;
Вот событие drawitem combobox4:
method MainForm.comboBox4_DrawItem(sender: System.Object; e: System.Windows.Forms.DrawItemEventArgs);
begin
if e.index = -1 then exit;
// Draw the background of the item
e.DrawBackground();
// Should we draw the focus rectangle
if ((e.State and DrawItemState.Focus) <> DrawItemState.Checked) then
e.DrawFocusRectangle();
// Create a new background brush.
var b := new SolidBrush(e.ForeColor);
// Draw the item.
// This line raises the above mentioned error.
e.Graphics.DrawString(FontFamily(comboBox4.Items[e.Index]).Name, font(comboBox4.Items[e.Index]), b, e.Bounds.x,e.Bounds.y); <<===== Here is where the error is raised
end;
ОБНОВЛЕНО: я изменил строку, вызвавшую ошибку, и теперь она компилируется без ошибок, но, как я уже говорил в своем комментарии, она не рисует шрифты в их собственном стиле и размере.
e.Graphics.DrawString(FontFamily(comboBox4.Items[e.Index]).Name, new font((comboBox4.Items[e.Index] as Font), (comboBox4.Items[e.Index] as Font).Style), b, e.Bounds.x,e.Bounds.y);
ОБНОВЛЕНИЕ: я забыл установить DrawMode в OwnerDrawFixed. Теперь он вызывает событие DrawItem, но все еще не рисует шрифты в их собственном стиле и размерах.
Я хочу, чтобы поле со списком выглядело следующим образом:
Не так, как мой ниже:
2 ответа
Вот мой ответ с рабочим кодом.
- создайте новый проект и откройте свою главную форму win. Откройте свой ToolBox и поместите комбинированный список на свою форму.
- Откройте окно свойств для выпадающего списка, который вы только что поместили в winform.
- Установите следующие свойства для вашего комбинированного списка следующим образом: DrawMode = OwnerDrawFixed, DropDownStyle = DropDownList, FormattingEnabled = true, GenerateMemeber = true, IntegralHeight = false и ItemHeight = 25.
- Создайте метод Mainform_Load, дважды щелкнув основную winform, и скопируйте следующий код в соответствии с вашим методом загрузки.
,
Method MainForm.MainForm_Load(sender: System.Object; e:System.EvenArgs);
var
thefont:Font;
begin
if (ComboBox1.Items.Count>0) then
ComboBox1.Items.Clear;
for each oneFontFamily in FontFamily.Families do
begin
if (oneFontFamily.IsStyleAvailable(FontStyle.Regular)) then
thefont := new Font(oneFontFamily.Name, 12)
else if (oneFontFamily.IsStyleAvailable(FontStyle.Bold)) then
thefont := new Font(oneFontFamily.Name, 12,FontStyle.Bold)
else if (oneFontFamily.IsStyleAvailable(FontStyle.Italic)) then
thefont := new Font(oneFontFamily.Name, 12,FontStyle.Italic)
else if (oneFontFamily.IsStyleAvailable(FontStyle.Strikeout)) then
thefont := new Font(oneFontFamily.Name, 12, FontStyle.Strikeout)
else if (oneFontFamily.isStyleAvailable(FontStyle.Underline)) then
thefont := new Font(oneFontFamily.Name, 12, FontStyle.Underline);
if (thefont <> nil) then
ComboBox1.Items.Add(theFont);
end;
end;
- Создайте событие DrawItem для вашего comboBox и соответственно скопируйте следующий код в событие drawitem.
'
Method MainForm.ComboBox1_DrawItem(sender:System.Object; e: System.Windows.Forms.DrawItemEventArgs);
var theobject:Font;
begin
if e.Index=-1 then exit;
// Draw the background of the item
e.DrawBackground();
// Should we draw the focus rectangle
if ((e.State and DrawItemState.Focus) <> DrawItemState.Checked) then
e.DrawFocusRectangle();
// Create a new background brush.
var b := new SolidBrush(e.ForeColor);
theobject := (ComboBox1.Items[e.Index] as font);
// Draw the item.
e.Graphics.DrawString(theobject.Name, theObject, b,e.Bounds);
end;
Когда вы все это сделали и запустили, у вас должен быть combobox1, отображающий шрифты следующим образом:
Вот что вам, скорее всего, поможет: http://www.vbaccelerator.com/home/net/code/controls/ListBox_and_ComboBox/Font_Picker/article.asp
Не забудьте также реализовать необходимую инфраструктуру из этой статьи: http://www.vbaccelerator.com/home/NET/Code/Controls/ListBox_and_ComboBox/Icon_ComboBox/article.asp