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

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

Класс самого диалогового окна выбора шрифта NewFontDialog

Теперь скомпонуем все необходимые элементы на форме, которая будет представлять наше диалоговое окно NewFontDialog выбора шрифта. Код можно разместить в отдельном одноименном файле NewFontDialog.cs

using System;
using System.Drawing;
using System.Windows.Forms;
    
namespace Test
{
// Расширяем библиотечный класс Form
class NewFontDialog : Form
  {
  // Видимые поля-ссылки
  ComboBox comboFont;// Для списка "Шрифт:"
  ComboBox comboSize;// Для списка "Размер:"
  StyleComboBox comboStyle;// Для нашего списка "Начертание:"
  // Для флажков "Зачеркнутый" и "Подчеркнутый"
  CheckBox checkStrikeout, checkUnderline;
  ColorComboBox comboColor;// Для нашего списка "Цвет:"
  // Для надписей "Цвет:" и "Набор символов:"
  Label labelColor, labelSample;
    
  public NewFontDialog()// Конструктор диалогового окна
    {
    // Определяем стиль формы как диалоговое окно
    // с фиксированными размерами
    this.FormBorderStyle = FormBorderStyle.FixedDialog;
    // Отключаем системные кнопки
    this.MinimizeBox = this.MaximizeBox = false;
    // Не отображать в панели задач Windows
    this.ShowInTaskbar = false;
    this.Text = "Шрифт (самодельный диалог)";
    // Подстраиваться под содержимое
    this.AutoSize = true;
    
    // Создаем и настраиваем объект панели табличной компоновки
    TableLayoutPanel table = new TableLayoutPanel();
    table.Parent = this;// Привязали к форме
    table.AutoSize = true;// Подстраиваться под содержимое
    table.RowCount = 3;     // Количество строк таблицы
    table.ColumnCount = 4;  // Количество столбцов таблицы
    // Задаем отступы содержимого ячеек от краев ячеек, равные
    // высоте установленного в базовом классе Form шрифта 
    table.Padding = new Padding(base.Font.Height);
    
    // ***** Заполняем три ячейки верхней строки таблицы *****
    Label lbl = new Label();
    lbl.Text = "Шрифт:";
    lbl.AutoSize = true;// Подстроиться под текст
    table.Controls.Add(lbl, 0, 0);// Отдали ячейке (col, row)
    
    lbl = new Label();
    lbl.Text = "Начертание:";
    lbl.AutoSize = true;// Подстроиться под текст
    table.Controls.Add(lbl, 1, 0);// Отдали ячейке (col, row)
    
    lbl = new Label();
    lbl.Text = "Размер:";
    lbl.AutoSize = true;// Подстроиться под текст
    table.Controls.Add(lbl, 2, 0);// Отдали ячейке (col, row)
    
    // ***** Заполняем три ячейки средней строки таблицы *****
    // Заполняем ячейку с наименованиями шрифтов
    comboFont = new ComboBox();
    comboFont.DropDownStyle = ComboBoxStyle.Simple;// Простой список
    // Привязать к верхней и нижней границам ячейки
    //comboFont.Anchor = AnchorStyles.Top | AnchorStyles.Bottom;
    comboFont.Dock = DockStyle.Fill;// Распахнуть на всю ячейку
    // Подписываемся на событие выбора и регистрируем общий обработчик
    comboFont.TextChanged += new EventHandler(combo_Changed);
    // Заполняем поля списка именами семейства шрифтов
    foreach (FontFamily font in FontFamily.Families)
    {
    comboFont.Items.Add(font.Name);
    }
    // Позиционируем поле на текущий базовый шрифт
    comboFont.SelectedItem = base.Font.FontFamily.Name;
    table.Controls.Add(comboFont, 0, 1);// Отдали ячейке (col, row)
    
    // Заполняем ячейку списка стилей
    comboStyle = new StyleComboBox();// Наш класс
    comboStyle.DropDownStyle = ComboBoxStyle.Simple;// Простой список
    // Привязать к верхней и нижней границам ячейки
    comboStyle.Anchor = AnchorStyles.Top | AnchorStyles.Bottom;
    // Подписываемся на событие выбора и регистрируем общий обработчик
    comboStyle.TextChanged += new EventHandler(combo_Changed);
    // Принудительно вызываем обработчик
    // combo_Changed(comboStyle, new EventArgs());
    table.Controls.Add(comboStyle, 1, 1);
   // Отдали ячейке (col, row)
    
    // Заполняем ячейку списка выбора размеров шрифта
    comboSize = new ComboBox();
    comboSize.DropDownStyle = ComboBoxStyle.Simple;// Простой список
    // Привязать к верхней и нижней границам ячейки
    comboSize.Anchor = AnchorStyles.Top | AnchorStyles.Bottom;
    comboSize.Width = 5 * base.Font.Height;// Ширина
    // Подписываемся на событие выбора и регистрируем общий обработчик
    comboSize.TextChanged += new EventHandler(combo_Changed);
    // Заполняем поля списка стандартными размерами шрифтов
    for (int i = 8; i < 12; i++)
              comboSize.Items.Add(i);
    for (int i = 12; i < 30; i += 2)
              comboSize.Items.Add(i);
    for (int i = 36; i <= 72; i += 12)
              comboSize.Items.Add(i);
    comboSize.SelectedIndex = 0;// Выделяем первое поле списка
    table.Controls.Add(comboSize, 2, 1);// Отдали ячейке (col, row)
    
    // ***** Заполняем три ячейки последней строки таблицы *****
    // Создаем экземпляр нашей ранее созданной рамки GroupPanel
    GroupPanel groupPanel = new GroupPanel();
    groupPanel.Text = "Видоизменение";
    table.Controls.Add(groupPanel, 0, 2);// Отдали ячейке (col, row)
    
    // Размещаем в панели GroupPanel флажок "Зачеркнутый"
    checkStrikeout = new CheckBox();
    checkStrikeout.Text = "Зачеркнутый";
    checkStrikeout.AutoSize = true;
    // Подписываем на событие анонимный обработчик, вызывающий
    // наш метод модификации текущего стиля в списке новым атрибутом
    checkStrikeout.Click += delegate { ShowNewFont(); };
    checkStrikeout.Parent = groupPanel;// Отдали панели
    
    // Размещаем в панели GroupPanel флажок "Подчеркнутый"
    checkUnderline = new CheckBox();
    checkUnderline.Text = "Подчеркнутый";
    checkUnderline.AutoSize = true;
    checkUnderline.Click += delegate { ShowNewFont(); };
    checkUnderline.Parent = groupPanel;// Отдали панели
    
    // Размещаем в панели GroupPanel текстовую метку "Цвет:"
    labelColor = new Label();
    labelColor.Text = "Цвет:";
    labelColor.AutoSize = true;
    labelColor.Visible = false;// Вначале отключили
    checkUnderline.Parent = groupPanel;// Отдали панели
    
    // Размещаем в панели GroupPanel поле со списком цветов
    comboColor = new ColorComboBox();
    comboColor.Anchor = AnchorStyles.Bottom;
    // Подписываемся на события выбора и программного
    // изменения названия цвета и регистрируем общий обработчик
    comboColor.SelectedValueChanged += new EventHandler(combo_Changed);
    comboColor.Visible = false;// Вначале отключили
    comboColor.Parent = groupPanel;// Отдали панели
    
    // Заполняем ячейку таблицы для размещения образца
    groupPanel = new GroupPanel();// Рамка
    groupPanel.Text = "Образец";
    table.Controls.Add(groupPanel, 1, 2);// Отдали ячейке (col, row)
    // Объединяем две средних ячейки последней строки
    table.SetColumnSpan(groupPanel, 2);
    groupPanel.Dock = DockStyle.Top;// Привязать к ячейке сверху 
    
    // Сам образец
    labelSample = new Label();
    labelSample.Text = "AaBbБбФф";
    labelSample.Font = base.Font;// Шрифт от формы
    // Текст размещать в середине текстовой метки
    labelSample.TextAlign = ContentAlignment.MiddleCenter;
    labelSample.BorderStyle = BorderStyle.Fixed3D;// Рельефно
    int width = groupPanel.Width - 2 * base.Font.Height;// Отнимаем Padding
    labelSample.Size = new Size(width, 3 * base.Font.Height);
    labelSample.Parent = groupPanel;// Отдали рамке
    
    // Создаем кнопки в последнем столбце средней строки
    // Панель FlowLayoutPanel для кнопок
    FlowLayoutPanel flow = new FlowLayoutPanel();
    flow.AutoSize = true;
    flow.FlowDirection = FlowDirection.TopDown;// Перетекать сверху вниз
    table.Controls.Add(flow, 3, 1);// Отдали ячейке (col, row)
    
    // Помещаем в панель кнопку OK
    Button btn = new Button();
    btn.Text = "OK";
    btn.AutoSize = true;
    btn.DialogResult = DialogResult.OK;// Для передачи форме
    this.AcceptButton = btn;// Для передачи форме
    btn.Parent = flow;// Отдали панели
    
    // Помещаем в панель кнопку Cancel
    btn = new Button();
    btn.Text = "Отмена";
    btn.AutoSize = true;
    btn.DialogResult = DialogResult.Cancel;// Для передачи форме
    this.CancelButton = btn;// Для передачи форме
    btn.Parent = flow;// Отдали панели
    }
    
