nHorRes:=GetDeviceCaps(Printer.Handle, HORZRES);是A4纸的像素宽度,
选择了字体:
printer.Canvas.Font.Name:='Ms Sans Serif';
printer.Canvas.Font.size:=12;
得到当前字体下字符的宽度:
nCharWidth:=printer.Canvas.TextWidth('A');
得到每毫米的像素数:
PixPerMX  := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);
nCharWidth的单位是毫米吗?
因为nCharWidth*PixPerMX得到的是像素阿,
而帮助上说TextWidth返回的是像素阿,为什么还要乘每毫米的像素数?

解决方案 »

  1.   

    得到当前字体下字符的宽度:(就是字符的长度,即字符数)
    nCharWidth:=printer.Canvas.TextWidth('A');
    得到每毫米的像素数:(应该是每个字符的像素数才对)
    PixPerMX  := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);
      

  2.   

    nCharWidth的单位是什么呢?
    nCharWidth:=printer.Canvas.TextWidth('A');得到的是一个字符什么值?
    帮助上说是像素值,好像不对。PixPerMX  := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);
    得到的是什么呢?
      

  3.   

    得到当前字体下字符的宽度:(就是字符对应WIDTH)
    nCharWidth:=printer.Canvas.TextWidth('A');
    得到每毫米的像素数:
    PixPerMX  := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);nCharWidth*PixPerMX 得到的是什么的像素?
      

  4.   

    nHorRes:=GetDeviceCaps(Printer.Handle, HORZRES);是A4纸的像素宽度,
    我想得到一个字符在当前字体下的像素数,
    用nHorRes除以一个字符在当前字体下的像素数,可以得到横向打印的字符最大个数,但
    nCharWidth:=printer.Canvas.TextWidth('A');得到的WIDTH是像素吗?
      

  5.   

    nCharWidth:=printer.Canvas.TextWidth('A'); 得到的WIDTH是像素
    nHorRes div nCharWidth 
    应该就是横向打印的最大字符数你试试对不对?
      

  6.   

    我试了,在不设字体的情况下,是对的,但是一旦设了字体,
    printer.Canvas.Font.Name:='Ms Sans Serif';
    printer.Canvas.Font.size:=8;nCharWidth:=printer.Canvas.TextWidth('A'); 得到的值小了许多,
    而不设字体时,默认的和上面的字体时一样的,不只为什么?
      

  7.   

    printer.Canvas.Font.Name:='Ms Sans Serif';
      printer.Canvas.Font.size:=12;
      printer.Refresh ;并且要把上面的语句放在取值之前。这回应该可以了。
      

  8.   

    哦。
    nCharWidth:=printer.Canvas.TextWidth('A'); 这个值还有问题?
      

  9.   

    对呀,如果不设字体,nCharWidth:=printer.Canvas.TextWidth('A'); 
    字体是'Ms Sans Serif'大小是8时,nCharWidth=34;
    如果自己设字体
    printer.Canvas.Font.Name:='Ms Sans Serif';
      printer.Canvas.Font.size:=8;
      printer.Refresh ;
    和默认的一样,nCharWidth=6;
    见鬼了
      

  10.   

    我把代码贴一下
    if PrintDialog.Execute then
    begin
         sum:=2;
    //     printer.Canvas.Font.Name:='Ms Sans Serif';
    //    printer.Canvas.Font.size:=8;     nHorRes:=GetDeviceCaps(Printer.Handle, HORZRES);
         nVerRes:=GetDeviceCaps(Printer.Handle, VERTRES);     nCharWidth:=printer.Canvas.TextWidth('X');
         nCharHeight:=printer.Canvas.TextHeight('X');
         lineint:= nHorRes div nCharWidth;
         printer.BeginDoc;
         for i:=0 to lineint do
         begin
              printer.Canvas.TextOut(sum,10,'a');
              sum:=sum+ nCharWidth;
         end;
         printer.EndDoc;
    end;
      

  11.   

    //     printer.Canvas.Font.Name:='Ms Sans Serif';
    //    printer.Canvas.Font.size:=8;
    但是去掉//的话,nCharWidth的值会变成6,小了很多PS:谢谢zfmich
      

  12.   

    打印机的象素点和屏幕的象素点是不同的。你那个得到的是打印机上输出时一个字符的象素点的宽度值而在打印机中要看它的打印精度,也就是每毫米能打印多少个象素。。也就是说的300dpi,600dpi什么的。
        然后两个相乘才是真正在这种字体字号下打印机在纸面上应该打印的象素值
      

  13.   

    是不是
    nCharWidth:=printer.Canvas.TextWidth('A');
    PixPerMX  := trunc(GetDeviceCaps(Printer.Handle, LOGPIXELSX)/25.4);nCharWidth*PixPerMX  
      

  14.   

    这样好象可以了,具体原因还有待于考证;  if PrintDialog.Execute then
      begin
        printer.BeginDoc;    printer.Canvas.Font.Name:='Ms Sans Serif';
        printer.Canvas.Font.size:=12;
        printer.Refresh ;    sum:=2;    nHorRes:=GetDeviceCaps(Printer.Handle, HORZRES);
        nVerRes:=GetDeviceCaps(Printer.Handle, VERTRES);    nCharWidth:=printer.Canvas.TextWidth('X');
        nCharHeight:=printer.Canvas.TextHeight('X');
        lineint:= nHorRes div nCharWidth;
        for i:=0 to lineint do
        begin
          printer.Canvas.TextOut(sum,10,'X');
          sum:=sum+ nCharWidth;
        end;
        printer.EndDoc;
      end;
      

  15.   

    多多多谢zfmich了,如果不把printer.BeginDoc;
    写在前面,就要选择映射模式
    SetMapMode(Printer.Handle,MM_LOENGLISH);
    效果是一样的;
    总之是多谢zfmich了,有什么要帮忙的给我发邮件吧?
    [email protected]