首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

请问抓屏打印两有关问题

2012-02-04 
请教抓屏打印两问题第一,在抓屏打印中,抓好的图片直接打印的话,如果抓全屏或者当前界面Max化,不能打印,但

请教抓屏打印两问题
第一,在抓屏打印中,抓好的图片直接打印的话,如果抓全屏或者当前界面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,然后打印, 试试。
[解决办法]
探讨

唉。。。实在不行的话,就用保存、加载、打印的模式算了。。。



明天2010年最后一天了,不把问题留到2011年


[解决办法]
大家互相讨论学习,谢谢分享~!
[解决办法]
深情呼唤高手现身~~~~

热点排行