Книга: Программирование мобильных устройств на платформе .NET Compact Framework
Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов
Листинг 8.1. Применение отложенной загрузки, кэширования и освобождения графических ресурсов
using system;
public class GraphicsGlobals {
private static System.Drawing.Bitmap s_Player_Bitmap1;
private static System.Drawing.Bitmap s_Player_Bitmap2;
private static System.Drawing.Bitmap s_Player_Bitmap3;
private static System.Drawing.Bitmap s_Player_Bitmap4;
private static System.Collections.ArrayList s_colPlayerBitmaps;
//------------------------------------------------------
//Освободить все ресурсы
//------------------------------------------------------
public static void g_PlayerBitmapsCollection_CleanUp() {
//Если не загружено ни одно изображение, то и память освобождать не от чего
if (s_colPlayerBitmaps == null) {
return;
}
//Дать указание каждому из этих объектов освободить
//любые удерживаемые ими неуправляемые ресурсы
s_Player_Bitmap1.Dispose();
s_Player_Bitmap2.Dispose();
s_Player_Bitmap3.Dispose();
s_Player_Bitmap4.Dispose();
//Обнулить каждую из этих переменных, чтобы им не соответствовали
//никакие объекты в памяти
s_Player_Bitmap1 = null;
s_Player_Bitmap2 = null;
s_Player_Bitmap3 = null;
s_Player_Bitmap4 = null;
//Избавиться от массива
s_colPlayerBitmaps = null;
}
//Функция: возвращает коллекцию изображений
public static System.Collections.ArrayList g_PlayerBitmapsCollection() {
//---------------------------------------------------------------
//Если изображения уже загружены, их достаточно только возвратить
//---------------------------------------------------------------
if (s_colPlayerBitmaps != null) {
return s_colPlayerBitmaps;
}
//Загрузить изображения как ресурсы из исполняемого двоичного файла
System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly();
System.Reflection.AssemblyName thisAssemblyName = thisAssembly.GetName();
string assemblyName = thisAssemblyName.Name;
//Загрузить изображения
s_Player_Bitmap1 = new System.Drawing.Bitmap(
thisAssembly.GetManifestResourceStream(assemblyName + ".Hank_RightRun1.bmp"));
s_Player_Bitmap2 = new System.Drawing.Bitmap(
thisAssembly.GetManifestResourceStream(assemblyName + ".Hank RightRun2.bmp"));
s_Player_Bitmap3 = new System.Drawing.Bitmap(
thisAssembly.GetManifestResourceStream(assemblyName + ".Hank_LeftRun1.bmp"));
s_Player_Bitmap4 = new System.Drawing.Bitmap(
thisAssembly.GetManifestResourceStream(assemblyName + ".Hank_LeftRun2.bmp"));
//Добавить изображения в коллекцию
s_colPlayerBitmaps = new System.Collections.ArrayList();
s_colPlayerBitmaps.Add(s_Player_Bitmap1);
s_colPlayerBitmaps.Add(s_Player_Bitmap2);
s_colPlayerBitmaps.Add(s_Player_Bitmap3);
s_colPlayerBitmaps.Add(s_Player_Bitmap4);
//Возвратить коллекцию
return s_colPlayerBitmaps;
}
private static System.Drawing.Pen s_blackPen;
private static System.Drawing.Pen s_whitePen;
private static System.Drawing.Imaging.ImageAttributes s_ImageAttribute;
private static System.Drawing.Font s_boldFont;
//------------------------------------------------
//Вызывается для освобождения от любых графических
//ресурсов, которые могли быть кэшированы
//------------------------------------------------
private static void g_CleanUpDrawingResources() {
//Освободить память от черного пера, если таковое имеется
if (s_blackPen !=null) {
s_blackPen.Dispose();
s_blackPen = null;
}
// Освободить память от белого пера, если таковое имеется
if (s_whitePen != null) {
s_whitePen.Dispose();
r_whitePen = null;
}
//Освободить память от атрибута ImageAttribute, если таковой имеется.
//Примечание. Метод Dispose() для этого типа не предусмотрен,
//поскольку все его данные являются управляемыми
if (s_ImageAttribute != null) {
s_ImageAttribute = null;
}
//Освободить память от полужирного шрифта, если таковой имеется
if (s_boldFont != null) {
s_boldFont.Dispose();
s_boldFont = null;
}
}
//-----------------------------------------
//Эта функция позволяет получить доступ
//к черному перу, находящемуся в кэш-памяти
//-----------------------------------------
private static System.Drawing.Pen g_GetBlackPen() {
//Если перо еще не существует, создать его
if (s_blackPen ==null) {
s_blackPen = new System.Drawing.Pen(System.Drawing.Color.Black);
}
//Возвратить черное перо return s_blackPen;
}
//----------------------------------------
//Эта функция позволяет получить доступ
//к белому перу, находящемуся в кэш-памяти
//----------------------------------------
private static System.Drawing.Pen g_GetWhitePen() {
//Если перо еще не существует, создать его
if (s_whitePen == null) {
s_whitePen = new System.Drawing.Pen(System.Drawing.Color.White);
}
//Возвратить белое перо return s_whitePen;
}
//-----------------------------------------------
//Эта функция позволяет получить доступ
//к полужирному шрифту, находящемуся в кэш-памяти
//-----------------------------------------------
private static System.Drawing.Font g_GetBoldFont() {
//Если перо еще не существует, создать его
if (s_boldFont ==null) {
s_boldFont = new System.Drawing.Font(
System.Drawing.FontFamily.GenericSerif, 10, System.Drawing.FontStyle.Bold);
}
//Возвратить полужирный шрифт
return s_boldFont;
}
//------------------------------------------------------
//Эта функция позволяет осуществлять доступ
//к находящемуся в кэш-памяти объекту imageAttributes,
// который мы используем для изображений с прозрачностью
//------------------------------------------------------
private static System.Drawing.Imaging.ImageAttributes g_GetTransparencyImageAttribute() {
//Если объект не существует, создать его
if (s_ImageAttribute == null) {
//Создать атрибут изображения
s_ImageAttribute = new System.Drawing.Imaging.ImageAttributes();
s_ImageAttribute.SetColorKey(System.Drawing.Color.White, System.Drawing.Color.White);
}
//Возвратить его
return s_ImageAttribute;
}
} //Конец класса
- Листинг 10.1. (simpleid.c) Отображение идентификаторов пользователя и группы
- Листинг 15.11. Код для загрузки файла с Web-сервера
- Почему при включении клавиатура не работает, а после загрузки Windows все нормально?
- Применение функции scanf( )
- Каждый раз после загрузки Windows запускаются разные бесполезные приложения, а возле часов появляются лишние значки. Что...
- Я часто использую сетевую папку другого компьютера, как сделать, чтобы она не пропадала после перезагрузки?
- Применение PHP-технологий в программе HtmlPad
- Если не включить внешний модем (COM-порт) до загрузки компьютера, то он не определяется системой. Это можно исправить?
- Удалил драйвер видеокарты, а потом еще и отключил устройство по умолчанию SVGA. После перезагрузки увидел черный экран… ...
- Восстановление системы через меню загрузки
- Во время загрузки появляется окно с запросом пароля, но раскладка используется русская, а у меня пароль на английском. К...
- Удаляю Windows Messenger из автозапуска, но после перезагрузки программа снова запускается. С другими приложениями таког...