Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Динамическая компоновка формы
Большой пример разработки диалогового окна выбора шрифта
Попробуем разработать свою программу, которая дублирует стандартный диалог выбора шрифта и реализует максимум его функциональности. Для начала приведем программу, вызывающую этот стандартный диалог, чтобы посмотреть, как он выглядит. Вот эта простая вызывающая программа
using System.Windows.Forms; namespace Test { // Запуск class Program { static void Main() { // Создаем объект окна стандартного диалога выбора шрифта FontDialog fontDialog = new FontDialog(); // Показать дополнительные части диалогового окна fontDialog.ShowEffects = true; fontDialog.ShowColor = true; //fontDialog.ShowApply = true;// Кнопка "Применить" //fontDialog.ShowHelp = true; // Кнопка "Справка" // Показать само окно fontDialog.ShowDialog(); } } }Листинг 16.13 . Программа вызова стандартного диалога FontDialog
Вот так примерно должен выглядеть наш диалог выбора шрифта
Можно заметить, что элементы управления стандартного диалогового окна размещены в таблице, которая имеет 3 строки и 4 столбца. Код каждой сложной части диалога изолируем в отдельные классы и поместим в отдельные одноименные файлы. Ниже приведены все составляющие данного примера.
Самоподстраивающийся контейнер GroupPanel
Приведем рассмотренный ранее код компоновочного контейнера с рамкой. Предварительно удалим из него свойство Check, связанное с размещением радиокнопок и организацией их согласованной работы. Хотя можно это свойство и не удалять - все равно мы его использовать в данном примере не будем. Вот код панели, который нужно разместить в отдельном файле GroupPanel.cs
using System; using System.Drawing; using System.Windows.Forms; namespace Test { // Класс расширения стандартной панели размещения class GroupPanel : FlowLayoutPanel { // Поля класса для видимости в методах int xDpi, yDpi; new public string Text; // Скрываем наследуемое поле // Надпись в рамке // Конструктор public GroupPanel() { // Перетекание по столбцам this.FlowDirection = FlowDirection.TopDown; // Отключаем автоматический переток элементов this.WrapContents = false; //Включили способность менять размеры this.AutoSize = true; // Разрешить панели растягиваться и сжиматься this.AutoSizeMode = AutoSizeMode.GrowAndShrink; // Создаем временный контекст устройства Graphics gr = this.CreateGraphics(); // Извлекаем текущее разрешение экрана xDpi = (int)gr.DpiX; yDpi = (int)gr.DpiY; // Освобождаем критичный ресурс - контекст устройства gr.Dispose(); // Устанавливаем отступы внутри рамки контейнера this.Padding = new Padding(xDpi / 10, yDpi / 10 + Font.Height, xDpi / 10, yDpi / 10); } // Переопределяем виртуальный обработчик изменения шрифта protected override void OnFontChanged(EventArgs e) { base.OnFontChanged(e);// Базовый обработчик this.Padding = new Padding(this.Padding.Left, yDpi / 10 + this.Font.Height, this.Padding.Right, this.Padding.Bottom); } // Переопределяем виртуальный обработчик перерисовки формы // Сами перекомпоновываем элементы и перерисовываем результат protected override void OnPaint(PaintEventArgs e) { // Извлекаем контекст устройства Graphics gr = e.Graphics; // Смещение int yIdent = yDpi / 25 + this.Font.Height / 2; int xIdent1 = xDpi / 10; int xIdent2;// Пока просто объявили // Отображаем надпись внутри рамки, если она задана if (this.Text != null && this.Text.Length > 0) { gr.DrawString( " " + this.Text + " ", this.Font, new SolidBrush(this.ForeColor), xIdent1, yDpi / 25 ); xIdent2 = xIdent1 + (int)(gr.MeasureString( " " + this.Text + " ", this.Font).Width) + 7;// Увеличили отступ справа } else { xIdent2 = xIdent1; } // Создаем перья стандартного цвета и рисуем рамку Pen pnDark = new Pen(ControlPaint.Dark (BackColor));// Темный Pen pnLight = new Pen(ControlPaint.Light (BackColor));// Светлый // Рисуем темную рамку gr.DrawLine(pnDark, xIdent1, yIdent, 0, yIdent); gr.DrawLine(pnDark, 0, yIdent, 0, this.Height - 2); gr.DrawLine(pnDark, 0, this.Height - 2, this.Width - 2, this.Height - 2); gr.DrawLine(pnDark, this.Width - 2, this.Height - 2, this.Width - 2, yIdent); gr.DrawLine(pnDark, this.Width - 2, yIdent, xIdent2, yIdent); // Рисуем светлую рамку gr.DrawLine(pnLight, xIdent1, yIdent + 1, 1, yIdent + 1); gr.DrawLine(pnLight, 1, yIdent + 1, 1, this.Height - 3); gr.DrawLine(pnLight, 0, this.Height - 1, this.Width - 1, this.Height - 1); gr.DrawLine(pnLight, this.Width - 1, this.Height - 1, this.Width - 1, yIdent); gr.DrawLine(pnLight, this.Width - 3, yIdent + 1, xIdent2, yIdent + 1); } } }Листинг 16.14 . Код модифицированного контейнера GroupPanel