Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 4.doc
Скачиваний:
32
Добавлен:
15.04.2015
Размер:
215.04 Кб
Скачать

Изменяем цвет пунктов списка

Зададим глобально

public partial class Form1 : Form

{

private string[] sGrade;

......

В обработчике события нажатия кнопки 1 пишем код инициализации списка

private void toolStripButton1_Click(object sender, EventArgs e)

{

//Разрешаем событие DrawItem

comboBox1.DrawMode =

System.Windows.Forms.DrawMode.OwnerDrawVariable;

//Ширина списка

comboBox1.DropDownWidth = 300;

//Стиль DropDownStyl для рисунка 3 слева

comboBox1.DropDownStyle = ComboBoxStyle.Simple;

//Стиль DropDownStyl для рисунка 3 права

comboBox1.DropDownStyle = ComboBoxStyle.DropDown;

sGrade = new string[]{"Отлично", "Хорошо",

"Удовлетворительно","Неудовлетворительно"};

//устанавливаем данные

comboBox1.DataSource = sGrade;

}

Так как DrawMode =OwnerDrawVariable, то мы можем выполнить перерисовку по своему усмотрению содержимого ComboBox, как это уже делалось выше. Создаем событие для ComboBox comboBox1_DrawItem, в котором и отображаем пункты требуемыми цветами и шрифтами:

private void comboBox1_DrawItem(object sender,

System.Windows.Forms.DrawItemEventArgs e)

{

float fSize = 0;

System.Drawing.Font font;

FontFamily fontfamily = null;

System.Drawing.Color сolor = new System.Drawing.Color();

//В зависимости от прорисовываемого пункта меняем параметры шрифта

switch(e.Index)

{

case 0:

size = 30;

сolor = System.Drawing.Color.Red;

fontfamily = FontFamily.GenericSansSerif;

break;

case 1:

size = 25;

сolor = System.Drawing.Color.Orange;

fontfamily = FontFamily.GenericMonospace;

break;

case 2:

size = 20;

сolor = System.Drawing.Color.Purple;

fontfamily = FontFamily.GenericSansSerif;

break;

case 3:

size = 15;

сolor = System.Drawing.Color.Blue;

fontfamily = FontFamily.GenericSerif;

break;

}

// Рисуем фон и, таким образом, очищаем поле

e.DrawBackground();

// Рисуется квадрат, заполненный различными цветами

//Величина квадрата базируется на длине имени пункта

Rectangle rectangle = new Rectangle(2,e.Bounds.Top+2,

e.Bounds.Height, e.Bounds.Height-4);

//Рисуем эллипс слева от пункта

e.Graphics.FillEllipse(new SolidBrush(сolor),rectangle);

//Можно нарисовать квадратик

//e.Graphics.FillRectangle(new SolidBrush(animalColor),rectangle);

// Пишем строку заданны шрифтом

font = new Font(fontfamily, size, FontStyle.Bold);

e.Graphics.DrawString(sGrade[e.Index],font,

System.Drawing.Brushes.Black,

new RectangleF(e.Bounds.X+rectangle.Width,e.Bounds.Y,

e.Bounds.Width, e.Bounds.Height));

// Селекция при нахождении мышки над пунктом списка

e.DrawFocusRectangle();

}

И в завершение необходимо сообщить Windows размеры пунктов - для этого создадим для контрола обработчик события MeasureItem, который при стиле OWNERDRAWVARIABLE вызывается при отрисовки каждого элемента в списке (иначе только один раз).

private void comboBox1_MeasureItem(object sender,

System.Windows.Forms.MeasureItemEventArgs e)

{

switch(e.Index)

{

case 0:

e.ItemHeight = 40;

break;

case 1:

e.ItemHeight = 35;

break;

case 2:

e.ItemHeight = 30;

break;

case 3:

e.ItemHeight = 25;

break;

}

e.ItemWidth = 300;

}

Результат выполнения показан на Рис.4.

Рис.4. Изменения цвета и шрифтов пунктов списков