Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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. Ввожу код на сайте, пишет:

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

 

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

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