|
Прошел курс. Получил код 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() ).