Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
каркас.doc
Скачиваний:
58
Добавлен:
03.06.2015
Размер:
1.6 Mб
Скачать

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;

}

В следующей главе мы опять вернемся к изучению элементов управления, более подробно рассматривая различные элементы и приемы работы с ними.