
- •1) Для создания контекста метафайла используется функция CreateMetaFile:
- •3) Если имеется идентификатор метафайла, то метафайл можно скопировать в обычный дисковый файл, с помощью функции CopyMetaFile :
- •4) Можно проиграть метафайл в контексте отображения или контексте устройства, вызвав функцию PlayMetaFile:
- •6) Для того чтобы воспользоваться метафайлом, хранящимся в виде дискового файла, его нужно загрузить функцией GetMetaFile, указав в качестве параметра путь к соответствующему файлу:
- •Изменились размеры или местоположение окна;
- •Клиентская область была полностью или частично закрыта другим окном или выпадающим меню, а теперь закрывающий объект исчез;
- •Приложение вызвало одну из функций работы с полосами прокрутки.
- •Битовые изображения в формате ddb
- •Загрузка изображений из ресурсов приложения
- •Int winapi GetObject(
- •Int cbBuffer, // размер буфера
- •Void far* lpvObject); // адрес буфера
- •Захват изображения
- •1) Чтобы вывести изображение экрана в окно необходимо в первую очередь создать контекст для устройства display с помощью функции CreateDc("display", null, null, null) или GetDc(null);
- •3) Далее необходимо выбрать созданный точечный рисунок в этот контекст устройства при помощи вызова функции SelectObject.
- •If (!hWnd)
- •Int wmId, wmEvent;
- •Рисование точки
- •Int nXPos, // X-координата точки
- •Int nYPos, // y-координата точки
- •Int nX, // х - координата конечной точки;
- •Int nY // у - координата конечной точки
- •Рисование прямоугольника
- •Int winapi FrameRect(
- •Рисование сегмента эллипса
- •Рисование сектора эллипса
- •Рисование многоугольников
- •Int far* lpnPolyCounts, // адрес массива количества точек
- •Int cPolygons); // количество многоугольников
If (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
Int wmId, wmEvent;
TCHAR szHello[MAX_LOADSTRING];
HDC hDC,hCompatibleDC,hDC1,hdcScreen,hdcCompatible;
PAINTSTRUCT PaintStruct;
HANDLE hBitmap,hOldBitmap,hbmScreen,hwnd;
RECT Rect;
BITMAP Bitmap;
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_CREATE:
hdcScreen = GetDC(NULL);
hdcCompatible = CreateCompatibleDC(hdcScreen);
hbmScreen = CreateCompatibleBitmap(hdcScreen,GetDeviceCaps(hdcScreen, HORZRES),GetDeviceCaps(hdcScreen, VERTRES));
// Выбираем совместимый точеный рисунок в DC.
hOldBitmap=SelectObject(hdcCompatible,hbmScreen);
// копируем цветовые данные для всего дисплея в точечный рисунок,
// который выбирается в совместимый DC.
BitBlt(hdcCompatible,0,0,GetDeviceCaps(hdcScreen,HORZRES),GetDeviceCaps(hdcScreen,VERTRES),hdcScreen,0,0,SRCCOPY);
break;
case WM_PAINT:
hDC1=BeginPaint(hWnd,&PaintStruct);
BitBlt(hDC1,0,0,GetDeviceCaps(hdcScreen, HORZRES),GetDeviceCaps(hdcScreen, VERTRES),hdcCompatible,0,0,SRCCOPY);
EndPaint(hWnd,&PaintStruct);
return 0;
case WM_DESTROY:
SelectObject(hdcCompatible,hOldBitmap);
DeleteObject(hOldBitmap);
DeleteDC(hdcCompatible);
ReleaseDC(NULL, hdcScreen);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
Задание для самостоятельной работы:
1) Исправить программку, которая приведена в примере 1. Довести приложение до рабочего состояния.
2) Преобразовать программу таким образом, чтобы изображение рабочего окна выводилось в главное окно приложения с масштабированием.
Общие операции с графическими объектами
GDI содержит набор графических объектов, обеспечивающих выполнение графических операций. К графическим объектам в Windows относятся перья, кисти, растровые изображения, палитры, шрифты.
Использование любого графического объекта предполагает выполнение следующей последовательности операций:
Создать графический объект;
Выбрать созданный объект в контекст устройства;
Вызвать графическую функцию, работающую с объектом;
Удалить объект из контекста устройства, вернув предшествующий объект;
Уничтожить объект.
Для создания GDI-объектов предназначены соответствующие функции Create…, которые в случае успешного завершения возвращают дескриптор объекта.
Выбор объекта в контекст устройства осуществляется при помощи функции SelectObject (палитры выбираются с помощью функции SelectPalette). Функция SelectObject имеет следующий прототип:
HGDIOBJ SelectObject (
HDC hdc, – дескриптор контекста устройства
HGDIOBJ hgdiobj – дескриптор GDI-объекта
);
Для корректной работы приложение должно запомнить предшествующий дескриптор и после окончания рисования с новым объектом (шаг 3) вернуть в контекст устройства предшествующий объект (шаг 4).
Для уничтожения объекта вызывается функция DeleteObject.
Рисование точек
Перед рисованием линий необходимо настроить контекст устройства в соответствии с выполняемой операцией, установив нужные значения атрибутов. Назначение атрибутов контекста устройства следующее:
Текущее перо (Pen). Определяет вид проводимой линии — толщину, цвет, стиль.
Текущая позиция пера (Pen Position).
Цвет фона (Background Color).
Режим заполнения фона (Background Mode).
Режим рисования (Drawing Mode).
Направление рисования дуг эллипсов (Arc Direction).
По умолчанию текущая позиция пера установлена в точку (0,0).
Для изменения текущей позиции пера можно воспользоваться функцией:
BOOL MoveToEx( HDC hDC, – дескриптор контекста устройства
int nX, – x координата новой текщей позиции
int nY, – у координата новой текущей позиции
LPPOINT lpPoint – предыдущая позиция пера
);
Функция MoveToEx перемещает текущую точку пера в указанное место, не выполняя рисования.
Для того, чтобы получить значение текущей позиции пера необходимо вызвать функцию:
GetCurrentPositionEx(HDC hDC, POINT &pt).
Результат выполнения функции помещается в переменную pt.