Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 158 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 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. Ввожу код на сайте, пишет:

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

 

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