第一,在抓屏打印中,抓好的图片直接打印的话,如果抓全屏或者当前界面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等数据计算出的比例不一样,这又是为什么?
如果用这里计算出来的比例,打印出来的图片惨不忍睹啊 
请各位指点下。

解决方案 »

  1.   

      Px:=GetDeviceCaps(Printer.Handle,LOGPIXELSX);
      Py:=Trunc(GetDeviceCaps(Printer.Handle,LOGPIXELSY)/2.54);px 為什麼不除以 2.54。
      

  2.   

    哦,那个是我后来为了看看GetDeviceCaps抓出来的点数是多少专门去掉的。
    对我的问题无干扰。
      

  3.   

    GetDeviceCaps(Printer.Handle,LOGPIXELSX);获得水平方向每英寸多少个点
    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
    直接计算打印机可以尺寸的比例
      

  4.   

    我的
    Printer.PageWidth = 9900
    Printer.PageHeight = 14014
    这个尺寸包括边距吗?显示器 1440*900的分辨率,抓出来的图就是这么大的。   
      

  5.   

    难道只能用print方式打印界面嘛
      

  6.   

    你按这个尺寸打印看看,怎样  
    Canvas.StretchDraw(Rect(0,571,14014,8759),B);
      

  7.   

    还是不行只要是抓图的时候抓全屏,用Printer打印就不行。
    抓完图保存,然后Load出来再Printer打印,就可以这是什么毛病。。
      

  8.   

    不知道代码只要是抓图的时候抓全屏,用Printer打印就不行。
    打印时什么样子
      

  9.   

    我也试了下 也是不行不知道怎么回事
    不过是可以试试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不能直接打印确实很费解啊
      

  10.   


    一直报函数找不到现在总算编译通过了,后面可以开始研究emule了
      

  11.   

    看看是不是用到内存DC了,
    显示的时候可以用内存DC,但是打印机没有内存DC,如果用到的话就有问题了。
      

  12.   

    你查一下TForm的print方法,是如何实现,就一切都明白了。
      

  13.   


    print方法我已经实现了,现在要的是Printer的全屏抓屏打印
      

  14.   


    嗯,这个办法我试过了,可行。就是觉得这样多了一道手脚,麻烦了点,就想直接用Printer来完成打印,可是老是不行……没想明白怎么回事~
      

  15.   

    这两天也查了资料还是不知道为啥不能直接打印,很奇怪
    这个方法也可以吧 先保存到Stream里 然后再加载打印
      

  16.   

    henhao!!!!谢谢了!!!!