第一,在抓屏打印中,抓好的图片直接打印的话,如果抓全屏或者当前界面Max化,不能打印,但是保存没什么问题,这是怎么回事?源码:procedure TForm1.BitBtn4Click(Sender: TObject);
var
B: TBitmap;
R: TRect;
Str: String;
begin
B:= TBitmap.Create;
ScreenShot(Left,Top,Width,Height,B);
Str:= 'D:\XyScreenShot_'+FormatDateTime('yymmddhhnnss',now)+'.BMP';
B.SaveToFile(Str);
B.LoadFromFile(Str); //图片居中打印,HScale为屏幕、打印机比例,这里也有个问题,就是下边的第二问题
R.Left:= (Printer.PageHeight-Round(B.Width*HScale)) div 2;
R.Top:= (Printer.PageWidth-Round(B.Height*HScale)) div 2;
R.Right:= R.Left+Round(B.Width*HScale);
R.Bottom:= R.Top+Round(B.Height*HScale);
try
Printer.Orientation:= poLandscape; //横向
Printer.BeginDoc;
Printer.Canvas.StretchDraw(R,B);
Printer.EndDoc;
except
Printer.Abort;
raise;
end;
FreeAndNil(B);
end;第二,就是上边的打印比例问题。源码: //获取当前打印机的分辨率
Px:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
Py:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
//根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例
PSc:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/Screen.PixelsPerInch+0.5);这里计算出的比例,跟我自己取出Printer.Width等数据计算出的比例不一样,这又是为什么?
如果用这里计算出来的比例,打印出来的图片惨不忍睹啊
请各位指点下。
var
B: TBitmap;
R: TRect;
Str: String;
begin
B:= TBitmap.Create;
ScreenShot(Left,Top,Width,Height,B);
Str:= 'D:\XyScreenShot_'+FormatDateTime('yymmddhhnnss',now)+'.BMP';
B.SaveToFile(Str);
B.LoadFromFile(Str); //图片居中打印,HScale为屏幕、打印机比例,这里也有个问题,就是下边的第二问题
R.Left:= (Printer.PageHeight-Round(B.Width*HScale)) div 2;
R.Top:= (Printer.PageWidth-Round(B.Height*HScale)) div 2;
R.Right:= R.Left+Round(B.Width*HScale);
R.Bottom:= R.Top+Round(B.Height*HScale);
try
Printer.Orientation:= poLandscape; //横向
Printer.BeginDoc;
Printer.Canvas.StretchDraw(R,B);
Printer.EndDoc;
except
Printer.Abort;
raise;
end;
FreeAndNil(B);
end;第二,就是上边的打印比例问题。源码: //获取当前打印机的分辨率
Px:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
Py:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
//根据打印机和屏幕的分辨率计算出从屏幕转换到打印机的比例
PSc:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/Screen.PixelsPerInch+0.5);这里计算出的比例,跟我自己取出Printer.Width等数据计算出的比例不一样,这又是为什么?
如果用这里计算出来的比例,打印出来的图片惨不忍睹啊
请各位指点下。
解决方案 »
- 如何锁定系统屏幕
- 会C或C++的前辈过来帮帮忙将个C函数转成delphi函数谢谢!
- 窗体最小化以后,内存减少,恢复窗体后,内存的数量比最开始少很多,请大侠详解
- delphibbs离线数据chm格式723M版本(05年3月版),bt种子
- 值的传递出错,原因何在???
- 大侠们救命,如何在dwg文件 中添加文字或另一张dwg图
- 我正在写一个多级授权权限管理模块,哪位大哥、大姐能提供一些资料啊。给100分
- 怎样获取其他程序DrawGrid中的内容?
- 有关TServerSocket.SOcket.Connections[n]的问题。。。。。
- About .ini 文件
- CloseFile不起作用
- 有那位高手有使用WinHttp.WinHttpRequest.5.1 post数据的delphi例子,高分重酬
Py:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);px 為什麼不除以 2.54。
对我的问题无干扰。
GetDeviceCaps(Printer.Handle,LOGPIXELSY) 获得竖直方向每英寸多少个点像我的的打印机hp
GetDeviceCaps(Printer.Handle,LOGPIXELSX);=600
GetDeviceCaps(Printer.Handle,LOGPIXELSY);=600A4纸的尺寸是210x297毫米 ,
1英寸=25.4毫米,
经过换算 210/25.4*600 大于等于4961
297/25.4*600 大于等于7016A4转成成点4961*7016这个和
GetDeviceCaps(printer.Handle,PHYSICALWIDTH)
GetDeviceCaps(printer.Handle,PHYSICALHEIGHT)
是一致的
但是打印的时候有两边是有边距不能打印的
GetDeviceCaps(printer.Handle,PHYSICALOFFSETX)=88
GetDeviceCaps(printer.Handle,PHYSICALOFFSETY)=84实际A纸的可打印的点式 4784*6848和
GetDeviceCaps(printer.Handle,HORZRES) 这个就是Printer.PageWidth
GetDeviceCaps(printer.Handle,VERTRES) 这个就是Printer.PageHeight
相等你可以直接用Printer.PageWidth 和 Printer.PageHeight
直接计算打印机可以尺寸的比例
Printer.PageWidth = 9900
Printer.PageHeight = 14014
这个尺寸包括边距吗?显示器 1440*900的分辨率,抓出来的图就是这么大的。
Canvas.StretchDraw(Rect(0,571,14014,8759),B);
抓完图保存,然后Load出来再Printer打印,就可以这是什么毛病。。
打印时什么样子
不过是可以试试API函数直接打印
if (StretchDIBits(pd.hDC, xLeft, yTop, (int) ((float) bmih.biWidth
* fScaleX), (int) ((float) bmih.biHeight * fScaleY), 0, 0,
bmih.biWidth, bmih.biHeight, lpBits, lpBitsInfo, iUsage,
SRCCOPY) == GDI_ERROR)
这个是我从MSDN上摘抄下来了的,应该是可以的我试过了。
Printer不能直接打印确实很费解啊
一直报函数找不到现在总算编译通过了,后面可以开始研究emule了
显示的时候可以用内存DC,但是打印机没有内存DC,如果用到的话就有问题了。
print方法我已经实现了,现在要的是Printer的全屏抓屏打印
嗯,这个办法我试过了,可行。就是觉得这样多了一道手脚,麻烦了点,就想直接用Printer来完成打印,可是老是不行……没想明白怎么回事~
这个方法也可以吧 先保存到Stream里 然后再加载打印