Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

Сохранить форму как файл графики 


Surprising   (2002-01-06 17:36) [0]

Мастера, имеется форма с несколькими графиками как мне её сохранить в графическом формате(jpg или bmp) для последующего редактирования изображения или печати.



Z   (2002-01-06 18:24) [1]

unit ScrnCopy;
interface
uses WinTypes, WinProcs, Forms, Classes, Graphics, Controls;
{ Копирует прямоугольную область экрана }
function CaptureScreenRect(ARect : TRect) : TBitmap;
{ Копирование всего экрана }
function CaptureScreen : TBitmap;
{ Копирование клиентской области формы или элемента }
function CaptureClientImage(Control : TControl) : TBitmap;
{ Копирование всей формы элемента }
function CaptureControlImage(Control : TControl) : TBitmap;
{===============================================================}
implementation
function GetSystemPalette : HPalette;
var
PaletteSize:integer;
LogSize:integer;
LogPalette:PLogPalette;
DC:HDC;
Focus:HWND;
begin
result:=0;
Focus:=GetFocus;
DC:=GetDC(Focus);
try
PaletteSize:=GetDeviceCaps(DC, SIZEPALETTE);
LogSize:=SizeOf(TLogPalette)+(PaletteSize-1)*SizeOf(TPaletteEntry);
GetMem(LogPalette, LogSize);
try
with LogPalette^ do
begin
palVersion:=$0300;
palNumEntries:=PaletteSize;
GetSystemPaletteEntries(DC, 0, PaletteSize, palPalEntry);
end;
result:=CreatePalette(LogPalette^);
finally
FreeMem(LogPalette, LogSize);
end;
finally
ReleaseDC(Focus, DC);
end;
end;
function CaptureScreenRect(ARect : TRect) : TBitmap;
var
ScreenDC : HDC;
begin
Result:=TBitmap.Create;
with result, ARect do begin
Width:=Right-Left;
Height:=Bottom-Top;
ScreenDC:=GetDC(0);
try
BitBlt(Canvas.Handle, 0,0,Width,Height,ScreenDC, Left, Top, SRCCOPY );
finally
ReleaseDC(0, ScreenDC);
end;
Palette:=GetSystemPalette;
end;
end;
function CaptureScreen : TBitmap;
begin
with Screen do
Result:=CaptureScreenRect(Rect(0,0,Width,Height));
end;

function CaptureClientImage(Control : TControl) : TBitmap;
begin
with Control, Control.ClientOrigin do
result:=CaptureScreenRect(Bounds(X,Y,ClientWidth,ClientHeight));
end;

function CaptureControlImage(Control : TControl) : TBitmap;
begin
with Control do
if Parent=Nil then
result:=CaptureScreenRect(Bounds(Left,Top,Width,Height))
else
with Parent.ClientToScreen(Point(Left, Top)) do
result:=CaptureScreenRect(Bounds(X,Y,Width,Height));
end;
end.



Surprising   (2002-01-06 18:53) [2]

Эти все функции работают отдельно друг от друга?
В какой файл сохраниться эта картинка или она будет в буфере?



Pat   (2002-01-06 21:12) [3]

>Surprising
Если тебе надо просто сохранить окно в графическом режиме, то
сделай форму активной, нажми Alt+PrintScreen и вставляй из буфера в любой графический редактор...



Z   (2002-01-06 21:54) [4]

Сохраняй эти все функции в отдельный юнит, типа ScrnCopy.pas
Дальше в uses вставляешь ScrnCopy.

Дальше делаешь:

var
bmp: TBitmap;
begin
bmp:=TBitMap.Create //подготавливаем буфер для рисунка
bmp:=CaptureScreen;
bmp.savetofile("c:\screen.bmp");
end;



DK   (2002-01-07 03:39) [5]

2Z - Зачем такая куча кода???

var
FBitmap: TBitmap;
DC: HDC;
H: hWnd;
P: TPoint;
R: TRect;
begin
FBitmap := TBitmap.Create;
H := Form1.Handle;
DC := GetWindowDC(H);
GetWindowRect(H, R);
FBitmap.Width := R.Right - R.Left;
FBitmap.Height := R.Bottom - R.Top;
BitBlt(FBitmap.Canvas.Handle, 0, 0, FBitmap.Width, FBitmap.Height, DC, 0, 0, SRCCOPY);
FBitmap.SaveToFile("MyForm.bmp");
FBitmap.Destroy;
end;



Surprising   (2002-01-10 08:58) [6]

А если форма больше чем размер экрана и функция принт скрин уже не помогает.



