Книга: Программирование мобильных устройств на платформе .NET Compact Framework

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

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

'Простейший пользовательский элемент управления
Public Class myButton
Inherits System.Windows.Forms.Control
'--------------------------------------
'Объекты, необходимые нам для рисования
'--------------------------------------
Private m_RectangleBrush As System.Drawing.Brush
Private m_TextBrush As System.Drawing.Brush
Private m_RectangleColor As System.Drawing.Color
'------------------------------------------------------------------------
'Событие, которое мы хотим предоставить на обработку. Это - общедоступный
'делегат.
'------------------------------------------------------------------------
Public Event EventButtonTurningBlue(ByVal sender As Object, _
 ByVal e As System.EventArgs)
 'Конструктор
 Public Sub New()
  MyBase.New()
  'ПРИМЕЧАНИЕ: Мы должны написать функцию "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)
End Sub
'-----------------------------------------------
'Внутренним откликом на щелчок является
'повторение трех различных цветов кнопки в цикле
'-----------------------------------------------
Protected Overrides Sub OnClick(ByVal e As System.EventArgs)
 '--------------------------------------------------------
 'Важно: Вызвать базовую реализацию. Это
 'обеспечит возможность вызова любого обработчика событий,
 'подключенного к данному элементу управления
 '--------------------------------------------------------
 MyBase.OnClick (e)
 '------------------------------------------------------
 'Выбрать цвет новой кисти, исходя из цвета старой кисти
 '------------------------------------------------------
 If (m_RectangleColor.Equals(System.Drawing.Color.Black)) Then
  m_RectangleColor = System.Drawing.Color.Blue
  '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  'Запустить событие!
  '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  'Возбудить событие без передачи аргумента
  RaiseEvent EventButtonTurningBlue(Me, Nothing)
 ElseIf (m_RectangleColor.Equals(System.Drawing.Color.Blue)) Then
  m_RectangleColor = System.Drawing.Color.Red
 Else
  m_RectangleColor = System.Drawing.Color.Black
 End If
 '-----------------------
 'Освободить старую кисть
 '-----------------------
 m_RectangleBrush.Dispose()
 '----------------------------------------------------------------
 'Создать новую кисть, которую мы собираемся использовать для фона
 '----------------------------------------------------------------
 m_RectangleBrush = _
  New System.Drawing.SolidBrush(m_RectangleColor)
 '------------------------------------------------------------
 'Сообщить операционной системе, что наш элемент управления
 'должен быть перерисован, как только представится возможность
 '------------------------------------------------------------
 Me.Invalidate()
End Sub
'----------------------------------------------------------------
'Ради интереса подсчитаем, сколько раз осуществлялась перерисовка
'----------------------------------------------------------------
Private m_paintCount As Integer
Protected Overrides Sub OnPaint( _
 ByVal e As System.Windows.Forms.PaintEventArgs)
 '--------------------------------------------
 'ВАЖНО: Вызвать базовый класс и позволить ему
 'выполнить работу по рисованию
 '--------------------------------------------
 MyBase.OnPaint(e)
 'Увеличить на единицу значение счетчика вызовов
 m_paintCount = m_paintCount + 1
 '--------------------------------------------------------------------------
 'Важно:
 'Вместо того чтобы создавать объект Graphics, мы получаем его
 'на время данного вызова. Это означает, что освобождать память путем вызова
 'метода .Dispose() объекта - не наша забота
 '--------------------------------------------------------------------------
 Dim myGfx As System.Drawing.Graphics
 myGfx = e.Graphics
 'Нарисовать прямоугольник
 myGfx.FillRectangle(m_RectangleBrush, 0, 0, _
  Me.Width, Me.Height)
 'Нарисовать текст
 myGfx.DrawString("Button! Paint: " + m_paintCount.ToString(), _
  Me.Parent.Font, m_TextBrush, 0, 0)
End Sub
End Class

Оглавление книги

Оглавление статьи/книги

Генерация: 1.477. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз