如何将包含在panel控件里的所有控件(文字插图排版)存为图片(在线等待)(50分)

  • 主题发起人 主题发起人 laohe
  • 开始时间 开始时间
L

laohe

Unregistered / Unconfirmed
GUEST, unregistred user!
我将一些小插图放到了panel控件中,怎样将panel的排版样式存为图片,是用DELPHI实现保存
图片的功能,不是用抓图软件,谢谢,分数不鸲可加
 
有没有人会呀
 
我正在研究!这几天老总叫我做!你的分太少了!
 
panel 不canvas,如果都在屏幕显示区域应该可以.
 
把 From 中对应 panel 的区域写到 TBitmap 中,然后保存!
 
这个例子是把Panel中的所有内容作为Bitmap拷到剪贴版,另外可以用Image显示
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls ,Clipbrd, Grids;

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
Image1: TImage;
Label1: TLabel;
Button2: TButton;
Image2: TImage;
DrawGrid1: TDrawGrid;
Image3: TImage;
Image4: TImage;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function PanelImage(aPanel:TPanel): TBitmap;
var
Ofs: Integer;
begin
Result := TBitmap.Create;
try
Result.Width := aPanel.ClientWidth;
Result.Height := aPanel.ClientHeight;
Result.Canvas.Brush :=aPanel.Brush;
Result.Canvas.FillRect(aPanel.ClientRect);
Result.Canvas.Lock;
try
if GetWindowLong(aPanel.Handle, GWL_STYLE) and WS_BORDER <> 0 then
Ofs := -1 // Don't draw form border
else
Ofs := 0; // There is no border
aPanel.PaintTo(Result.Canvas.Handle, Ofs, Ofs);
finally
Result.Canvas.Unlock;
end;
except
Result.Free;
raise;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
FormImage: TBitmap;

begin
FormImage := PanelImage(Panel1);
try
Clipboard.Assign(FormImage);
Image2.Picture.Assign(Clipboard);
finally
FormImage.Free;
end;

end;

end.
 
没有问题,我们解决过。
panel没有画布属性,TabControl有,用PageControl吧,一样的效果。
给你点源程序,参考一下吧。
Co_Manager_F.ExpPM.Canvas.CopyRect(Co_Manager_F.ExpPM.ClientRect,Co_Manager_F.TabControl1.Canvas,Co_Manager_F.TabControl1.ClientRect);
Co_Manager_F.ExpPM.Stretch:=True;



 
panel没有画布属性?
应该有吧?呵呵。
 
上面的ExpPM是个Image。
 
你能找到Panel.canvas吗?:)
 
还是我来给你解决!!!!!!!

1. 将面板保存为图像
procedure TForm1.Button1Click(Sender: TObject);
var
img:TImage;
begin
img:=TImage.Create(nil);
img.Picture.Bitmap.Width:=panel1.width;
img.picture.Bitmap.Height:=panel1.height;
bitblt(img.canvas.handle,0,0,panel1.width,panel1.height,getdc(panel1.Handle),0,0,srccopy);
img.Picture.SaveToFile('d:/temp.bmp');
img.Free;
end;
 
1. for i := 0 to panel.controlcount-1 do 扫描panel中所有的子控件, 找出panel中所有包含的控件的真正大小(如果比panel小, 就用panel的尺寸)
2. 根据上面获得的尺寸建立一个bitmap
3. 调用panel.paintto(bitmap.canvas.handle, 0, 0)
4. bitmap.savetofile
 
天与地:
你可以看看TCUSTOMPANEL的源码中的PAINT方法,呵呵。
而且TCUSTOMPANEL继承自TCUSTOMCONTROL呀。应该都有
CANVAS和HANDLE属性的。

而且即使是TPANEL,你也可以这么调用的。
var
hd:HDC;
cTmp:TCanvas;
begin
hd:=GetDC(panel1.Handle);
cTmp:=TCanvas.Create;
cTmp.Handle:=hd;
//这里对CTMP进行操作,比如画画等。
cTmp.Handle:=nil;
cTmp.Free;
FreeDC(hd);
end;
 
谢谢各位,jsxjd的答案正好,
 
我实现了!
就几行代码!
 
接受答案了.
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部