Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
ВнизКак сделать снимок(скриншот) формы во время исполнения? Найти похожие ветки
← →
Starkom (2002-08-26 14:02) [0]Есть хранилище форм в БД, и надо сделать функцию превью, которая бы просто отображала внешний вид формы.
Как это сделать лучше?
Форма сама сконструированная есть. По идее, взять канвас и как-нибудь этот канвас отобразить в превью-панели. А вот как?
← →
Skier (2002-08-26 14:05) [1]>Starkom
TForm.GetFormImage ?
← →
Starkom (2002-08-26 14:18) [2]2 Skier:
спасибо, НО результат не совсем ожидаемый. На полученном отображении формы не отрисованы самописные компоненты. Это очень плохо, и непонятно почему так происходит.
← →
Skier (2002-08-26 14:49) [3]>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-27 07:55) [4]2 skier: :)) спасибо за пример, но дело в том, что формы то самой не видно на экране. Она сконструирована в памяти, но отображать ее не надо, и даже нельзя. Для того то и делается превью.
← →
Alx2 (2002-08-27 08:08) [5]посмотри метод PaintTo
← →
Starkom (2002-08-27 08:18) [6]2 alx2:
Не совсем разобрался с методом. Делаю так:
bmp:=TBitmap.Create();
tempForm.PaintTo(bmp.Handle,10,10);
DepositPreviewForm.Image1.Picture.Bitmap:=bmp;
DepositPreviewForm.Show;
Ничего не происходит. tempForm как раз нужная невидимая форма, снимок которой надо получить.
← →
Starkom (2002-08-27 08:21) [7]посмотрел исходники GetFormImage:
PaintTo там и используется. А результат несовсем верен.
← →
Alx2 (2002-08-27 08:23) [8]Form2 еще не видна, но в Image, находящимся, например, на Form1, можно получить ее изображение, повесив на какую-нибудь кнопку из Form1 следущее:
Form2.PaintTo(Image1.Canvas,0,0);
← →
Alx2 (2002-08-27 08:26) [9]>Starkom (27.08.02 08:21)
Действительно :) Кое-что прорисовывается только при наличии видимой формы.
← →
Starkom (2002-08-27 08:53) [10]в 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 10:13) [11]>Starkom (27.08.02 08:53)
Нужно обязательно чтобы у формы visible=true. Либо писать наследника формы.
Так получается, потому-что wincontrolы дохнут для Windows при visible=false и возрождаются при visible=true.
PS Детально не въезжал. Но истина где-то рядом :)
← →
Starkom (2002-08-27 11:18) [12]:))
сделал
tempForm.Left:=-10000;
tempForm.Show;
bmp:=tempForm.GetFormImage;
и все заработало!
2 skier & Alx2: спасибо огромное.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.09.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c