    // Назначаем свое свойство Font
    new public Font Font
      {
      // Извлекаем настройки шрифта из образца
      get
      {
      return labelSample.Font;
      }
      // Препарируем объект Font и полученную информацию 
      // рассовываем по элементам пользовательского интерфейса
      set 
      {
      // Устанавливаем шрифт образца
      labelSample.Font = value;
      // Позиционируем поле списка шрифтов
      comboFont.SelectedItem = value.FontFamily.Name;
    
      // Заполняем список стилей для заданного шрифта
      comboStyle.FamilyName = value.FontFamily.Name;
      // Позиционируем поле списка стилей
      comboStyle.FontStyle = value.Style;
    
      // Включаем флажки, если есть дополнительные стили
      checkStrikeout.Checked = (value.Style & 
     FontStyle.Strikeout) != 0;
      checkUnderline.Checked = (value.Style & 
    FontStyle.Underline) != 0;
    
      // Извлекаем из объекта Font размер шрифта в пунктах
      // и сохраняем в списке
      comboSize.SelectedItem = value.SizeInPoints;
      comboSize.Text = value.SizeInPoints.ToString();
      }
      }
    
        // Собственное свойство диалогового окна
        // Имеет значение текущей установки списка цвета
        // Свойство ждет структуру System.Drawing.Color
        public Color Color
        {
            get
            {
                return comboColor.Color;
            }
            set
            {
                comboColor.Color = value;
            }
        }
    
