KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Иво Салмре - Программирование мобильных устройств на платформе .NET Compact Framework

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

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Иво Салмре, "Программирование мобильных устройств на платформе .NET Compact Framework" бесплатно, без регистрации.
Перейти на страницу:

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

 '------------------------------------------------------

 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

Листинг 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


'==============================================================

'Эта функция должна быть вызвана до попыток доступа к любому из

'вышеперечисленных глобальных объектов

'==============================================================

Public Shared Sub InitializeGlobals()

 If (s_alreadyInitialized = True) Then Return

 g_blackPen = New Systera.Drawing.Pen(Color.Black)

 g_whitePen = New System.Drawing.Pen(Color.White)

 g_ImageAttribute = New _

  System.Drawing.Imaging.ImageAttributes

 g_ImageAttribute.SetColorKey(Color.White, Color.White)

 g_boldFont = New Font(FontFamily.GenericSerif, _

  10, FontStyle.Bold)

 g_smallTextFont = New Font(FontFamily.GenericSansSerif, _

  8, FontStyle.Regular)

 g_blackBrush = New SolidBrush(System.Drawing.Color.Black)

 g_greenBrush = New SolidBrush(System.Drawing.Color.LightGreen)

 g_yellowBrush = New SolidBrush(System.Drawing.Color.Yellow)

 g_redBrush = New SolidBrush(System.Drawing.Color.Red)

 s_alreadyInitialized = True

End Sub

'====================================================

'Подход 3: Возвратить массив связанных ресурсов.

' Кэшировать ресурсы локально, чтобы при многократных

' запросах не загружались (напрасно) их дубликаты

'====================================================

Private Shared m_CaveMan_Bitmap1 As Bitmap

Private Shared m_CaveMan_Bitmap2 As Bitmap

Private Shared m_CaveMan_Bitmap3 As Bitmap

Private Shared m_CaveMan_Bitmap4 As Bitmap

Private Shared m_colCaveManBitmaps As _

 System.Collections.ArrayList


'--------------------------------------------------

'Создать и загрузить массив изображений для спрайта

'--------------------------------------------------

Public Shared Function g_CaveManPictureCollection() As _

 System.Collections.ArrayList

 'Изображения загружаются лишь в том случае, если мы их еще не загрузили

 If (m_CaveManBitmap1 Is Nothing) Then

  '-----------------------------------------------------------------

  'Загрузить изображения. Эти изображения хранятся в виде

  'встроенных ресурсов в нашем двоичном приложении

  '

  'Загрузка изображений из внешних файлов осуществляется аналогичным

  'образом, но выполнить ее проще (нам достаточно лишь указать

  'имя файла в конструкторе растровых изображений).

  '-----------------------------------------------------------------


  'Получить ссылку на нашу двоичную сборку

  dim thisAssembly as System.Reflection.Assembly = _

   System.Reflection.Assembly.GetExecutingAssembly()


  'Получить имя сборки

  Dim thisAssemblyName As System.Reflection.AssemblyName = _

   thisAssembly.GetName()

  Dim assemblyName As String = thisAssemblyName.Name


  'Загрузить изображения в виде двоичных потоков из нашей сборки

  m_CaveMan_Bitmap1 = New System.Drawing.Bitmap( _

   thisAssembly.GetManifestResourceStream( _

   assemblyName + ".Hank_RightRun1.bmp"))

  m_CaveMan_Bitmap2 = New System.Drawing.Bitmap( _

   thisAssembly.GetManifestResourceStream( _

   assemblyName + ".Hank_RightRun2.bmp"))

  m_CaveMan_Bitmap3 = New System.Drawing.Bitmap( _

   thisAssembly.GetManifestResourceStream( _

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*