aus   (2002-01-10 12:42) [7]

Form1.GetFormImage.SaveToFile(FileName) - это не то что нужно?



Surprising   (2002-01-10 13:22) [8]

2aus: Нет эта функция тоже использует принт скрин, то есть сохраняет только то что видно на экране, а это где-то половина формы остальное исчезает.



Юрий Зотов   (2002-01-10 14:19) [9]

Сам не пробовал, но есть шанс, что сработает PaintTo. То есть, создаем временный битмап, рисуем на нем форму (вызовом Form1.PainTo), а затем сохраняем битмап в файл.



Surprising   (2002-01-10 14:39) [10]

2Юрий Зотов: а в коде это как будет выглядеть, а то я только начинающий.



Bizon   (2002-01-10 14:45) [11]

А графики нарисованы непосредственно на форме, или компонент какой-нибудь используется?



Surprising   (2002-01-10 15:08) [12]

2Bizon: графики нарисованы непосредственно на форме.
Я вот о чём подумал, а если их нарисовать на Image и сохранить только Image в графическом формате, а не всю форму.
Можно ли это как нибудь реализовать.



Mbo   (2002-01-10 15:11) [13]

это намного проще
Image1.Picture.SaveToFile("c:\pic.bmp");



Юрий Зотов   (2002-01-10 15:11) [14]

Проверил - PaintTo работает, но копирует только клиентскую область и плохо копирует дочерние контролы. А вот этот код создает точную копию всей формы.

procedure TForm1.Button1Click(Sender: TObject);
var
DC: HDC;
begin
with TBitmap.Create do
try
Height := Self.Height;
Width := Self.Width;
DC := GetWindowDC(Self.Handle);
try
BitBlt(Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY)
finally
ReleaseDC(Self.Handle, DC)
end;
SaveToFile("C:\Form1.bmp")
finally
Free
end
end;



Bizon   (2002-01-10 15:12) [15]

Их можно нарисовать используя Chart и сохранить в bmp



Surprising   (2002-01-10 15:52) [16]

2Юрий Зотов: нет к сожалению не работает опять копирует только видимую область.



Surprising   (2002-01-10 17:15) [17]

2Mbo: не работает или я что-то не так делаю.
2Bizon: я их рисую TChart_ом только их у меня несколько на форме и форма получается больше размера экрана.



aus   (2002-01-10 19:02) [18]

Если нужно сохранять графики, а не форму, то и рисовать их нужно в битмапе, этот же битмап сохранять в файл. А для вывода на экран этот же битмап выводить на форму.



Surprising   (2002-01-10 19:05) [19]

А как рисовать в битмапе?



aus   (2002-01-10 19:54) [20]

Ты же рисуешь на TForm.canvas, и TBitmap имеет свой canvas. Создай TBitmap, задай ему Width и height и рисуй также.



Mbo   (2002-01-11 07:43) [21]

>2Mbo: не работает или я что-то не так делаю.
у меня работает.
image1.Canvas.Ellipse(10,10,30,30);
image1.Picture.SaveToFile("e:\q.bmp");


но если уж Chart-ом рисуешь, то им и сохраняй, и неважно, выходит ли он за край формы. Кстати, не подойдет ли тебе pagecontrol для экономии места на экране?

chart1.saveto...
там несколько есть, в Bitmap,наверно, тебе надо



Bizon   (2002-01-11 09:42) [22]

Если рисуешь chart_ом то не важно, что куда выходит.
chart1.savetobitmapfile("name.bmp");
Все.



nikkie   (2002-01-11 09:59) [23]

>Surprising
в принципе, тебе правильно говорят про то, что сохранять логичнее только график, а не всю форму. но чисто ради любопытства - что будет а если прямо перед методом Юрия Зотова вызвать Form.Repaint?



Surprising   (2002-01-11 20:23) [24]

2nikkie: у меня просто 16 графиков на одной форме и сохранить их нужно в один файл графики.
А что делает Form.Repaint.



Surprising   (2002-01-11 20:29) [25]

?




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.02 c
3-90203           Andrey196             2001-12-23 19:49  2002.01.28  
Помогите!!! :)


7-90395           GhostK                2001-10-16 08:15  2002.01.28  
Как это сделать???


4-90434           a-leksey              2001-11-26 11:39  2002.01.28  
Нужно на время и конкретно отключить клавиатуру и мышь


1-90305           Pavel_s               2002-01-10 13:07  2002.01.28  
Об FLAT


1-90319           Tor                   2002-01-08 22:42  2002.01.28  
Массивы объектов