Копирование экрана

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Как программно, не исспользуя буфер обмена скопировать экран или его часть в TImage? В копируемой части экрана может быть чужое окно или его часть.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Вот тут обсуждалось:

http://forum.developing.ru/showthread.php?t=9555
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Мне бы без потоков и для Borland Visual c++ 6.0 Enterprize.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

atavin-ta, а где ты там потоки увидел?
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

Код: Выделить всё

cout << "gflImportFromHWND error: "...
это вывод в поток. Если это не отнсится именно к копированию, то помогите найти те строки, которые непосредственно отвечают за копирование и все необходимые декларации, а то я не продерусь через все эти потоки. Оператор вывода в поток я опознать могу, но что в него выводится, понимаю слишком плохо. И запихать картинку надо именно в обект класса TImage (болэндовский класс, объединяющий битмап и окно для его отображения) а не во что-то другое. Сам TImage в момент копирования на экране не присутствует. Формат жестко .bmp. Не буду спорить, поддерживает ли класс, другие форматы но в данном проекте они не будут исспользоваться. И объяснять мне сами форматы и с чем каждый едят в данном случае не нужно, так как за сохранение в файл будет отвечать TImage, а непосредственно на экране все .dib, а это синоним .bmp.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

atavin-ta писал(а): это вывод в поток.
Блин, там примерто махонький. Разве не понятно, что вывод на cout - это лишь демо. И на работу с изображением никак не влияет.
И запихать картинку надо именно в обект класса TImage (болэндовский класс, объединяющий битмап и окно для его отображения) а не во что-то другое.
Скачай с сайта билиотеку, распакуй, там примеры есть и все описания/декларации.
Там и Help-файл есть с описанием (хотя довольно лаконичным) функций/структур.

По примеру.
Функция gflImportFromHWND читает экран (или часть жкрана, если задать параметр rect) в некую свою структуру, возвращается указатель на нее (pBitmap).

C TImage, к сожалению, не работал.
В библиотеке есть функции:
gflConvertBitmapIntoDIB
gflConvertBitmapIntoDIBSection
gflConvertBitmapIntoDDB
gflConvertBitmapIntoDDBEx


Возможно, одна из них преобразует картинку из "формата" этой библиотеки в тот формат, который ты сможешь уже "скормить" твоему TImage.

Там же (в дистрибутиве) есть пример для Delphi (если тебе нужно именно для Borland C, то, я так понимаю, этот пример может разъяснить, как и что), расположен в:
\GflSDK\Delphi\Demo\Source\

Во всяком случае, переменные типа TImage я там увидел.
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

"скормить" TImageу можно только то, что принимает метод Draw(int X, int Y, TGraphic* Graphic);, или цвета отдельных точек, или цвета и координаты примитивов, или всё, что принимают функции GID с контекстом, созданным на основе Image1->Picture->Bitmap->Handle. Ничего другого TImage не примет. Причём, цвета ему нельязя "скормить" единым массивом, а только в цикле. И надо не для Delphi, а для Borland visyual c++ enterprize 6.0. gflImportFromHWND упомятнут в текстовой константе. А где код самой функции? Я не нашел даже декларации её прототипа.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

atavin-ta писал(а):gflImportFromHWND упомятнут в текстовой константе. а где код самой функции? Я не нашел даже декларации её прототипа.
Не понимаю, что значит "упомятнут в текстовой константе".
"Код самой функции" - "внутри" DLL. Т.е. исходый текст тебе недоступен.
Прототип - в файле libgfle.h (лекго находится контекстным поиском).

Возможно, тебе подойдет какая-то из ф-ий (верное, вторая):

extern GFLEXTERN GFL_ERROR GFLAPI gflConvertBitmapIntoDIBSection( const GFL_BITMAP *bitmap, HBITMAP *hDIB );
extern GFLEXTERN GFL_ERROR GFLAPI gflConvertBitmapIntoDDB ( const GFL_BITMAP *bitmap, HBITMAP *hBitmap );

Они на выходе дают HBITMAP, а поле TBitmap.Handle, как я понимаю, именно этого типа.
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

BBB писал(а):Не понимаю, что значит "упомятнут в текстовой константе".
"Код самой функции" - "внутри" DLL. Т.е. исходый текст тебе недоступен.
Прототип - в файле libgfle.h (лекго находится контекстным поиском).

Возможно, тебе подойдет какая-то из ф-ий (верное, вторая):

extern GFLEXTERN GFL_ERROR GFLAPI gflConvertBitmapIntoDIBSection( const GFL_BITMAP *bitmap, HBITMAP *hDIB );
extern GFLEXTERN GFL_ERROR GFLAPI gflConvertBitmapIntoDDB ( const GFL_BITMAP *bitmap, HBITMAP *hBitmap );

Они на выходе дают HBITMAP, а поле TBitmap.Handle, как я понимаю, именно этого типа.
Ну и где я возьму эту dll?
Формальный тип поля TBitmap.Handle void*, действительный по-моему HWND *.
"Упомянут в текстовой константе" означает существование текстовой константы (в данном случае явной), значение которой есть текст с указанием на даанную функцию.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

atavin-ta писал(а):Ну и где я возьму эту dll?
Скачай отсюда (библиотека бесплатная):
http://www.xnview.com/en/download_gfl.html

Вот прямая ссылка с указанной выше странички на дистрибутив (там и DLL, и header-ы, и приимеры, и Help):
http://download.xnview.com/GflSDK-win.zip
atavin-ta писал(а):Формальный тип поля TBitmap.Handle void*, действительный по-моему HWND *.
Borland C у меня под рукой нет, а в Delphi в классе TBitmap Handle описан как:

property Handle: HBitmap;

Help также пишет:

Provides access to the Windows GDI bitmap handle for accessing the GDI bitmap object.

property Handle: HBitmap;

Description

Use Handle to call a Windows API function that requires the handle of a bitmap object. Pass Handle as the bitmap handle parameter to these functions.

Handle is the HBITMAP encapsulated by the bitmap object. Avoid grabbing the handle directly since it causes the HBITMAP to be copied if more than one TBitmap shares the handle.

Note: Be careful who you give the handle to. If the receiver will take ownership (and destroy) the bitmap handle, call TBitmap.ReleaseHandle.
Ответить