Выбрать главу

Приведенный в листинге 13.6 код демонстрирует, как загрузить растровое изображение из потока встроенного ресурса в ваше приложение. В соответствии с предыдущим изложением в качестве изображения для примера используется файл MyImage.PNG. Этот код следует поместить в форму с элементами управления Button и PictureBox. Как и в предыдущих примерах, для подключения события button1_click к кнопке button1 следует дважды щелкнуть на кнопке в окне конструктора форм, в результате чего будет автоматически сгенерирован костяк функции.

Листинг 13.6. Код формы, демонстрирующий загрузку встроенных ресурсов

System.Drawing.Bitmap m_myBitmapImage;

//------------------------------------------------------------------

//Загрузить изображение, которое хранится в виде встроенного ресурса

//в нашей сборке

//------------------------------------------------------------------

public void LoadImageFromResource() {

 //Если изображение уже загружено,

 //то не имеет смысла делать это повторно.

 if (m_myBitmapImage !=null) {

  return;

 }

 //----------------------------------------------------

 //Получить ссылку на двоичную сборку нашего приложения

 //----------------------------------------------------

 System.Reflection.Assembly thisAssembly = System.Reflection.Assembly.GetExecutingAssembly();

 //-------------------

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

 //-------------------

 System.Reflection.AssemblyName thisAssemblyName = thisAssembly.GetName();

 string assemblyName = thisAssemblyName.Name;

 //-----------------------------------------------------------------------

 //Извлечь поток изображения из нашей сборки и создать соответствующую

 //ему битовую карту в памяти.

 //ПРИМЕЧАНИЕ: Имя потока ресурса ResourceStream ЧУВСТВИТЕЛЬНО К РЕГИСТРУ,

 // поэтому имя изображения должно В ТОЧНОСТИ совпадать с именем

 // файла изображения, который вы добавили в проект

 //-----------------------------------------------------------------------

 m_myBitmapImage = new System.Drawing.Bitmap(thisAssembly.GetManifestResourceStream(assemblyName + ".MyImage.PNG"));

}

//-----------------------------------------------------------

//Загрузить изображение и отобразить его в объекте PictureBox

//-----------------------------------------------------------

private void button1_Click(object sender, System.EventArgs e) {

 LoadImageFromResource();

 pictureBox1.Image = m_myBitmapImage;

}

Форматы хранения изображений и прозрачность растровых изображений

При использовании изображений в приложении очень важно правильно выбрать для них формат хранения. Для крохотных битовых образов (например, 8×8 пикселей) применение сжатия смысла не имеет, поскольку они и так малы. В случае более крупных изображений можно сэкономить довольно много места по сравнению с несжатыми форматами (например, *.BMP), используя сжатые форматы с потерями (например, *.JPG) или без потерь (например, *.PNG). Несжатые фоновые изображения с размерами порядка размеров экрана могут значительно увеличить общий размер приложения. Особое внимание следует уделять выбору форматов хранения для изображений, в которых один цвет будет считаться прозрачным во время выполнения; в таких случаях необходимо использовать только форматы со сжатием без потерь. Сжатие с потерями часто позволяет сэкономить много места, но этого удается достигнуть лишь ценой ослабления контроля за каждым отдельным пикселем изображения; вы получаете лишь приближенное изображение. Растровые изображения с областями прозрачности требуют точного указания цвета каждого пикселя.

Резюме 

Создание отличного пользовательского интерфейса — это трудная, однако увлекательная задача проектирования. Во-первых, вы должны либо адаптировать идею своего проекта к привычным схемам использования и форм фактору выбранного вами целевого устройства, либо выбрать подходящий тип мобильных устройств, который соответствует проектным целям. Мобильные устройства значительно отличаются от настольных компьютеров и лэптопов своим интерфейсом и стереотипом использования. Также и различные классы устройств значительно отличаются друг от друга. Попытки разработки пользовательского интерфейса, способного хорошо работать на различных устройствах, — это гарантия того, что он будет плохо работать на каждом из них. Чтобы обеспечить наилучшие условия работы для пользователя, определяйте для себя целевые мобильные устройства и оптимизируйте интерфейс мобильного приложения применительно к каждому конкретному случаю.

В процессе принятия проектных решений очень важно учитывать, будут ли пользователи работать с интерфейсом вашего приложения с помощью одной или двух рук. Часто это решение диктуется особенностями оборудования, которое выбрано вами в качестве целевого; например, с сенсорными экранами обычно работают, используя две руки, а с мобильными телефонами — обычно одну. Явно укажите в своем основном документе проекта, для какого варианта использования предназначено приложение, и следите за учетом этого требования на протяжении всего процесса проектирования и разработки. При проектировании интерфейсов, которыми пользователь будет оперировать одной рукой, важно учитывать единообразие способов и простоту навигации в пределах интерфейса при помощи щелчков; не заставляйте пользователя при перемещении по часто встречающимся навигационным маршрутам менять кнопки. В процессе навигации по вашему приложению пользователь не должен быть вынужденным переводить взгляд с экрана устройства на клавиатуру; это отвлекает его и нарушает плавность течения его мыслей.