Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.04.2013, 15:25   #1
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию Скриншот окна

Вот хочу я скриншотик экранчика сделать и положить его в оперативную память. Делаю так:
Код:
	RECT windowRect;
	GetWindowRect(hwnd, &windowRect);
	const int bitmap_dx = (windowRect.right-windowRect.left) / stretch;
	const int bitmap_dy = (windowRect.bottom-windowRect.top) / stretch;

	bitMapInfoStretched.bmiHeader.biSize			=	sizeof(bitMapInfoStretched.bmiHeader);
	bitMapInfoStretched.bmiHeader.biWidth			=	bitmap_dx;
	bitMapInfoStretched.bmiHeader.biHeight			=	bitmap_dy;
	bitMapInfoStretched.bmiHeader.biPlanes			=	1;
	bitMapInfoStretched.bmiHeader.biBitCount		=	24;
	bitMapInfoStretched.bmiHeader.biCompression		=	BI_RGB;
	bitMapInfoStretched.bmiHeader.biSizeImage		=	bitmap_dx * bitmap_dy * (24/8);
	bitMapInfoStretched.bmiHeader.biXPelsPerMeter	=	0;
	bitMapInfoStretched.bmiHeader.biYPelsPerMeter	=	0;
	bitMapInfoStretched.bmiHeader.biClrUsed			=	0;
	bitMapInfoStretched.bmiHeader.biClrImportant	=	0;

	bitMapInfoScreen.bmiHeader.biSize				=	sizeof(bitMapInfoScreen.bmiHeader);
	bitMapInfoScreen.bmiHeader.biWidth				=	bitmap_dx * stretch;
	bitMapInfoScreen.bmiHeader.biHeight				=	bitmap_dy * stretch;
	bitMapInfoScreen.bmiHeader.biPlanes				=	1;
	bitMapInfoScreen.bmiHeader.biBitCount			=	24;
	bitMapInfoScreen.bmiHeader.biCompression		=	BI_RGB;
	bitMapInfoScreen.bmiHeader.biSizeImage			=	bitmap_dx * stretch * bitmap_dy * stretch * (24/8);
	bitMapInfoScreen.bmiHeader.biXPelsPerMeter		=	0;
	bitMapInfoScreen.bmiHeader.biYPelsPerMeter		=	0;
	bitMapInfoScreen.bmiHeader.biClrUsed			=	0;
	bitMapInfoScreen.bmiHeader.biClrImportant		=	0;

		BYTE* memory;

		HDC winDC = GetWindowDC(hwnd);
		if (NULL == winDC) {
			vwiWarn("GetWindowDC ERROR");
			return;
		}

		HDC bmpDC = CreateCompatibleDC(winDC);
		if (NULL == bmpDC) {
			ReleaseDC(hwnd, winDC);
			vwiWarn("CreateCompatibleDC ERROR");
			return;
		}

		HBITMAP bitMap = CreateDIBSection(GetWindowDC(hwnd), &(bitMapInfoScreen), DIB_RGB_COLORS, (void**)&memory, NULL, 0);
		if (NULL == bitMap || NULL == memory) {
			ReleaseDC(hwnd, winDC);
			DeleteDC(bmpDC);
			vwiWarn("CreateDIBSection ERROR");
			return;
		}

		HGDIOBJ obj = SelectObject(bmpDC, bitMap);
		if (NULL == obj) {
			ReleaseDC(hwnd, winDC);
			DeleteDC(bmpDC);
			DeleteObject(bitMap);		
			vwiWarn("SelectObject ERROR");
			return;
		}

		int retVal = SetStretchBltMode(bmpDC, HALFTONE);
		if (0 == retVal) {
			ReleaseDC(hwnd, winDC);
			DeleteDC(bmpDC);
			DeleteObject(bitMap);		
			vwiWarn("SetStretchBltMode ERROR");
			return;
		}

		BOOL retValB = StretchBlt(bmpDC, 0, 0, bitMapInfoStretched.bmiHeader.biWidth, bitMapInfoStretched.bmiHeader.biHeight, winDC, 0, 0, bitMapInfoScreen.bmiHeader.biWidth, bitMapInfoScreen.bmiHeader.biHeight, SRCCOPY);
		if (NULL == retValB) {
			ReleaseDC(hwnd, winDC);
			DeleteDC(bmpDC);
			DeleteObject(bitMap);		
			vwiWarn("StretchBlt ERROR");
			return;
		}

		ReleaseDC(hwnd, winDC);
		DeleteDC(bmpDC);
При этом в переменной memory лежит моя картинка в RGB формате. А теперь я хочу сжать свое изображение внутри GPU например в stretch раз по каждому измерению, скопировать результат в оперативную память и поработать с памятью. Вот если stretch выставлять например в 2, или любой другое значение отличное от 1, в memory видимо лежит что-то не то и не того размера, так как программа мне выдает что где-то я залез на чужую память. как сделать правильно? И тут же вопрос, как обрабатывать каждую из исключительных ситуаций правильно (имеется ввиду ошибки в выполнении функций), переде каждым return нужно освобождать захваченные ресурсы правильно. Сейчас освобождается, но я не уверен что все верно.

Последний раз редактировалось Kukurudza; 04.04.2013 в 15:50.
Kukurudza вне форума Ответить с цитированием
Старый 07.04.2013, 15:48   #2
QunneD
C++ & PHP & Asm
Форумчанин
 
Аватар для QunneD
 
Регистрация: 06.12.2008
Сообщений: 300
По умолчанию

Смысл так извращаться, если можно использовать GdiPlus?
QunneD вне форума Ответить с цитированием
Старый 08.04.2013, 13:22   #3
Kukurudza
Форумчанин
 
Регистрация: 02.06.2011
Сообщений: 282
По умолчанию

это где можно глянуть?
Kukurudza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Inno Setup - компоненты окна поверх фона окна инсталятора. Человек_Борща Общие вопросы по программированию, компьютерный форум 2 13.10.2012 00:22
скриншот неактивного окна Pamparam Общие вопросы Delphi 0 23.01.2012 19:43
скриншот окна программы Pein95 Общие вопросы Delphi 8 29.10.2011 20:57
Как привязать таблицу нового modal окна к Dataset динамически созданного родительского окна? delphicoding Общие вопросы Delphi 6 02.10.2011 22:41
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13