У меня есть поле со списком, и мне нужно заполнить его всеми доступными шрифтами в системе - их фактическим названием, стилем и т. Д.
Из всей информации, которую я могу найти в Интернете, я могусобрать событие 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, но все еще не рисует шрифты в их собственном стиле и размерах.
Я хочу, чтобы поле со списком выглядело следующим образом:
Не так, как у меня ниже: