- •Московская финансово-промышленная академия
- •Содержание
- •Глава 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.4. Работа с несколькими растровыми изображениями
Прежде чем завершить разговор о растровых изображениях, необходимо отметить, что в программе можно (и это довольно просто) использовать несколько растровых изображений. Приложение может использовать их столько раз, сколько необходимо, и выводить, на экран любое из них. Для этого достаточно просто загрузить изображение и вывести на экран, пользуясь методом, описанным в предыдущем разделе.
Пример 6-4. Чтобы продемонстрировать, как можно использовать несколько растровых изображений, добавьте еще одно из них в предыдущий пример. Для этого сначала добавьте в файл ресурсов строку:
MYBP2 BITMAP Bfly2.bmp
Затем, используя графический редактор, создайте еще одно растровое изображение размером 77´77 пиксел и сохраните его в файле Bfly2.bmp.
Далее добавьте в программу еще один дескриптор растрового изображения, назвав его hBit2. Для загрузки второго растрового изображения добавьте в WinMain() строку:
hBit2=LoadBitmap(hThisInst,"MYBP2");
В WindowFunc() добавьте следующий оператор case:
case WM_RBUTTONDOWN:
DC=GetDC(hwnd); // Получить DC
memDC=CreateCompatibleDC(DC); // Совместимый DC
SelectObject(memDC,hBit2);
BitBlt(DC,LOWORD(lParam),HIWORD(lParam),77,77,
memDC,0,0,SRCCOPY); // Вывод растра на экран
ReleaseDC(hwnd,DC); // Освободить DC
DeleteDC(memDC); // Освободить DC памяти
break;
Это приведет к тому, что второе растровое изображение будет выводиться на экран каждый раз при нажатии правой кнопки мыши.
И, наконец, в фрагмент программы, обрабатывающий сообщение WM_DESTROY, добавьте строку:
DeleteObject(hBit2);
После внесения всех изменений Ваша программа будет выглядеть так, как показано ниже. Для вывода первого растрового изображения на экран нужно нажимать левую кнопку мыши, а для вывода второго – правую. На рис. 6.5 представлен результат работы программы.
Рис. 6.5. Пример работы с двумя растровыми изображениями
// Вывод двух растров
#include <Windows.h>
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM,
LPARAM);
char szWinName[]="МоеОкно"; // Имя класса окна
HBITMAP hBit1; // Дескриптор растра
HBITMAP hBit2; // Дескриптор растра
int WINAPI WinMain(HINSTANCE hThisInst,
HINSTANCE hPrevInst,
LPSTR lpszArgs,
int nWinMode)
{
HWND hwnd;
MSG msg;
WNDCLASS wcl; // Определить класс окна
wcl.hInstance=hThisInst; // Дескриптор приложения
wcl.lpszClassName=szWinName;// Имя класса окна
wcl.lpfnWndProc=WindowFunc; // Функция окна
wcl.style=0; // Стиль по умолчанию
wcl.hIcon=LoadIcon(hThisInst,"MYICON"); // Иконка
wcl.hCursor=LoadCursor(hThisInst,"MYCURSOR");//Курс.
wcl.lpszMenuName=NULL; // Без меню
wcl.cbClsExtra=0; // Без дополнительной информации
wcl.cbWndExtra=0;
wcl.hbrBackground=
(HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон
if(!RegisterClass(&wcl)) // Регистрируем класс окна
return 0;
hwnd=CreateWindow(szWinName, // Создать окно
"Вывод растра",
WS_OVERLAPPEDWINDOW, // Стиль окна
CW_USEDEFAULT, // x-координата
CW_USEDEFAULT, // y-координата
CW_USEDEFAULT, // Ширина
CW_USEDEFAULT, // Высота
HWND_DESKTOP, // Нет родител. окна
NULL, // Нет меню
hThisInst,// Дескриптор приложения
NULL); // Нет дополнит. аргументов
ShowWindow (hwnd, nWinMode); // Показать окно
UpdateWindow (hwnd); // и перерисовать
hBit1=LoadBitmap(hThisInst,"MYBP1"); // Загр. растр
hBit2=LoadBitmap(hThisInst,"MYBP2"); // Загр. растр
while(GetMessage(&msg,NULL,0,0)) // Запустить цикл
{ // обработки сообщений
TranslateMessage(&msg); // Разреш. исп. клавиатуры
DispatchMessage (&msg); // Вернуть управл. Windows
}
return msg.wParam;
}
// Следующая функция вызывается операционной
// системой Windows и получает в качестве
// параметров сообщения из очереди сообщений
// данного приложения
LRESULT CALLBACK WindowFunc(HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC DC;
HDC memDC;
switch(message)
{
case WM_LBUTTONDOWN:
DC=GetDC(hwnd); // Получить DC
memDC=CreateCompatibleDC(DC); // Совместимый DC
SelectObject(memDC,hBit1);
BitBlt(DC,LOWORD(lParam),HIWORD(lParam),77,77,
memDC,0,0,SRCCOPY); // Вывод растра
ReleaseDC(hwnd,DC); // Освободить DC
DeleteDC(memDC); // Освободить DC памяти
break;
case WM_RBUTTONDOWN:
DC=GetDC(hwnd); // Получить DC
memDC=CreateCompatibleDC(DC); // Совместимый DC
SelectObject(memDC,hBit2);
BitBlt(DC,LOWORD(lParam),HIWORD(lParam),77,77,
memDC,0,0,SRCCOPY); // Вывод растра
ReleaseDC(hwnd,DC); // Освободить DC
DeleteDC(memDC); // Освободить DC памяти
break;
case WM_DESTROY: // Завершение программы
DeleteObject(hBit1); // Удалить растр из памяти
DeleteObject(hBit2); // Удалить растр из памяти
PostQuitMessage (0);
break;
default:
// Все сообщения, не обрабатываемые в
// данной функции, направляются на обработку
// по умолчанию
return DefWindowProc(hwnd,message,
wParam,lParam);
}
return 0;
}
В следующей главе мы опять вернемся к изучению элементов управления, более подробно рассматривая различные элементы и приемы работы с ними.