Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.04.2011, 01:10
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию "Чистое" изображение чужой формы

Здравствуйте, уважаемые форумчане!

(Это дополнение к моему недавнему вопросу в этом разделе форума)

Мне нужно получить снимок с окна другой программы, чтобы потом обрабатывать это изображение в своей. Я делал как: получал контекст устройства (DC) чужой формы, в своей программе создавал объект TBitmap, затем с помощью функции BitBlt копировал в свой TBitmap изображение с контекста этой чужой формы. Но проблема в том, что если чужая форма перекрыта окнами других приложений, изображение получается "грязное", то есть в нем я получаю также снимки перекрывающих форм. Мне этого не надо.

Знаю, что в классе TForm есть метод GetFormImage, а так же метод PainTo. Вопрос такой: можно ли создать объект TForm, привязанный к любому произвольно выбранному окну и его инкапсулирующий, с тем, чтобы я мог использовать один из вышеуказанных методов для получения "чистого" снимка формы? Если да, то как это делается?

P.S. Я заглядывал в исходник PaintTo. Можно было бы в лоб использовать последовательность вызовов Win32 API из него, но мне хочется как-то по простому, хотя вроде, как написано там, так и несложно. В любом случае, привязка TForm к произвольной форме могла бы пригодиться в дальнейшем и для других задач.

С уважением, Дмитрий Новиков
Ответить с цитированием
  #2  
Старый 11.04.2011, 11:40
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Цитата:
Сообщение от Homez
Вопрос такой: можно ли создать объект TForm, привязанный к любому произвольно выбранному окну и его инкапсулирующий, с тем, чтобы я мог использовать один из вышеуказанных методов для получения "чистого" снимка формы?
нет.......
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 11.04.2011, 13:06
x128 x128 вне форума
Новичок
 
Регистрация: 03.02.2010
Сообщения: 64
Репутация: 133
По умолчанию

С некоторыми ограничениями можно получить скриншот перекрытого окна с помощью функции PrintWindow.
Ответить с цитированием
  #4  
Старый 11.04.2011, 14:42
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

А как мне получить доступ к PrintWindow? У меня Delphi 7, в Windows.pas этой функции еще нет.
Ответить с цитированием
  #5  
Старый 11.04.2011, 14:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
...

function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: Cardinal): Boolean; stdcall external user32;

implementation

...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 11.04.2011, 16:04
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

Тогда вопрос такой. Мне нужно получить скриншот клиентской части окна. Насколько я понял, для этого надо вызывать PrintWindow с флагом PW_CLIENTONLY, и тогда вызывается сообщение для нужного мне окна WM_PRINTCLIENT. Но в документации я прочитал, что оно не обрабатывается, в отличие от WM_PRINT, автоматически с помощью DefWindowProc, программист должен написать свой обработчик этого сообщения. Кажется, программист, разработавший нужное окно, это сделал, но коряво, так что с флагом PW_CLIENTONLY номер не проходит. Получается, что мне доступно только целиковое изображение нужного мне окна с рамкой и заголовком. Вопрос такой: как мне отсечь из получаемого мной изображения именно клиентскую область? то есть, мне нужно смещение клиентской области окна относительно неклиентской. В Win32 API я подходящей функции я не знаю. Как мне быть?
Ответить с цитированием
  #7  
Старый 11.04.2011, 16:05
Аватар для Vayrus
Vayrus Vayrus вне форума
Исполняемый Ретровирус
 
Регистрация: 09.08.2008
Адрес: Umbrella Corporation
Сообщения: 743
Репутация: 1293
Лампочка

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

ЗЫ
А вообще ты можешь сперва вывести окно на передний план, а потом уже сделать скриншот. В идеале потом можешь вернуть обратно окошко на задний план)
Ответить с цитированием
  #8  
Старый 11.04.2011, 16:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

GetClientRect / GetWindowRect ?
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 11.04.2011, 16:14
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

Ну какая Вам, извините, разница, что у меня за программа? На форумах многие задают вопросы, ища помощи и не уточняя, что за софтину они пишут, а только какая задача перед ними стоит, которую они решить пока не в силах. Скриншот клиентской области программы мне нужен для некоторой специальной обработки, а какой именно - уж это я умолчу.

А выдвигать нужное мне окно на передний план и затем задвигать его обратно - не пойдет, некомильфо. Я ж знаю, что можно снимок корректный получить и без этого. Теперь передо мной стоит вопрос, как мне из него выделить именно клиентскую часть окна.
Ответить с цитированием
  #10  
Старый 11.04.2011, 16:17
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

NumLock, я знаю эти функции, и они мне не помогут. GetWindowRect вернет мне размеры и позицию всего окна. А GetClientRect - только размеры неклиентской области окна. А мне нужно кроме этого смещение клиентской области относительно неклиентской.
Ответить с цитированием
  #11  
Старый 11.04.2011, 16:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
The GetClientRect function retrieves the coordinates of a window's client area.
все легко получается:
Код:
var
  rct: TRect;
  TopLeft: TPoint;
begin
  Windows.GetClientRect(Handle, rct);
  TopLeft.X:=0;
  TopLeft.Y:=0;
  Windows.ClientToScreen(Handle, TopLeft);
  rct.Left:=rct.Left+TopLeft.X;
  rct.Top:=rct.Top+TopLeft.Y;
  rct.Right:=rct.Right+TopLeft.X;
  rct.Bottom:=rct.Bottom+TopLeft.Y;
  Memo1.Lines.Add('--GetClientRect--');
  Memo1.Lines.Add(IntToStr(rct.Left));
  Memo1.Lines.Add(IntToStr(rct.Top));
  Memo1.Lines.Add(IntToStr(rct.Right));
  Memo1.Lines.Add(IntToStr(rct.Bottom));
  Windows.GetWindowRect(Handle, rct);
  Memo1.Lines.Add('--GetWindowRect--');
  Memo1.Lines.Add(IntToStr(rct.Left));
  Memo1.Lines.Add(IntToStr(rct.Top));
  Memo1.Lines.Add(IntToStr(rct.Right));
  Memo1.Lines.Add(IntToStr(rct.Bottom));
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #12  
Старый 11.04.2011, 16:41
Homez Homez вне форума
Прохожий
 
Регистрация: 10.03.2011
Сообщения: 20
Репутация: 10
По умолчанию

А, все, понял. То есть если мы прибавляем к координатам, получаемым функцией GetClientRect, абсолютные координаты левой верхней точки клиентской области, то мы получаем абсолютные координаты этой клиентской области. Тогда вычитая из полученных координат координаты всего окна, мы получаем то самое смещение. Спасибо!

Последний раз редактировалось Homez, 11.04.2011 в 17:50.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 16:58.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter