请教抓屏打印两问题

hongss 2010-12-12 02:52:25
加精
第一,在抓屏打印中,抓好的图片直接打印的话,如果抓全屏或者当前界面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等数据计算出的比例不一样,这又是为什么?
如果用这里计算出来的比例,打印出来的图片。。。惨不忍睹啊 


请各位指点下。
...全文
982 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq15885470562 2011-01-04
  • 打赏
  • 举报
回复
我也正想知道
q358535911 2011-01-04
  • 打赏
  • 举报
回复
為什麼不除以 2.54。
tiger_ok1 2011-01-03
  • 打赏
  • 举报
回复
学习。。。。
dungeonsnd 2011-01-03
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
xijiji!
lizhi_625 2011-01-02
  • 打赏
  • 举报
回复
大家互相讨论学习,谢谢分享~!
officemouse 2011-01-02
  • 打赏
  • 举报
回复
深情呼唤高手现身~~~~
cmjhappy 2011-01-01
  • 打赏
  • 举报
回复
大家互相讨论学习,谢谢分享~!
Codefans_Fan 2011-01-01
  • 打赏
  • 举报
回复
哈哈哈。。。。不错
supernhtr 2010-12-31
  • 打赏
  • 举报
回复
henhao!!!!谢谢了!!!!
浩南_哥 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 hongss 的回复:]

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

明天2010年最后一天了,不把问题留到2011年
[/Quote]
这两天也查了资料还是不知道为啥不能直接打印,很奇怪
这个方法也可以吧 先保存到Stream里 然后再加载打印
浩南_哥 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 78 楼 lch0422 的回复:]

引用 4 楼 hongss 的回复:
为什么没有2楼呢?

是的哦
[/Quote]
被和谐了
奔雷手 2010-12-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hongss 的回复:]
为什么没有2楼呢?
[/Quote]
是的哦
hongss 2010-12-30
  • 打赏
  • 举报
回复
唉。。。实在不行的话,就用保存、加载、打印的模式算了。。。

明天2010年最后一天了,不把问题留到2011年
Dreamtosail鹏 2010-12-30
  • 打赏
  • 举报
回复
这个不懂
ok123456abc 2010-12-30
  • 打赏
  • 举报
回复
又学到东西了
pyb2991385 2010-12-30
  • 打赏
  • 举报
回复
不错,又见高手了
hongss 2010-12-29
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 machh 的回复:]
你抓屏后的全屏数据是放在缓冲区的吧, 这个时候数据是被锁定了的

你可以再构造一个临时内存,将数据拷贝到临时DC,然后打印, 试试。
[/Quote]

这里请教一下,如果抓的不是全屏,而是一个活动窗口的话,抓屏后的数据不是放在缓冲区的吗?

只要不是全屏,抓图后的图像是可以打印、保存的……
ELWEN123 2010-12-29
  • 打赏
  • 举报
回复
咳,没办法啊
ELWEN123 2010-12-29
  • 打赏
  • 举报
回复
假的是
加载更多回复(42)

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