Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 16:

Динамическая компоновка формы

Класс управления раскрывающимся списком цвета ColorComboBox

Выберем несколько цветов для нашего списка управления цветом, которые приведены в таблице.

Из-за трудностей перевода не будем вставлять в список русские названия цветов, а расположим в нем образцы цвета вместе с их оригинальными названиями.

Вот класс-расширение ColorComboBox, размещенный в отдельном одноименном файле

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
    // Расширяем библиотечный ComboBox на управление цветом
    class ColorComboBox : ComboBox
    {
    public ColorComboBox()// Конструктор начальных настроек
      {
      // Заполняем источник данных ComboBox массивом названий цветов
      this.DataSource = new string[] {
        "Black", "Maroon", "Green", 
  "Olive", "Navy", "Purple", 
  "Teal", "Gray", "Silver", 
  "Red", "Lime", "Yellow",
        "Blue", "Fuchsia", "Aqua", 
  "White"
        };
    
      // Устанавливаем режим работы как раскрывающийся список
      this.DropDownStyle = ComboBoxStyle.DropDownList;
      // Цветные прямоугольники в списке будет отрисовывать владелец
      this.DrawMode = DrawMode.OwnerDrawFixed;
      // Устанавливаем высоту элементов списка,
      // равную высоте унаследованного системного шрифта
      this.ItemHeight = this.Font.Height;
      }
    
        // Свойство чтения/установки цвета
        public Color Color
        {
        get { return Color.FromName(this.SelectedItem.ToString()); }
        set
          {
          // Ищем переданный цвет и позиционируем список
          this.SelectedItem = value.Name;
          /*// Либо вот такой код - вместо предыдущей строки!!!
          int index = this.FindStringExact(value.Name);
          if (index != -1)
            this.SelectedIndex = index;
          //*/
          }
        }
    
        // Переопределяем событие списка, требующее перерисовки элемента
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            // Определяем контекст устройства
            Graphics gr = e.Graphics;
    
            // Вычисляем размеры для прямоугольника самого цвета
            // как левая верхняя точка привязки, ширина, высота
            // по параметрам элемента списка
            Rectangle rectColor = new Rectangle(e.Bounds.Left, 
                e.Bounds.Top,
                2 * e.Bounds.Height, 
                e.Bounds.Height);
            // Раздувает прямоугольник указанным количеством
            rectColor.Inflate(-1, -1);
    
            // Вычисляем размеры для прямоугольника названия цвета
            // как левая верхняя точка привязки, ширина, высота
            Rectangle rectText = new Rectangle(e.Bounds.Left + 
    2 * e.Bounds.Height,
                e.Bounds.Top,
                e.Bounds.Width - 2 * e.Bounds.Height,
                e.Bounds.Height);
    
            // Рисуем фон заданным цветом
            e.DrawBackground();// Нацелились на фон
            gr.DrawRectangle(Pens.Black, rectColor);// Рамка
            gr.FillRectangle(
                new SolidBrush(Color.FromName
      (this.Items[e.Index].ToString())),
                rectColor);// Заливка
    
            // Рисуем название цвета
            gr.DrawString(this.Items[e.Index].ToString(), base.Font,
                new SolidBrush(e.ForeColor), rectText);
        }
    }
}
Листинг 16.16 . Код выбора цвета шрифта в файле ColorComboBox.cs
Максим Филатов
Максим Филатов

Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет:

Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.

 

Как активировать код?

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974