Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Получение изображения содержимого окна




 

http://forum.xakep.ru/text/default.aspx?ID=805642&type=topic

Автор: blacksun

04.01.2007 3:29:48

 

Иногда требуется получить изображение какого-либо окна и, например, сохранить его в файл. К сожалению, система не поддерживает такой процедуры, но это ограничение легко преодолеть. Для того чтобы захватить содержимое окна в растровое изображение потребуется проделать некоторые манипуляции:

 

Сначала необходимо создать контекст устройства в памяти. Этот контекст будет использоваться для хранения изображения. Создается контекст путем вызова функции CreateCompatibleDC. После создания контекста устройства требуется получить размер окна, путем вызова функции GetWindowRect, это потребуется для задания размеров будущему изображению.

 

HDC hDCMem = CreateCompatibleDC(NULL);

RECT rect;

GetWindowRect(hWnd, & rect);

 

Далее нам потребуется дескриптор изображения в котором мы сохраним содержимое окна HBITMAP hBmp. Путем получения контекста устройства окна, мы создаем изображение, соответствующее размеру окна.

 

HBITMAP hBmp = NULL;

HDC hDC = GetDC(hWnd);

hBmp = CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);

ReleaseDC(hWnd, hDC);

 

После того как будет создано изображение, нам необходимо выбрать его в контексте устройства находящегося в памяти, и послать окну сообщение WM_PRINT, для того чтобы оно отрисовало себя на контексте переданного устройства. После того как окно отрисует себя на этом контексте, изображение будет содержать в себе внешний вид этого окна. После того как копирования изображения окна будет завершено, необходимо удалить контекст устройства, находящийся в памяти.

 

HGDIOBJ hOld = SelectObject(hDCMem, hBmp);

SendMessage(hWnd, WM_PRINT, (WPARAM) hDCMem, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);

 

SelectObject(hDCMem, hOld);

DeleteObject(hDCMem);

 

Ниже приведен код получающий изображение окна, дескриптор которого был передан в функцию:

 

HBITMAP GetWindowImage(HWND hWnd)

{

HDC hDCMem = CreateCompatibleDC(NULL);

RECT rect;

GetWindowRect(hWnd, & rect);

 

HBITMAP hBmp = NULL;

HDC hDC = GetDC(hWnd);

hBmp = CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);

ReleaseDC(hWnd, hDC);

 

HGDIOBJ hOld = SelectObject(hDCMem, hBmp);

SendMessage(hWnd, WM_PRINT, (WPARAM) hDCMem, PRF_CHILDREN | PRF_CLIENT | PRF_ERASEBKGND | PRF_NONCLIENT | PRF_OWNED);

 

SelectObject(hDCMem, hOld);

DeleteObject(hDCMem);

 

return hBmp;

}

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 423.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...