Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 16:

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

Класс управления списком стиля шрифта StyleComboBox

Разработаем класс StyleComboBox, который будет реализовывать поддержку стилей шрифтов и его экземпляр будет размещен в ячейке под текстовой меткой "Начертание". Этот класс будет расширением класса стандартного элемента управления поля со списком ComboBox. В нем нужно учесть, что не все семейства шрифтов поддерживают полный набор стилей:

Таблица 16.4.
Regular - обычный
Bold - полужирный
Italic - курсив
Bold Italic - полужирный курсив

а также нужно учесть дополнительные стили, применимые ко всем вышеперечисленным стилям:

Таблица 16.5.
Strikeout - зачеркнутый
Underline - подчеркнутый

Этот класс должен самостоятельно заполнять список доступными стилями при выборе пользователем конкретного шрифта, а также поддерживать поле списка при щелчке на соответствующем стиле. Вот этот класс-расширение StyleComboBox, размещенный в отдельном одноименном файле

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
    // Расширяем библиотечный ComboBox на управление стилем
    class StyleComboBox : ComboBox
    {
        // Конструктор настройки стиля как списка с редактируемым полем
        public StyleComboBox()
        {
            this.DropDownStyle = ComboBoxStyle.DropDown;// По умолчанию
        }
    
        // Свойство типа перечисления System.Drawing.FontStyle
        // Обеспечивает управление содержимым самого поля списка
        // Преобразует название стиля в поле в стиль и наоборот
        public FontStyle FontStyle
        {
        // Для того, чтобы заполнять русскими названиями стилей
        get
        {
        // Возвращаем стиль, соответствующий названию в поле
        if (this.SelectedItem.ToString() == "жирный курсив")
          return FontStyle.Bold | FontStyle.Italic;
        else if (this.SelectedItem.ToString() == "жирный")
          return FontStyle.Bold;
        else if (this.SelectedItem.ToString() == "курсив")
          return FontStyle.Italic;
        else
          return FontStyle.Regular;
        }
        set 
        {
        // Преобразуем выбранный в списке стиль 
        // в название стиля в поле списка
        // Применяется прием - побитовая проверка по маске
        if ((value & FontStyle.Bold)!=0 
          && (value & FontStyle.Italic) != 0)
        this.SelectedItem = "жирный курсив";
        else if ((value & FontStyle.Bold) != 0)
           this.SelectedItem = "жирный";
        else if ((value & FontStyle.Italic) != 0)
          this.SelectedItem = "курсив";
        else
          this.SelectedItem = "обычный";
        }
        }
    
        // Метод добавляет в список название стиля, если он есть в шрифте,
        // но отсутствует в списке, или удаляет из списка старое название,
        // если оно есть в списке, но соответствующий стиль отсутствует в шрифте
        void TryStyle(string strFamilyName, FontStyle style, string strStyleName)
        {
        // Все параметры входные
        // strFamilyName - имя шрифта
        // style - стиль, соответствующий названию
        // strStyleName - название стиля в списке
    
        // Ищем название в списке. Если не найдено, то возвращается -1
        int index = this.FindStringExact(strStyleName);
    
        // Безопасный код
        try
        {
        // Пробуем создать объект заданного шрифта. Если он есть,
        // то исключение не возникает, и если ранее не найден в списке,
        // добавляем его название в список
        new Font(strFamilyName, 12, style);
        if (index == -1)
          Items.Add(strStyleName);
        }
        catch
        {
        // На случай, если при смене шрифта список не очищаем!!!
        // Откат, заказанного стиля в данном шрифте нет. Корректируем 
        // список, если в нем осталось название стиля от прежнего шрифта
        if (index != -1)
          {
          this.Items.Remove(strStyleName);
          }
        }
        }
    
        // Свойство, заполняющее список стилями для заданного шрифта
        public string FamilyName
        {
        set
        {
        // Для сохранения выделенного стиля при смене шрифта
        string oldStyleName = "";
        if (this.SelectedIndex != -1)// Игнорируем первый запуск
          oldStyleName = this.SelectedItem.ToString();
    
        // Очищаем список и заполняем заново,
        // чтобы соблюсти порядок следования названий стилей
        // необязательно, но тогда названия будут - как придется
        this.Items.Clear();
    
        // Выстраиваем порядок стилей как в стандартном диалоге
        TryStyle(value, FontStyle.Regular, "обычный");
        TryStyle(value, FontStyle.Italic, "курсив");
        TryStyle(value, FontStyle.Bold, "жирный");
        TryStyle(value, FontStyle.Bold | FontStyle.Italic, 
    "жирный курсив");
    
        // Выделяем позицию списка
        int index = this.FindStringExact(oldStyleName);
        if (index != -1)// Если выделенный стиль имеется и в новом шрифте
          this.SelectedIndex = index;
        else // Нет ранее выделенного стиля в новом шрифте, сброс в начало
          this.SelectedIndex = 0;
        }
        }
    
        // Свойство для возврата русского названия текущего стиля
        public string StyleNameRus
        {
            get { return this.SelectedItem.ToString(); }
        }
    }
}
Листинг 16.15 . Код выбора стилей шрифта в файле StyleComboBox.cs
Максим Филатов
Максим Филатов

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

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

 

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