我写了一个函数,但实际打印输出时与所想实现的相差甚远,大家多多帮忙哦!Function MMToPixel(MM: Integer): Integer;
var
  p: TPoint;
begin
  SetMapMode(printer.Handle, MM_HIMETRIC);
  p := Point(MM * 100, 100);
  LPToDP(printer.Handle, p, 1);
  Result := p.X;
  SetMapMode(printer.Handle, MM_TEXT);
end;

解决方案 »

  1.   

    这要看设定的分辨率的多少的,72dpi和300dpi就不同
    根据你要打印的图的实际尺寸和打印分辨率来设置,没有标准。
      

  2.   

    要看分辨率,1000dpi的1cm见方打印出来和10dpi的1cm见方打印出来是一样大小的,都是1cmX1cm,但是他们所包含的像素就大不相同,相差了几个数量级。
    dpi的意思是,dot per inch,就是每英寸多少点(点就是像素了)。所以72dpi指的是一英寸距离,包含72像素;300dpi指的是一英寸距离,包含300像素。
    你要看分辨率,才能将像素和实际尺寸对应起来的。
      

  3.   

    如何将毫米(MM)单位转换为像素(Pixel)单位,请大家帮帮忙呀! ......
    1英寸=2.54厘米=25.4毫米
    这还与你的分辨率有关系 :
    800*600,表示水平方向有800个象素每英寸,
    竖直方向有600个象素每英寸。
    2.54厘米=800个象素,水平。所以你只要知道1英寸有多少像素,就知道毫米和像素的转换关系!
      

  4.   

    楼上800*600通学用于显示器,打印机只用dpi表示
      

  5.   

    ghyghost(爱国人士--N年后,是否还残存一条▼~~~~) :能不能给个示例
      

  6.   

    screen.PixelsPerInch 就是每英寸的象素数量
    所以每毫米的象素数量就是 Screen.PixelsPerInch*25.4了
      

  7.   


     用   pixelx:=GetDeviceCaps(Printer.Handle, LOGPIXELSX);取得默认打印机的水平1英寸包含的像素点数,再根据:1英寸=2.54厘米=25.4毫米,可得出像素值,如下
       pixel_value:=trunc(MM/25.4*pixelx); 根据理论计算应该是这样的,不管换不换打印机,打印位置应该都是一样的,但是我试过好多遍了就是不行,是不是我那里写错了?
      

  8.   

    Eastunfail(龍子龍孫)    (家里停宽带了) :我要的是打印机每英寸的像素量
      

  9.   

    trunc(MM/25.4*pixelx);这个计算公式成立吗?
      

  10.   

    MM转换成象素是固定的,也就是1MM=3.2Pixel这个有点误差,打印出来大概十米相差2MM左右但如果是自己写打印函数的话,比较麻烦,要计算打印机的分辨率,如果只是在屏幕上显示,然后用WINDOWS的标准打印程序,就可以采用上面的公式来计算!
      

  11.   

    YFLK(远方来客) :
    你能给个例子吗?
      

  12.   

    xpcm := getdevicecaps(PRINTER.HANDLE,LOGPIXELSX)/2.54;
    ypcm := getdevicecaps(PRINTER.HANDLE,LOGPIXELSY)/2.54;
    printer.BeginDoc;
    printer.Canvas.TextOut(3.1*xpcm,5.3ypcm,'Text');   //左3.1厘米,上5.3厘米处打印'Text'
    printer.EndDoc();
      

  13.   

    ultima_thule(ultima_thule) :
    你好,谢谢你的回复,这样处理的话,如果遇到折行打印的话该如何处理呢?
      

  14.   

    可以先把内容放到TMEMO中,让TMEMO帮你分行,然后把TMEMO中的内容按行打印出!
      

  15.   

    function mm2pixX(X: Extended): integer;
    begin
      //横向mm转换为像素点
      Result := Trunc(X/25.38*GetDeviceCaps(Printer.Handle, LOGPIXELSY)+0.5);
    end;function mm2pixY(Y: Extended): integer;
    begin
      //纵向mm转换为像素点
      Result := Trunc(Y/25.38*GetDeviceCaps(Printer.Handle, LOGPIXELSX)+0.5);
    end;
      

  16.   

    还有一个变态的现象,就是winxp下保存的图元文件总归相差一点
      

  17.   

    ultima_thule(ultima_thule:
     你好,用MEMO分行确实不错,还是存在一个问题,那就是每行的位置并不相同!左边距有大有小!