        // Свойство проверки и управления видимостью 
        // интерфейсного блока "Цвет:"
        public bool ShowColor
        {
            get
            {
                // Проверяем видимость
                return comboColor.Visible;
            }
            set
            {
                // Переключаем видимость
                labelColor.Visible = comboColor.Visible = value;
            }
        }
    
        // Свойство русского названия текущего стиля 
        // Перекинули диалоговому окну из класса StyleComboBox
        public string StyleNameRus
        {
            get { return comboStyle.StyleNameRus; }
        }
    
        // Наш метод модификации текущего стиля в списке новым атрибутом
        void ShowNewFont()
        {
        FontStyle style;
    
        // Безопасный код
        try
        {
        style = comboStyle.FontStyle;
        }
        catch
        {
        return;
        }
    
        // Готовим образец модифицированного стиля
        if (checkStrikeout.Checked)
                style |= FontStyle.Strikeout;
        if (checkUnderline.Checked)
                style |= FontStyle.Underline;
    
        // Создаем новый шрифт и применяем его для текстовой метки
        try
        {
        System.Drawing.Font font = new Font(comboFont.Text,
                    float.Parse(comboSize.Text), style);
        labelSample.Font = font;
        }
        catch { }// Ничего не делать, но присутствия требует синтаксис
        }
    
        // Общий обработчик
        void combo_Changed(object sender, EventArgs e)
        {
        ComboBox combo = sender as ComboBox;// Преобразуем ссылку
        if (combo == null)
                return;// Не является объектом ComboBox
    
        // Меняем цвет метки образца, если она уже создана
        if (combo == comboColor && labelSample != null)
        {
        labelSample.ForeColor = comboColor.Color;
        return;
        }
    
        if (combo == comboFont)
        {
        // Вычисляем индекс запрошенного шрифта
        int index = comboFont.FindStringExact(comboFont.Text);
    
        // Если нашли, выделяем шрифт и извлекаем для него стили
        // при условии, что объект ComboBox стилей уже создан
        if (index != -1 && comboStyle != null)
        {
        comboFont.SelectedIndex = index;
        comboStyle.FamilyName = comboFont.Text;
        }
        }
    
        // Дополняем стили и меняем шрифт образца
        ShowNewFont();
        }
    }
}
Листинг 16.17 . Класс диалогового окна выбора шрифта NewFontDialog
Максим Филатов
Максим Филатов

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

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

 

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

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