对于我来说不知道的问题就是大问题,欢迎拿50分,(50分)

  • 主题发起人 kingkong
  • 开始时间
K

kingkong

Unregistered / Unconfirmed
GUEST, unregistred user!
最近需要一个直接打印Form的程序,要求能在窗口不完全
展开的情况下(比如窗口大小超过屏幕)打印窗口上所有的内容,
还有,屏幕显示尺寸和打印尺寸之间的比例如何算.请各位帮忙尽量
给源码,先谢过了.
 
1、打印窗口。每个TWinControl 都有一个 PaintTo 的方法。
可以用它来定位 DC 到打印机就可以了。
2、用 GetDeviceCaps() 可以获取设备的相关参数.
这两部分内容分别在 Delphi 及 Win32 SDK 帮助中有很好的解释。
 
要打印窗体,使用
From1.print;
要调节比例,设置From1的PrintScale属性即可
 
大家能不能祥细一点,另外,donkey先生,我要的是没完全显示的窗口也可全部
打印,用form.print只能打印已经显示出来的部份
 
那最好用PaintTo了,对了,直接截取屏幕的办法试过吗?(还是paintto好些)
 
其实关键是要有画布的概念,想像成一个画板,所有的东西都画在上面(虽然Form,BUTTON,LISTBOX
都各有个的Canvas.但是可以把这些Canvas统统画到同一个Canvas上,这就是你想要的了,当然
,打印机也可以抽象成一个Canvas)
 
同意donkey
你直接Canvas画就OK了
我原来试过没问题
 
找最简便的方法实施!?
 
donkey先生:
谢谢您的答复,不过我实在不很明白,请原谅我的愚笨,能不能给我发一小段
源程序,只要能打一个控件就行,谢谢,非常感谢!分数我还可以再加。
kingkong@public.cta.cq.cn
 
大家好,我已经找到答案了,如下,所以,我不能给各位加分,对不起了.
修改一下 VCL 的源程序,将 Forms.pas 和 Controls.pas 拷到你工程所在的目录下,
然后作以下修改:
1)Forms.pas 中修改 TCustomForm.GetFormImage 方法,如下:
function TCustomForm.GetFormImage: TBitmap;
var
OfsX, OfsY: Integer;
R: TRect;
begin
Result := TBitmap.Create;
R := ClientRect;
OfsX := 0;
OfsY := 0;
try
with HorzScrollBardo
if FCalcRange > 0 then
begin
R.Right := Range + 4;
OfsX := Position;
end;
with VertScrollBardo
if FCalcRange > 0 then
begin
R.Bottom := Range + 4;
OfsY := Position;
end;
Result.Width := R.Right;
Result.Height := R.Bottom;
Result.Canvas.Brush := Brush;
Result.Canvas.FillRect(R);
Result.Canvas.Lock;
try
if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
begin
Dec(OfsX);
Dec(OfsY);
end;
PaintTo(Result.Canvas.Handle, OfsX, OfsY);
finally
Result.Canvas.Unlock;
end;
except
Result.Free;
raise;
end;
end;
2、Controls.pas 中修改 TWinControl.PaintTo 方法,如下:
procedure TWinControl.PaintTo(DC: HDC;
X, Y: Integer);
var
I, EdgeFlags, BorderFlags, SaveIndex: Integer;
R: TRect;
begin
Include(FControlState, csPaintCopy);
SaveIndex := SaveDC(DC);
MoveWindowOrg(DC, X, Y);
BorderFlags := 0;
EdgeFlags := 0;
if GetWindowLong(Handle, GWL_EXSTYLE) and WS_EX_CLIENTEDGE <> 0 then
begin
EdgeFlags := EDGE_SUNKEN;
BorderFlags := BF_RECT or BF_ADJUST
end else
if GetWindowLong(Handle, GWL_STYLE) and WS_BORDER <> 0 then
begin
EdgeFlags := BDR_OUTER;
BorderFlags := BF_RECT or BF_ADJUST or BF_MONO;
end;
if BorderFlags <> 0 then
begin
GetClipBox(DC, R);
DrawEdge(DC, R, EdgeFlags, BorderFlags);
MoveWindowOrg(DC, R.Left, R.Top);
IntersectClipRect(DC, 0, 0, R.Right - R.Left, R.Bottom - R.Top);
end;

Perform(WM_ERASEBKGND, DC, 0);
Perform(WM_PAINT, DC, 0);
if FWinControls <> nil then
for I := 0 to FWinControls.Count - 1do
with TWinControl(FWinControls)do
if Visible then
PaintTo(DC, Left, Top);
RestoreDC(DC, SaveIndex);
Exclude(FControlState, csPaintCopy);
end;

存盘后退出Delphi再重新进入Delphi,TCustomForm.GetFormImage 返回的 BitMap
就包括隐藏的部分,就可以调用Form.print打印了;在Delphi5下测试通过.
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
927
SUNSTONE的Delphi笔记
S
顶部