Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Работа с несколькими растровыми изображениями






 

Прежде чем завершить разговор о растровых изображениях, необходимо отме­тить, что в программе можно (и это довольно просто) использовать несколько растровых изображений. Приложение может использовать их столько раз, сколько необходимо, и выводить, на экран любое из них. Для этого достаточно просто загрузить изображение и вывести на экран, пользуясь методом, описанным в преды­дущем разделе.

 

Пример 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;

}

 

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







© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.