
- •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); // количество многоугольников
Захват изображения
Вы можете использовать точечный рисунок, чтобы захватить изображение, сохранить захваченное изображение в памяти, показать его на экране в другом месте окна приложения, или показать его на экране в другом окне.
1) Чтобы вывести изображение экрана в окно необходимо в первую очередь создать контекст для устройства display с помощью функции CreateDc("display", null, null, null) или GetDc(null);
1) Далее создаётся совместимый контекст в памяти для устройства DISPLAY с помощью функции CreateCompatibleDC. При этом создаётся контекст устройства (DC), который является совместимым с текущим контекстом устройства DISPLAY.
2) После того, как создан совместимый контекст устройства для дисплея, необходимо создать точечный рисунок с соответствующими размерами при помощи вызова функции CreateCompatibleBitmap;
3) Далее необходимо выбрать созданный точечный рисунок в этот контекст устройства при помощи вызова функции SelectObject.
4) Далее можно сделать захват изображения с помощью функции BitBlt. Эта функция выполняет пересылку блока битов - то есть она копирует данные с исходного точечного рисунка в принимающий точечный рисунок. В качестве параметров BitBlt принимает дескрипторы, которые идентифицируют два контекста устройства и копирует растровые данные с точечного рисунка, выбранного в источниковом DC в точечный рисунок, выбранный в целевом DC (целевой DC - совместимый контекст устройства). Таким образом когда BitBlt завершает передачу, изображение сохраняется в памяти.
4) Чтобы восстановить на экране изображение, необходимо вызвать BitBlt второй раз, устанавливая совместимый контекст устройства как источниковый DC, а контекст устройства окна (или принтера) как целевой DC.
Пример_1: Разработать Windows-приложение, которое захватывает изображение всего рабочего стола и выводит это изображение в главное окно приложения. (В программе есть ошибка, которую студенты должны исправить самостоятельно).
#include "stdafx.h"
#include "resource.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst;
TCHAR szTitle[MAX_LOADSTRING];
TCHAR szWindowClass[MAX_LOADSTRING];
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
// TODO: Place code here.
MSG msg;
HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_PRINTSCREEN, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_PRINTSCREEN);
// Main message loop:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_PRINTSCREEN);
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = (LPCSTR)IDC_PRINTSCREEN;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);