HINSTANCE hPrevInstance,
Чтобы восстановить на экране изображение, необходимо вызвать BitBlt второй раз, устанавливая совместимый контекст устройства как источниковый DC, а контекст устройства окна (или принтера) как целевой DC.
Далее необходимо выбрать созданный точечный рисунок в этот контекст устройства при помощи вызова функции SelectObject.
Захват изображения
Вы можете использовать точечный рисунок, чтобы захватить изображение, сохранить захваченное изображение в памяти, показать его на экране в другом месте окна приложения, или показать его на экране в другом окне.
1) Чтобы вывести изображение экрана в окно необходимо в первую очередь создать контекст для устройства DISPLAY с помощью функции CreateDC("DISPLAY", NULL, NULL, NULL) или GetDC(NULL);
1) Далее создаётся совместимый контекст в памяти для устройства DISPLAY с помощью функции CreateCompatibleDC. При этом создаётся контекст устройства (DC), который является совместимым с текущим контекстом устройства DISPLAY.
2) После того, как создан совместимый контекст устройства для дисплея, необходимо создать точечный рисунок с соответствующими размерами при помощи вызова функции CreateCompatibleBitmap;
|
|
4) Далее можно сделать захват изображения с помощью функции BitBlt. Эта функция выполняет пересылку блока битов - то есть она копирует данные с исходного точечного рисунка в принимающий точечный рисунок. В качестве параметров BitBlt принимает дескрипторы, которые идентифицируют два контекста устройства и копирует растровые данные с точечного рисунка, выбранного в источниковом DC в точечный рисунок, выбранный в целевом DC (целевой DC - совместимый контекст устройства). Таким образом когда BitBlt завершает передачу, изображение сохраняется в памяти.
Пример_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,
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;
}