我做了一个可以打印和预览的activex控件,可是通过printer的canvas在A4纸上打印出来的内容和在image的canvas上画出来的预览内容如何显示比例正确
比如我要在纸上某个位置(50,50)打印一行字,在image预览的时候也保持相应的位置(image控件是在activeform上的),但是它的位置应该不是(50,50)了吧?那应该是什么呢?存在怎样的比例关系呢?

解决方案 »

  1.   

    printer的canvas的像素数与打印机分辨率有关比如:1440dpi代表每英寸1440个像素,屏幕一般是96
      

  2.   

    创建一个和打印机设置大小相同的bitmap,然后直接画在bitmap上,最后缩小显示这个bitmap
      

  3.   

    我把程序贴出来,大家可以看得清楚一些首先是在特定位置打印文字的程序,参数X,Y是输入的坐标值,Txt是文字内容:
    procedure PrintText(X, Y: Extended; Txt: string; FontName: string; FontSize: Integer);
    var Px, Py: Integer;
    begin
        Px := Round(Round(X * HPointsPerInch * 10000 / 25.4) / 10000);
        Py := Round(Round(Y * VPointsPerInch * 10000 / 25.4) / 10000);
        Py := Py + (60-GetOffSetY);
        Printer.Canvas.Font.Name := FontName;
        Printer.Canvas.Font.Size := FontSize;
        Printer.Canvas.TextOut(Px, Py, Txt);
    end;其中的HPointsPerInch为水平方向每英寸打印机的点数,YPointsPerInch为纵向方向每英寸打印机的光栅数
    function VPointsPerInch: Integer;
    begin
        Result := GetDeviceCaps(Printer.Handle, LOGPIXELSY)
    end;function HPointsPerInch: Integer;
    begin
        Result := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
    end;我要问的就是预览的时候参数X,Y要做何比例处理,即下面程序中的问号处该如何写?谢谢procedure TPrtActiveX.PrintTextPre(X, Y: Extended; Txt: string; FontName: string; FontSize: Integer);
    var Px, Py: Integer;
    begin
        Px:=????????
        Py:=????????    Image1.Canvas.Font.Name := FontName;
        Image1.Canvas.Font.Size := FontSize;
        Image1.Canvas.TextOut(Px, Py, Txt);
    end;
      

  4.   

    试试这个
    Px:=round(X * (1 / 25.4) * 100 );
    Py:=round(Y * (1 / 25.4) * 100 );