![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Работа с несколькими растровыми изображениями
Прежде чем завершить разговор о растровых изображениях, необходимо отметить, что в программе можно (и это довольно просто) использовать несколько растровых изображений. Приложение может использовать их столько раз, сколько необходимо, и выводить, на экран любое из них. Для этого достаточно просто загрузить изображение и вывести на экран, пользуясь методом, описанным в предыдущем разделе.
Пример 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; }
В следующей главе мы опять вернемся к изучению элементов управления, более подробно рассматривая различные элементы и приемы работы с ними.
|