Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.28;
Скачать: CL | DM;

Вниз

Сохранить форму как файл графики   Найти похожие ветки 

 
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]

?



Страницы: 1 вся ветка

Текущий архив: 2002.01.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
3-90230
Mr.Sane
2001-12-25 10:45
2002.01.28
SQL


1-90245
LakeMan
2002-01-09 12:00
2002.01.28
компонент TCrpe. Помогите пожалуйста


1-90265
panov
2002-01-09 08:46
2002.01.28
QReport.Preview Как это работает?


4-90440
Alex870
2001-11-26 21:37
2002.01.28
Подскажите,


3-90188
Andrey_ask
2001-12-21 19:50
2002.01.28
Потеря записей