知道实际打印出的字的高度,比如我要想使打印出来的字的高度为5mm,通过PRINTER画布打印,怎样计算PRINTER的FONT.SIZE的值呢。请高手帮忙,甚谢,分不够再加。我想给200分怎么不可以呀,只能输入100分

解决方案 »

  1.   


    Font.Size= -(5/25.4) * 72
      

  2.   

    楼上的说的公式好象不行吧,不能这样用吧!若这样的话,那实际打印出的字体就固定不变了,只要给出一个高度,FONT.SIZE就是固定的了,这样和打印机的分辨率就没关系了。而实际上应该和打印机的分辨率有关系的吧???谁能给出详细的解释吗
      

  3.   

    你参考一下:uses printers;Windows 下的打印分辨对打印程序有着至关重要的作用 ,如果你想知道 打印机的分辨率 ,请在程序中加入一行 :ShowMessage(' 水平分辨率 '+inttost
    r(GetDeviceCaps(printer.Handle,LOGPIXELSX))+chr(13)+' 垂直分辨率 :'
    +inttostr(GetDeviceCaps(printer.Handle,LOGPIXELSY))); 结果就一目了 
    然了。 如何在不同的打印分辨率下面打印? 下面给出一个函数 ,在调用这个函数之后 ,你就可以使用 Font.Size 来设置字体的大小而与打印机分辨率无关了。 
    注意必须在 Printer.BeginDoc 之后调用这个函数! 
    {-------------------------------------------------------------
    Sets the logical dots per inch for the printer and sets the printer axes to point RIGHT and DOWN.  Thus (0,0) is at the top left corner of the page. Returns the page size in logical coordinates.
    Note:  Must be called AFTER Printer.BeginDoc.
     --------------------------------------------------------------}
    function SetPrinterScale(dpi : integer) : TPoint;
    var
      DeviceDpiX, DeviceDpiY : integer;
    begin
      with Printer do begin
        SetMapMode(Handle, MM_ISOTROPIC);
        SetWindowExt(Handle, dpi, dpi);
        DeviceDpiX := GetDeviceCaps(Handle, LOGPIXELSX);
        DeviceDpiY := GetDeviceCaps(Handle, LOGPIXELSY);
        SetViewPortExt(Handle, DeviceDpiX, DeviceDpiY);
        Result := Point(PageWidth, PageHeight);
        with Canvas do begin
          DPtoLP(Handle, Result, 1); { This API call is required... }
          Font.PixelsPerInch := DPI; { ...to make this work.  (Who knows why?)         }
        end;
      end;
     end;
      

  4.   

    谢谢楼上的,能给出这个函数的详细解释吗,function SetPrinterScale(dpi : integer) : TPoint;
    其中的参数dpi指的什么意思呀。还有函数SetWindowExt,SetViewPortExt我只找到SetWindowExtEx,SetViewPortExtEx,是否有函数SetWindowExt,SetViewPortExt呢。请指点,谢谢!
      

  5.   

    用打印机的点数做度量单位
    如果想让打印程序在任何打印机上都能正常地打印,你就必须改变你的度量单位。如果采用固定的度量,不同分辨率的打印效果是不同的。举例来讲:printerCanvasrectangle(0,0,360,720)在360×360的佳能4200SP上能打出一个1英寸宽、2英寸高的矩形,但在600×600的惠普6L上只能打出06英寸宽、12英寸高的矩形。使用打印机的点数做为度量单位是一个明智的选择。具体做法如下:VarPointX,PointY:integer;PointX:=GetDeviceCaps(printerHandle,LOGPIXELSX);PointY:=GetDeviceCaps(printerHandle,LOGPIXELSX);printerCanvasrectangle(0,0,PointX*1,PointY*2)这样,无论你使用什么样的打印机,都能得到一个1英寸宽、2英寸高的矩形。打印机分辨率又称为输出分辨率,所指的是打印输出的分辨率极限,而打印机分辨率也决定了输出的质量。打印机分辨率越高,除了可以减少打印的锯齿边缘之外,在灰度的半色调表现上也会较为平滑。
    打印机的分辨率通常是以dpi(每英寸中所包含的点数)来表示。目前市场上的打印机当中,24针的针式打印机的分辨率约为180dpi;而喷墨式打印机的分辨率可达300,甚至720dpi,不过如果真要打印这么高的分辨率,所使用的也必须是特殊的纸张;所以喷墨式打印机比较适合于个人作彩色输出使用。
    除了喷墨打印机之外, 激光打印机的分辨率又要高一筹。较老的机型通常在300―360dpi之间,近来由于超微细碳粉技术的成熟,使得分辨率可以达到600甚至1200dpi,作为专业的排版输出这已经绰绰有余了。
        在专业输出上,也经常会使用到热升华彩色打印机作为输出设备,其分辨率的极限约为300点。1、获取打印机分辨率:
    dpi: Word; //全局变量dpi := GetDeviceCaps(Printer.Handle, LogPixelsX);
    //由于大多数情况下水平和垂直分辨率相同,故此处省略获取垂直分辨率的部分2、输出位置:
    OutX,OutY: Word; //全局变量, 以0.1毫米为单位
    Printer.Canvas.TextOut(MMToDot(OutX), MMToDot(OutY), '输出文本');function MMToDot(Value: Integer): Integer;
    var Tmp: Real;
    begin
      Tmp := Value / 254 * dpi;
      Result := Round(Tmp);
    end;
      

  6.   

    再给你一个解释吧:
    print.canvas.textout(x,y ,edit.text);中的x,y表示以点为单位的坐标。
    print.canvas.textout(100,500 ,edit.text);就表示在打印纸从左边算起100个点,
    顶部算起500个点的地方打印edit1.text内容。这里的点含义就是打印机分辨率DPI
    中的每英寸多少点的这个点。比如600DPI的分辨率就表示一英寸有600个点,那么上
    面那个打印命令就是在坐标为(1/6英寸,5/6英寸)的地方打印了edit1.text的内容。
    所以你只要先用尺精确量好你每行文字最左上角的坐标,然后将这个坐标换算成英
    寸值,然后在程序中动态取得打印机的分辨率,乘你获得的英寸坐标值,就得到实
    际打印的点位置,这样打出来的才是精确定位了,并且不会因为打印机不同而产生
    不同效果。
      ppix := GetDeviceCaps(DC, logPixelsX);
      ppiy := GetDeviceCaps(DC, logPixelsY);
    是分别取打印机横向与纵向分辨率的语句,注意打印机横向分辨率与纵向分辨率
    不同,所以X坐标与Y坐标要分别计算。
      

  7.   

    TO:消失在人海
    你说的打印机的关于分辨率的一些解释我知道,但是还没有回答到我问的问题的点子上。我的问题如题目,我只想知道如题中的FONT.SIZE的值,你能给出下面的函数的具体作用是什么吗,其中函数的参数DPI是什么意思,难道是打印机的分辨率吗,若是的话和函数中的DeviceDpiX或DeviceDpiY不就一样了吗,能给出具体解释吗:
    function SetPrinterScale(dpi : integer) : TPoint;
    var
      DeviceDpiX, DeviceDpiY : integer;
    begin
      with Printer do begin
        SetMapMode(Handle, MM_ISOTROPIC);
        SetWindowExt(Handle, dpi, dpi);
        DeviceDpiX := GetDeviceCaps(Handle, LOGPIXELSX);
        DeviceDpiY := GetDeviceCaps(Handle, LOGPIXELSY);
     ...    end;
      end;
     end;
    请继续讨论............
      

  8.   

    pazee(耙子)(灵感点亮生活) ( ) 信誉:137  2004-10-30 21:03:00  得分: 0  
       
    Font.Size= -(5/25.4) * 72
      
    这个方法不行吗?
    楼主没理解 耙子 的意思,他那个72指的是该设备的DPI,屏幕就是72。换上你打印机的DPI就好了,25.4是每英寸对应的毫米数。
      

  9.   

    72 不是设备的DPI,这个数值是一个磅值,多用在印刷业。这个公式是与设备无关的。
    Font有两个描述字体大小的公式,height和size,height通常可以理解为字体像素高度。
    size则是一个印刷业相关的参数。实际上我的公式这么得到的。
    假定设备的分辨率: X dpi.Height = - (5/25.4)* X; // 这个好理解吧?高度转换为英寸再乘以每英寸像素数因为Size的公式为 size= (-height*72)/PixelsPerInch那么这个size 实际等于 (-(-(5/25.4)* X*72))/X = (5/25.4)*72注意到了吗?这个X 消掉了。
    如果你看过windows关于字体的部分资料就该知道这个size是与设备无关的,而height是与设备相关的。
      

  10.   

    楼上说的公式font.size= -font.height*72/PixelsPerInch我知道,这样算出来是固定不变的是与设备无关。但好象求FONT.SIZE不能用它吧,应该与打印机的分辨率有关。继续讨论,郁闷中。
      

  11.   

    好贴,收藏!!!!!!!!!!!!!!! pazee(耙子)(灵感点亮生活)  兄弟,在MSN里加我好吗!!交流交流.....
    msn:[email protected]