Выбрать главу

2. Добавьте в проект новый класс и назовите его myButton. Перейдя в окно редактора кода класса введите код, представленный в листинге 11.9.

3. Перейдите в окно конструктора форм для формы Form1. Добавьте в форму кнопку. Дважды щелкните на кнопке для перехода в окно редактора кода и введите код, представленный в обработчике события button1_Click в листинге 11.10.

4. Введите за кодом обработчика события button1_Click оставшуюся часть кода, представленного в листинге 11.10.

5. Скомпилируйте пример и запустите его на выполнение. Щелкните на кнопке Button1.

Листинг 11.9. Простой пользовательский элемент управления, который изменяет цвета и запускает событие, определяемое пользователем

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

public class myButton : System.Windows.Forms.Control {

 //--------------------------------------

 //Объекты, необходимые нам для рисования

 //--------------------------------------

 System.Drawing.Brush m_RectangleBrush;

 System.Drawing.Brush m_TextBrush;

 System.Drawing.Color m_RectangleColor;

 //----------------------------------------------------

 //Событие, которое мы хотим предоставить на обработку.

 //Это - общедоступный делегат.

 //----------------------------------------------------

 public event System.EventHandler EventButtonTurningBlue;

 //Конструктор

 public myButton() : base() {

  //ПРИМЕЧАНИЕ: Мы должны написать функцию Dispose() и

  //деструктор, который освобождает память от этих объектов

  //Создать необходимые кисти

  m_RectangleColor = System.Drawing.Color.Black;

  m_RectangleBrush = new System.Drawing.SolidBrush(m_RectangleColor);

  m_TextBrush = new System.Drawing.SolidBrush(System.Drawing.Color.White);

 }

 //-----------------------------------------------

 //Внутренним откликом на щелчок является

 //повторение трех различных цветов кнопки в цикле

 //-----------------------------------------------

 protected override void OnClick(System.EventArgs e) {

  //--------------------------------------------------------

  //Важно: Вызвать базовую реализацию. Это

  //обеспечит возможность вызова любого обработчика событий,

  //подключенного к данному элементу управления

  //--------------------------------------------------------

  base.OnClick(e);

  //------------------------------------------------------

  //Выбрать цвет новой кисти, исходя из цвета старой кисти

  //------------------------------------------------------

  if (m_RectangleColor == System.Drawing.Color.Black) {

   m_RectangleColor = System.Drawing.Color.Blue;

   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

   //Запустить событие                                   !

   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

   if (EventButtonTurningBlue!= null) {

    //Возбудить событие без передачи аргумента

    EventButtonTurningBlue(this, null);

   }

  }

  else

   if (m_RectangleColor == System.Drawing.Color.Blue) m_RectangleColor = System.Drawing.Color.Red;

   else m_RectangleColor = System.Drawing.Color.Black;

  //-----------------------

  //Освободить старую кисть

  //-----------------------

  m_RectangleBrush.Dispose();

  //----------------------------------------------------------------

  //Создать новую кисть, которую мы собираемся использовать для фона

  //----------------------------------------------------------------

  m_RectangleBrush = new System.Drawing.SolidBrush(m_RectangleColor);

  //------------------------------------------------------------

  //Сообщить операционной системе, что наш элемент управления

  //должен быть перерисован, как только представится возможность

  //------------------------------------------------------------

  this.Invalidate();

 }

 //----------------------------------------------------------------

 //Ради интереса подсчитаем, сколько раз осуществлялась перерисовка

 //----------------------------------------------------------------

 int m_paintCount;

 protected override void OnPaint(System.Windows.Forms.PaintEventArgs e) {

  //--------------------------------------------

  //ВАЖНО: Вызвать базовый класс и позволить ему

  //выполнить работу по рисованию

  //--------------------------------------------

  base.OnPaint(e);

  //Увеличить на единицу значение счетчика вызовов

  m_paintCount = m_paintCount + 1;

  //-------------------------------------------------------------------

  //Важно:

  //Вместо того чтобы создавать объект Graphics, мы получаем его

  //на время данного вызова. Это означает, что освобождать память путем

  //вызова метода .Dispose() объекта - не наша забота

  //-------------------------------------------------------------------

  System.Drawing.Graphics myGfx;

  myGfx = e.Graphics;

  //Нарисовать прямоугольник

  myGfx.FillRectangle(m_RectangleBrush, 0, 0, this.Width,this.Height);

  //Нарисовать текст

  myGfx.DrawString("Button! Paint: " + m_paintCount.ToString(), this.Parent.Font, m_TextBrush, 0, 0);

 } //конец функции

} //конец класса

Листинг 11.10. Код, который должен быть помещен в форму для создания экземпляра пользовательского элемента управления