![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как програмно сделать ПринтСкрин?
Zonder2008 © (2008-06-16 09:32:00)Как програмно сделать ПринтСкрин формы а еще лучше отдельных ее компонентов, скажем Мемо?
korneley (2008-06-17 12:44:00) [1]
> {RASkov} © (17.06.08 11:56) [9]
> [1] - ведь тоже самое :)
Не совсем :) Выделение памяти, конечно, и там и там происходит "внутре", но первое - метод класса, во втором случае имеем функцию ни к какому классу не относящуюся. При "ненаступании" - без разницы, но в первом случае проще (как мне кажется) отнестись к методу, как кCreate;)
{RASkov} (2008-06-17 11:56:00) [2]> [8] kivadim (16.06.08 15:58)
> извини если что не так, просто помог человеку.
Подсунул ему грабли :)
> [7] korneley © (16.06.08 15:47)
[1] - ведь тоже самое :)
В прочем, это всего лишь грабли и просто не нужно на них наступать...
kivadim (2008-06-16 15:58:00) [3]:) извини если что не так, просто помог человеку. мог бы просто ссылку кинуть на этот пример, но результат думаю был бы тот же.
korneley (2008-06-16 15:47:00) [4]
> kivadim (16.06.08 14:28) [6]
> >> korneley © (16.06.08 10:25) [4]не понял в чем причина
> недовольства?
Причина:
В разделе "Начинающим", использовать создание объекта внутри функции, возвращающей ссылку на созданный внутри неё объект - воспитание камикадзе (имхо, естественно) Автор топика скопирует код, а потом будет жаловаться: "Куда память утекает?" Скопировать пример с "Мечты вуайериста - чужие окна" не сложно, сложно потом с такими "коллегами" работать.
kivadim (2008-06-16 14:28:00) [5]>> korneley © (16.06.08 10:25) [4]
не понял в чем причина недовольства?
korneley (2008-06-16 10:42:00) [6]
> Zonder2008 (16.06.08 10:23) [3]
Можно так, например:
bmp := WindowToBMP(memo1.Handle);
Удачи... Только не забудь потом объект, функцией созданный, удалить. "Каждый умирает той смертью, которую выбрал сам" (с) БГ
korneley (2008-06-16 10:25:00) [7]
> kivadim (16.06.08 10:07) [2]
>Result := TBitmap.Create;
Это сейчас считается хорошим тоном или просто, так сказать, невзирая на текст, скопипастили?
Zonder2008 (2008-06-16 10:23:00) [8]kivadim (16.06.08 10:07) [2]
А можете привести пример вызова вашей функции например для Memo1? Ато я не совсем понял - это дексриптор (WD: HWND ) ? Как узнать его?
kivadim (2008-06-16 10:07:00) [9]
Function WindowToBMP(WD: HWND ): TBitmap;
Var
WinDC: HDC;
ARect : TRect;
begin
Result := TBitmap.Create; // Создаем рисунок, куда будем копировать
GetWindowRect(WD, ARect); // Узнаем размер
with Result, ARect do
begin
Width := ARect.Right - ARect.Left;
Height := ARect.Bottom - ARect.Top;
If (Width=0) or (Height=0) then
Begin
MessageDlg('Размер области формы равен нулю',
mtWarning,[mbOk],0); // А вдруг у него нет размера ???
Exit; // Тогда выходим
End;
WinDC:=GetWindowDC(Wd); // получаем для окна контекст устройства
ShowWindow(Wd, SW_SHOW); // на всякий случай выведем окно
BringWindowToTop(WD); // и поместим поверх окон
try
// копируем оттуда прямоугольную область на канву
// растрового изображения
BitBlt( Canvas.Handle, 0, 0, Width, Height, WinDC, 0, 0, SRCCOPY);
finally
end;
end;
end;
korneley (2008-06-16 09:45:00) [10]
Form1.GetFormImageИ делайте с этим битмапом, всё, что угодно. Програмно.