- •Московская финансово-промышленная академия
- •Содержание
- •Глава 1. Модель программирования приложений
- •1.1. Потребительские свойства Windows
- •1.2. Процессы в Windows и потоковая многозадачность
- •1.3. Динамические библиотеки
- •1.4. Программное обеспечение для создания Win-приложений
- •Спецификация префиксов венгерской нотации
- •Глава 2. Обзор возможностей программирования
- •2.1. Общий взгляд на программирование в Windows
- •2.2. Взаимодействие Windows с программой
- •2.3. Win32 api: прикладной интерфейс для Windows
- •2.4. Компоненты окна
- •2.5. Основы приложений Windows
- •2.6. Каркас приложения Windows
- •2.7. Определение класса окна
- •Значения параметра lpszName
- •Наиболее употребляемые макросы для встроенных курсоров
- •Типы системных кистей
- •2.8. Создание окна
- •Наиболее распространенные стили
- •Параметры способа отображения nHow
- •2.9. Цикл обработки сообщений
- •2.10. Оконная функция
- •Типы префиксов
- •Глава 3. Обработка сообщений Windows
- •3.1. Что такое сообщения?
- •3.2. Обработка нажатая клавиш
- •Битовая карта lParam
- •3.3. Обработка сообщений wm_paint
- •3.4. Обработка сообщений «мыши»
- •3.5. Генерация сообщения wm_paint
- •3.6. Генерация сообщений таймера
- •Глава 4. Ресурсы и меню
- •4.1. Окна сообщений MessageBox
- •Значения функции MessageBox
- •Значения wMbType
- •4.2. Представляем меню
- •4.3. Использование ресурсов
- •Параметры menu
- •Параметры элементов меню
- •4.4. Включение меню в программу. Обработка команд
- •4.5. Включение акселераторов сменю
- •4.6. Загрузка таблицы акселераторов
- •Глава 5. Создание диалогов
- •5.1. Взаимодействие Win-диалогов с пользователем
- •5.2. Модальные диалоги: обработка сообщений
- •5.3. Активизация и создание простейшего диалога
- •5.4. Определение ресурсов диалога
- •Стили диалога
- •5.5. Оконная функция диалога
- •5.6. Основы работы со списками
- •Типы сообщений
- •5.7. Инициализация списка и выбор элементов
- •5.8. Окно ввода
- •5.9. Использование немодального диалога
- •Глава 6. Графические образы, иконки и курсоры
- •6.1. Иконка и курсор
- •6.2. Определение малой иконки
- •6.3. Работа с растровыми изображениями
- •Значения параметра dwRaster
- •6.4. Работа с несколькими растровыми изображениями
- •Глава 7. Более подробно об элементах управления
- •7.1. Работа с контрольными переключателями
- •7.2. Статические элементы
- •7.3. Работа с селекторными кнопками
- •7.4. Линейки прокрутки
6.3. Работа с растровыми изображениями
Поскольку Windows – это операционная система, работающая в графическом режиме, Вы можете использовать в своих программах графические элементы. Поэтому важно уяснить, как в рабочей области окна можно рисовать такие элементы, как линии, круги и прямоугольники, используя разнообразные функции Windows API (эти функции будут рассматриваться позже). Как само растровое изображение, так и способ вывода его на экран отличаются от упомянутых графических элементов. Растровое изображение является самоопределенным ресурсом, который программа использует как единое целое. Оно содержит побитовое представление рисунка, которое отображается на экране таким, как оно есть, иначе говоря, программа отображает его как единое целое.
Создание растрового изображения. Прежде чем написать программу, рисующую растровое изображение, сначала нужно создать собственно растровое изображение. Для этого, как и в случае с другими графическими ресурсами, следует воспользоваться помощью графического редактора. В отличие от курсоров и иконок, размеры которых предопределены, для растрового изображения можно задать любой размер. Для работы с примером, приведенным ниже, понадобится растровое изображение размером 77 на 77 пиксел. Назовите этот файл Bfly1.bmp и добавьте в файл ресурсов строку:
MYBP1 BITMAP Bfly1.bmp
Вывод растрового изображения на экран. Создав растровое изображение и включив его описание в файл ресурсов, можно выводить его на экран любое число раз. Однако вывод растрового изображения на экран более трудоемок, чем вывод курсора или иконки. Ниже описаны действия, которые необходимо выполнить в этих целях.
Прежде чем использовать в программе растровое изображение, необходимо загрузить его и запомнить его дескриптор. Лучше всего это можно сделать в функции WinMain(). Для загрузки растрового изображения используется функция API LoadBitmap():
HBITMAP LoadBitmap(HINSTANCE hThisInst,
LPCSTR IpszName);
Параметр hThisInst должен содержать дескриптор текущего экземпляра приложения, a lpszName – указатель на строку-имя растрового изображения, заданную в файле ресурсов. Эта функция возвращает дескриптор загруженного растрового изображения либо NULL при возникновении ошибки. Например:
HBITMAP hBit1; // Дескриптор растра
...
hBit1=LoadBitmap(hThisInst,"MYBP1"); //Загрузить растр
Этот фрагмент программы загружает растровое изображение с именем MYPP1, и запоминает полученный дескриптор в hBit1.
Перед выводом растрового изображения на экран, Ваша программа должна будет выполнить следующую последовательность действий:
1. Получить контекст устройства для окна, в котором будет выводиться растровое изображение.
2. Получить эквивалентный контекст устройства для памяти, в которой будет храниться растровое изображение (растровое изображение хранится в памяти и оттуда копируется в Ваше окно).
3. Выбрать растровое изображение в контексте устройства памяти.
4. Скопировать растровое изображение из памяти в окно вывода, из контекста устройства памяти в контекст устройства окна. Это приведет к появлению растрового изображения на экране.
Чтобы продемонстрировать, как реализуются эти действия в программе, рассмотрим следующий фрагмент, который выводит растровое изображение на экран при каждом нажатии левой кнопки мыши (подразумевается, что растровое изображение уже загружено):
case WM_LBUTTONDOWN:
DC=GetDC(hwnd); // Получить DC
memDC=CreateCompatibleDC(DC); // Совместимый DC
SelectObject(memDC,hBitl);
BitBlt(DC,LOWORD(lParam),HIWORD(lParam),77,77,
memDC,0,0,SRCCOPY); // Вывод растра на экран
ReleaseDC(hwnd,DC); // Освободить DC
DeleteDC(memDC); // Освободить DC памяти
break;
Рассмотрим подробнее этот фрагмент программы. Сначала объявляются два контекста устройств. DC будет сохранять текущий контекст устройства окна, получаемый при вызове GetDC(). Другой контекст устройства memDC создается для памяти, в которой будет храниться растровое изображение. Внутри оператора case сначала необходимо получить контекст устройства для окна. Этот оператор необходим, поскольку растровое изображение будет выводиться в рабочей области окна, а вывод возможен только после получения контекста устройства. Затем создается контекст устройства для памяти, в которой хранится растровое изображение. Этот контекст устройства должен быть совместим с контекстом устройства окна.
Совместимый контекст устройства создается при вызове функции API CreateCompatibleDC() вида:
HDC CreateCompatibleDC(HDC hdc);
Данная функция возвращает дескриптор области памяти, совместимой с контекстом устройства окна, который задается, в параметре hdc. Эта память будет использоваться для создания изображения перед выводом его на экран. При возникновении ошибки функция возвращает NULL.
Прежде чем растровое изображение можно будет вывести на экран, его следует выбрать в текущем контексте устройства, используя функцию API SelectObject(). Поскольку программа может использовать несколько растровых изображений, необходимо выбрать то, которое предполагается выводить на экран. Прототип функции выбора SelectObjectO имеет следующий вид:
HGDIOBJ SelectObject(HDC hMdc, HGDIOBJ hObject);
Здесь hMdc задает контекст устройства для памяти, в которой хранится объект, a hObject – дескриптор этого объекта. Функция возвращает дескриптор объекта, который был выбран ранее, позволяя при необходимости выбирать его опять.
Чтобы вывести выбранный объект на экран, используется функция API BitBlt(), которая копирует растровое изображение из одного контекста устройства в другой. Вот ее прототип:
BOOL BitBlt(HDC hDest, int X, int Y,
int Width, int Height, HDC hSource,
int SourceX, int SourceY, DWORD dwRaster);
Здесь hDest обозначает контекст устройства вывода, a X и Y – координаты точки верхнего левого угла прямоугольника, в который будет выводиться растровое изображение. Размеры выводимого растрового изображения задаются параметрами Width и Height. Параметр hSourse содержит дескриптор исходного контекста устройства, который в этом случае является контекстом памяти, полученным при вызове СгеаteCompatibleDC(). Параметры SourceX и SourceY задают координаты верхнеголевого угла растрового изображения. Обычно они равны 0. Параметр dwRaster задает способ вывода растрового изображения на экран. Наиболее часто используемые значения этого параметра приведены в следующей таблице 6.1.
Таблица 6.1