请教抓屏打印两问题
第一,在抓屏打印中,抓好的图片直接打印的话,如果抓全屏或者当前界面Max化,不能打印,但是保存没什么问题,这是怎么回事?
源码:
- Delphi(Pascal) code
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); //图片居中打印,[color=#FF0000]HScale为屏幕、打印机比例,这里也有个问题,就是下边的第二问题[/color] 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;第二,就是上边的打印比例问题。
源码:
- Delphi(Pascal) code
//获取当前打印机的分辨率 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等数据计算出的比例不一样,这又是为什么?如果用这里计算出来的比例,打印出来的图片。。。惨不忍睹啊
请各位指点下。
[解决办法]
Px:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
Py:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);
px 什不除以 2.54。
[解决办法]
GetDeviceCaps(Printer.Handle,LOGPIXELSX);获得水平方向每英寸多少个点
GetDeviceCaps(Printer.Handle,LOGPIXELSY) 获得竖直方向每英寸多少个点
像我的的打印机hp
GetDeviceCaps(Printer.Handle,LOGPIXELSX);=600
GetDeviceCaps(Printer.Handle,LOGPIXELSY);=600
A4纸的尺寸是210x297毫米 ,
1英寸=25.4毫米,
经过换算 210/25.4*600 大于等于4961
297/25.4*600 大于等于7016
A4转成成点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
直接计算打印机可以尺寸的比例
[解决办法]
我也试了下 也是不行不知道怎么回事
不过是可以试试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不能直接打印确实很费解啊
[解决办法]
看看是不是用到内存DC了,
显示的时候可以用内存DC,但是打印机没有内存DC,如果用到的话就有问题了。
[解决办法]
你查一下TForm的print方法,是如何实现,就一切都明白了。
[解决办法]
既然能保存成文件,然后调用文件来打印。
[解决办法]
你抓屏后的全屏数据是放在缓冲区的吧, 这个时候数据是被锁定了的
你可以再构造一个临时内存,将数据拷贝到临时DC,然后打印, 试试。
[解决办法]
[解决办法]
大家互相讨论学习,谢谢分享~!
[解决办法]
深情呼唤高手现身~~~~