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

Листинг 11.11. Три полезных способа кэширования графических ресурсов

Листинг 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( _
   assemblyName + ".Hank_LeftRunl.bmp"))
  m_CaveMan_Bitmap4 = New System.Drawing.Bitmap( _
   thisAssembly.GetManifestResourceStream( _
   assemblyName + ".Hank_LeftRun2.bmp"))
  'Добавить их в коллекцию
  m_colCaveManBitmaps = New System.Collections.ArrayList
  m_colCaveManBitmaps.Add(m_CaveMan_Bitmap1)
  m_colCaveManBitmaps.Add(m_CaveMan_Bitmap2)
  m_colCaveManBitmaps.Add(m_CaveMan_Bitmap3)
  m_colCaveManBitmaps.Add(m_CaveMan_Bitmap4)
 End If
 'Возвратить коллекцию
 Return m_colCaveManBitmaps
End Function
End Class

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

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

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