Прошел курс. Получил код Dreamspark. Ввожу код на сайте, пишет: Срок действия этого кода проверки уже истек. Проверьте, правильно ли введен код. У вас осталось две попытки. Вы также можете выбрать другой способ проверки или предоставить соответствующие документы, подтверждающие ваш академический статус.
Как активировать код? |
Пользовательские элементы управления
Упражнение 4. Рисование круглой кнопки
Вид стандартного элемента управления можно изменить, переопределив его виртуальные методы OnPaint() и OnResize(). Предпочтимые размеры элемента управления устанавливаются в переопределении наследуемого метода GetPreferredSize(). Для прорисовки элементов управления можно использовать класс System.Windows.Forms.ControlPaint. Системная палитра, перья и кисти находятся в трех классах пространства имен SystemDrawing:
- SystemColors
- SystemPens
- SystemBrushes
Пространство имен System.Windows.Forms также содержит цвета в классах
- ProfessionalColors - цвета в статических свойствах класса
- ProfessionalColorTable - цвета в виртуальных экземплярных свойствах класса
В этом упражнении мы создадим кнопку непрямоугольной формы, которая будет отрисовываться по пользовательскому алгоритму. На этом примере будет показано, как создавать пользовательские элементы управления непрямоугольной формы.
Создание заготовки компонента CircleButton
- В панели Solution Explorer выделите узел UserControls и добавьте к проекту библиотеки новый компонент командой Project/Add Component с именем CircleButton
- В заголовке класса CircleButton файла CircleButton.cs замените базовый класс Component на Button
-
Добавьте в начало файла CircleButton.cs инструкции подключения пространств имен
using System.Drawing; using System.Windows.Forms;
- Добавьте в класс CircleButton закрытый метод Init() и поместите его вызовы в перегруженные конструкторы компонента
using System; using System.ComponentModel; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; namespace MyCompany.UserControls { public partial class CircleButton : Button { public CircleButton() { InitializeComponent(); Init(); } public CircleButton(IContainer container) { container.Add(this); InitializeComponent(); Init(); } // Начальные настройки для выполнения в конструкторе private void Init() { // Извещаем операционную систему, что будем сами // заботиться об отрисовке компонента this.SetStyle(ControlStyles.UserPaint, true); // Игнорировать системное сообщение WM_ERASEBKGND // очистки окна, чтобы уменьшить нежелательное мерцание this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); // Наружный отступ по контуру кнопки this.Margin = new Padding(this.Font.Height); // Подстраиваться под размер надписи this.AutoSize = true; } } }Листинг 17.10 . Установка стилей отрисовки в файле CircleButton.cs
Установка флага ControlStyles.UserPaint извещает операционную систему, что отрисовка окна компонента будет выполняться в переопределении его метода OnPaint().
Вычисление размеров кнопки
Каждый раз, когда изображение кнопки на экране требует перерисовки, операционная система вызывает метод OnPaint(). Перед его выполнением необходима информация о размерах перерисуемой области. Такую информацию возвращает автоматически вызываемый метод GetPreferredSize(). Переопределим его в соответствии с нашими требованиями.
// Вычисляем размер описывающего квадрата кнопки // в зависимости от размера надписи на ней public override Size GetPreferredSize(Size proposedSize) { // Получаем ссылку на контекст графического устройства Graphics gr = CreateGraphics(); // Измеряем размер описывающего текст прямоугольника SizeF box = gr.MeasureString(this.Text, this.Font); // Вычисляем диагональ текстового блока надписи int diagonal = (int)Math.Sqrt(Math.Pow(box.Width, 2) + Math.Pow(box.Height, 2)); // Возвращаем объект с размерами описывающего квадрата кнопки return new Size(diagonal, diagonal); }Листинг 17.11 . Вычисление размера кнопки в файле CircleButton.cs
Метод GetPreferredSize() вызывается диспетчером размещения для определения предпочтительных размеров компонента, когда значение его свойства AutoSize=true (мы его установили в методе Init() ).