'----------------------------------------------------------------
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
Листинг 11.10. Код, который должен быть помещен в форму для создания экземпляра пользовательского элемента управления
'Наша новая кнопка
Private m_newControl As myButton
'--------------------------------------------------------------
'Этот код будет подключен в качестве нашего обработчика событий
'--------------------------------------------------------------
Private Sub CallWhenButtonTurningBlue(ByVal sender As Object, _
ByVal e As System.EventArgs)
MsgBox("Кнопка становится синей!")
End Sub
'----------------------------------------------
'Эта функция подключается для обработки событий
'щелчка на кнопке Button1
'----------------------------------------------
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
'----------------------------------------------
'Для простоты мы допускаем существование только
'одного экземпляра элемента управления,
'----------------------------------------------
If Not (m_newControl Is Nothing) Then Return
'Создать экземпляр нашей кнопки
m_newControl = New myButton
'Указать ему его местоположение внутри родительского объекта
m_newControl.Bounds = New Rectangle(10, 10, 150, 40)
'-------------------------------
'Присоединить обработчик событий
'-------------------------------
AddHandler m_newControl.EventButtonTurningBlue, _
AddressOf CallWhenButtonTurningBlue
'Добавить его в список элементов управления данной формы.
'Это сделает его видимым
Me.Controls.Add(m_newControl)
End Sub
Листинг 11.11. Три полезных способа кэширования графических ресурсов
Imports System
Imports System.Drawing
Friend Class GraphicsGlobals
'=======================================================================
'Подход 1: Создать ресурс по требованию
' и кэшировать его для последующего использования.
'
'Внешний код получает доступ к общедоступным свойствам для их просмотра,
'но сами переменные остаются внутренними переменными класса
'=======================================================================
Private Shared s_bluePen As Pen
Public Shared ReadOnly Property globalBluePen() As Pen
Get
'Если перо еще не было создано
If (s_bluePen Is Nothing) Then
s_bluePen = New System.Drawing.Pen( _
System.Drawing.Color.Blue)
End If
Return s_bluePen
End Get
End Property
'========================================================
'Подход 2:
'Загрузить глобально и кэшировать все
'используемые объекты Pen, ImageAttribute, Font и Brush
'
'Внешний код получает доступ ко всем общедоступным членам,
'так что никакие функции доступа не нужны.
'=========================================================
Public Shared g_blackPen As Pen
Public Shared g_whitePen As Pen
Public Shared g_ImageAttribute As Imaging.ImageAttributes
Private Shared s_alreadyInitialized As Boolean
Public Shared g_boldFont As Font
Public Shared g_smallTextFont As Font
Public Shared g_greenBrush As Brush
Public Shared g_yellowBrush As Brush
Public Shared g_redBrush As Brush
Public Shared g_blackBrush As Brush
Читать дальше