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

Значения параметра dwRaster

Макрос

Способ вывода

1

SRCCOPY

Копирование «как есть» с затиранием предыдущего изображения

2

SRCAND

Выполняется побитовое AND с предыдущим изображением

3

SRCPAINT

Выполняется побитовое OR с предыдущим изображением

4

SRCINVERT

Выполняется побитовое XOR с предыдущим изображением

Приведенные макросы должны быть определены в файле Windows.h. Функция возвращает ненулевое значение в случае успешного завершения и нуль – при возникновении ошибки.

В нашем примере при нажатии левой кнопки мыши вызывается BitBlt() и растровое изображение выводится на экран целиком, начиная с позиции курсора.

После вывода растрового изображения оба контекста устройств освобождаются. Однако функция ReleaseDC() вызывается только для контекста устройства, получае­мого при помощи GetDC(). Для контекста, получаемого при помощи CreateCompatibleDC(), нужно использовать функцию DeleteDC(), которая получает в качестве параметра указанный контекст устройства.

Растровое изображение является ресурсом, который должен быть освобожден перед завершением программы. Для этого следует использовать функцию DeleteObject(), когда растровое изображение больше не нужно или получено сообщение WM_DESTROY в главном окне. Функция DeleteObject() имеет следующий прототип:

BOOL DeleteObject( HGDIOBJ hObj);

Здесь hObj является дескриптором удаляемого объекта. Функция возвращает ненулевое значение в случае успешного завершения и нуль – в противном случае.

Пример 6-3. Ниже приводится полный текст программы вывода растрового изображения на экран. Программа выводит его каждый раз при нажатии левой кнопки мыши, начиная с текущей позиции курсора. Рисунок 6.4 иллюстрирует работу этой программы.

Рис. 6.4. Пример вывода растрового изображения

// Вывод растра

#include <Windows.h>

LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM,

LPARAM);

char szWinName[]="МоеОкно"; // Имя класса окна

HBITMAP hBit1; // Дескриптор растра

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"); // Загр. растр

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_DESTROY: // Завершение программы

DeleteObject(hBit1); // Удалить растр из памяти

PostQuitMessage (0);

break;

default:

// Все сообщения, не обрабатываемые в

// данной функции, направляются на обработку

// по умолчанию

return DefWindowProc(hwnd,message,

wParam,lParam);

}

return 0;

}