Как отобразить FontFamily в Combobox? - PullRequest
1 голос
/ 18 ноября 2011

У меня есть поле со списком, и мне нужно заполнить его всеми доступными шрифтами в системе - их фактическим названием, стилем и т. Д.

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

Я хочу, чтобы поле со списком выглядело следующим образом:

someone else's combobox

Не так, как у меня ниже:

actual Image of the winform with combobox

Ответы [ 2 ]

1 голос
/ 19 ноября 2011

Вот мой ответ с рабочим кодом.

  • создайте новый проект и откройте свою главную winform.Откройте свой ToolBox и поместите комбинированный список в свою основную форму.
  • Откройте окно свойств для комбинированного списка, который вы только что поместили в winform.
  • Установите следующие свойства для вашего комбинированного списка следующим образом: DrawMode = OwnerDrawFixed, DropDownStyle = DropDownList, FormattingEnabled = true, GenerateMemeber = true, IntegralHeight = false и ItemHeight = 25.
    • Создание метода Mainform_Load двойным щелчком по основной форме winи скопируйте следующий код в соответствии с вашим методом загрузки.

,

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, отображающий шрифты следующим образом:

ComboBox displaying Font Text

1 голос
/ 18 ноября 2011

Вот кое-что, что вам наиболее вероятно поможет: 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

...