在图形上先输出文字,再打印,这种打印结果很不理想,字体模糊难以分辨;---直接看图片也是一样,更不用说打印了.所以只好在Printer上直接输出,问题来了,在Printer.EndDoc前;我想得到我在Printer.Canvas上绘画的东西如何做????代码如下:tmpbmp为位图对象; tmpbmp.Width:=864;
 tmpbmp.Height:=1296;  //BitBlt(tmpbmp.Canvas.Handle, 0, tmpbmp.Height, Printer.PageWidth ,Printer.PageHeight ,Printer.Canvas.Handle, 0, 0, SRCCOPY);
  //StretchBlt(tmpbmp.Canvas.Handle,0,0,tmpbmp.Width,tmpbmp.Height,Printer.Canvas.Handle,0,0,Printer.PageWidth,Printer.PageHeight,SRCCOPY);
  tmpbmp.Canvas.CopyRect(Rect(0,0,tmpbmp.Width,tmpbmp.Height),Printer.Canvas,Rect(0,0,Printer.PageWidth,Printer.PageHeight));
tmpbmp.SaveToFile('d:\testbmp.bmp');tmpbmp得到的只是空白

解决方案 »

  1.   

    这实际上是打印预览。通用做法是在printer.canvas是怎么输出,就在另一个窗口的Canvas上怎么输出,把两者的参数包括字体设置一样就可以了。(注意 :普通窗口Canvas默认使用Screen字体,而Printer.Canvas用的是打印字体,两者不一样(即使字体名称一样)。)
      

  2.   

    对于打印机的Canvas,使用StretchBlt或者BitBlt会有问题,但是根据测试,同一个函数调用2次,好像就可以了。还有,楼主给出的调用StretchBlt以及BitBlt的代码,和你最初的问题,好像没有任何关系啊。在打印机上输出图形以及文字时,先输出图形到打印机,然后再根据打印机的分辨率,自动调整输出的字体大小,然后在打印机上输出文字。
      

  3.   

    prt->BeginDoc();
    int OldMode=SetMapMode(prt->Handle,MM_ISOTROPIC);
    SetWindowExtEx(prt->Handle,Screen->Width ,Screen->Height ,0);
    SetViewportExtEx(prt->Handle,
            Screen->Width*GetDeviceCaps(prt->Handle,LOGPIXELSX)/Screen->PixelsPerInch,
            Screen->Height*GetDeviceCaps(prt->Handle,LOGPIXELSY)/Screen->PixelsPerInch,0);.......
    .......prt->EndDoc();
    SetMapMode(prt->Handle,OldMode);