Опубликован: 25.03.2010 | Доступ: свободный | Студентов: 1447 / 157 | Оценка: 4.31 / 4.00 | Длительность: 25:42:00
Лекция 17:

Пользовательские элементы управления

Упражнение 4. Рисование круглой кнопки

Вид стандартного элемента управления можно изменить, переопределив его виртуальные методы OnPaint() и OnResize(). Предпочтимые размеры элемента управления устанавливаются в переопределении наследуемого метода GetPreferredSize(). Для прорисовки элементов управления можно использовать класс System.Windows.Forms.ControlPaint. Системная палитра, перья и кисти находятся в трех классах пространства имен SystemDrawing:

  1. SystemColors
  2. SystemPens
  3. SystemBrushes

Пространство имен System.Windows.Forms также содержит цвета в классах

  1. ProfessionalColors - цвета в статических свойствах класса
  2. 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(). Переопределим его в соответствии с нашими требованиями.

  • Добавьте в класс CircleButton код переопределения метода 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() ).

Максим Филатов
Максим Филатов

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

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

 

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