Опубликован: 25.03.2010 | Уровень: для всех | Доступ: платный
Лекция 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. Ввожу код на сайте, пишет:

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

 

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

Денис Пашков
Денис Пашков
Россия
Татьяна Ковалюк
Татьяна Ковалюк
Украина, Киев, Киевский политехнический институт, 1974