Приведенный в листинге 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). Несжатые фоновые изображения с размерами порядка размеров экрана могут значительно увеличить общий размер приложения. Особое внимание следует уделять выбору форматов хранения для изображений, в которых один цвет будет считаться прозрачным во время выполнения; в таких случаях необходимо использовать только форматы со сжатием без потерь. Сжатие с потерями часто позволяет сэкономить много места, но этого удается достигнуть лишь ценой ослабления контроля за каждым отдельным пикселем изображения; вы получаете лишь приближенное изображение. Растровые изображения с областями прозрачности требуют точного указания цвета каждого пикселя.
Резюме
Создание отличного пользовательского интерфейса — это трудная, однако увлекательная задача проектирования. Во-первых, вы должны либо адаптировать идею своего проекта к привычным схемам использования и форм фактору выбранного вами целевого устройства, либо выбрать подходящий тип мобильных устройств, который соответствует проектным целям. Мобильные устройства значительно отличаются от настольных компьютеров и лэптопов своим интерфейсом и стереотипом использования. Также и различные классы устройств значительно отличаются друг от друга. Попытки разработки пользовательского интерфейса, способного хорошо работать на различных устройствах, — это гарантия того, что он будет плохо работать на каждом из них. Чтобы обеспечить наилучшие условия работы для пользователя, определяйте для себя целевые мобильные устройства и оптимизируйте интерфейс мобильного приложения применительно к каждому конкретному случаю.
В процессе принятия проектных решений очень важно учитывать, будут ли пользователи работать с интерфейсом вашего приложения с помощью одной или двух рук. Часто это решение диктуется особенностями оборудования, которое выбрано вами в качестве целевого; например, с сенсорными экранами обычно работают, используя две руки, а с мобильными телефонами — обычно одну. Явно укажите в своем основном документе проекта, для какого варианта использования предназначено приложение, и следите за учетом этого требования на протяжении всего процесса проектирования и разработки. При проектировании интерфейсов, которыми пользователь будет оперировать одной рукой, важно учитывать единообразие способов и простоту навигации в пределах интерфейса при помощи щелчков; не заставляйте пользователя при перемещении по часто встречающимся навигационным маршрутам менять кнопки. В процессе навигации по вашему приложению пользователь не должен быть вынужденным переводить взгляд с экрана устройства на клавиатуру; это отвлекает его и нарушает плавность течения его мыслей.