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

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

 

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