![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как сделать снимок(скриншот) формы во время исполнения?
Starkom © (2002-08-26 14:02:00)Есть хранилище форм в БД, и надо сделать функцию превью, которая бы просто отображала внешний вид формы.
Как это сделать лучше?
Форма сама сконструированная есть. По идее, взять канвас и как-нибудь этот канвас отобразить в превью-панели. А вот как?
Starkom (2002-08-27 11:18:00) [1]:))
сделал
tempForm.Left:=-10000;
tempForm.Show;
bmp:=tempForm.GetFormImage;
и все заработало!
2 skier & Alx2: спасибо огромное.
Alx2 (2002-08-27 10:13:00) [2]>Starkom (27.08.02 08:53)
Нужно обязательно чтобы у формы visible=true. Либо писать наследника формы.
Так получается, потому-что wincontrolы дохнут для Windows при visible=false и возрождаются при visible=true.
PS Детально не въезжал. Но истина где-то рядом :)
Starkom (2002-08-27 08:53:00) [3]в procedure TWinControl.PaintTo(DC: HDC; X, Y: Integer);
есть такой код -
if FWinControls <> nil then
for I := 0 to FWinControls.Count - 1 do
with TWinControl(FWinControls[I]) do
if Visible then PaintTo(DC, Left, Top);
Проблема в том, что в FWinControls не добавляются компоненты, потому то они и не отрисовываются. Почему в FWinControls их нет, непонятно. Как правильно добавлять компоненты?
У меня это делается так:
Grd:=TMyGrid.Create(Form); // TMyGrid-наследник TGrid. Form:TMyForm-наследник TForm.
ну и потом парентом выставляется TabSheet.
При таком коде вызывается TControl.Insert(), а в FWinControls компоненты вставляются при вызове TWinControl.Insert()!
Alx2 (2002-08-27 08:26:00) [4]>Starkom (27.08.02 08:21)
Действительно :) Кое-что прорисовывается только при наличии видимой формы.
Alx2 (2002-08-27 08:23:00) [5]Form2 еще не видна, но в Image, находящимся, например, на Form1, можно получить ее изображение, повесив на какую-нибудь кнопку из Form1 следущее:
Form2.PaintTo(Image1.Canvas,0,0);
Starkom (2002-08-27 08:21:00) [6]посмотрел исходники GetFormImage:
PaintTo там и используется. А результат несовсем верен.
Starkom (2002-08-27 08:18:00) [7]2 alx2:
Не совсем разобрался с методом. Делаю так:
bmp:=TBitmap.Create();
tempForm.PaintTo(bmp.Handle,10,10);
DepositPreviewForm.Image1.Picture.Bitmap:=bmp;
DepositPreviewForm.Show;
Ничего не происходит. tempForm как раз нужная невидимая форма, снимок которой надо получить.
Alx2 (2002-08-27 08:08:00) [8]посмотри метод PaintTo
Starkom (2002-08-27 07:55:00) [9]2 skier: :)) спасибо за пример, но дело в том, что формы то самой не видно на экране. Она сконструирована в памяти, но отображать ее не надо, и даже нельзя. Для того то и делается превью.
Skier (2002-08-26 14:49:00) [10]>Starkom
Не поможет ?
function GetFormExImage(const AForm : TForm) : TBitmap;
begin
Result := nil;
if AForm = nil then Exit;
Result := TBitmap.Create;
Result.Height := AForm.ClientHeight;
Result.Width := AForm.ClientWidth;
Result.Canvas.Brush := AForm.Brush;
Result.Canvas.FillRect(AForm.ClientRect);
Result.Canvas.Lock;
try
Result.Canvas.CopyRect(Rect(0,
0,
Result.Width,
Result.Height),
AForm.Canvas,
AForm.ClientRect);
finally
Result.Canvas.UnLock;
end; //try
end; //GetFormExImage
//......................
procedure TForm1.Button2Click(Sender: TObject);
var
ABitmap : TBitmap;
begin
//......................
ABitmap := GetFormExImage(Self);
if ABitmap <> nil then begin
ABitmap.SaveToFile("C:\###\FormImage.bmp");
ABitmap.Free;
end; //if
//......................
end;
Starkom (2002-08-26 14:18:00) [11]2 Skier:
спасибо, НО результат не совсем ожидаемый. На полученном отображении формы не отрисованы самописные компоненты. Это очень плохо, и непонятно почему так происходит.
Skier (2002-08-26 14:05:00) [12]>Starkom
TForm.GetFormImage ?