要求:
1,输出的文字在矩形中央,不能超过矩形区域.
2,输入的文字字体为宋体.应该是将矩形将最小边长,折算为正方形,在该正方形内输出文本吧.
因为汉字都是方块字.要输出多大的字体才合适呢?怎么进行精确计算.

解决方案 »

  1.   

    //先设置字体
    Canvas.Font.Name:= 'Arial';
    Canvas.Font.Size:= 10;TxtWidth := R.TextWidth('我'); //单个汉字的宽度
    TxtHeight:=R.TextHeight('我'); //单个汉字的高度//下面计算一个字符串所占的矩形区域
    R.Left := 0;
    R.Right:= Canvas.TextWidth('输出文字');
    R.Top   := 0;
    R.Bottom:= Canvas.TextHeight('输出文字');
      

  2.   

    谢谢,etomahawk,你说的不是我想要的答案.
    目前条件是已经矩形区域,再输出文字,也就是我的矩形区域大小已知,但是不知道输出多大的字体,输出的坐标.
    如何求呢?而不是根据文字的大小,来设置区域大小输出文本.
      

  3.   

    那就设置你要输出区域的canvas.font.Height为你要输出的字的TextWidth和TextHeight中的较小值即可。
    注意不要使用canvas.font.size属性,它不是以像素为单位的大小,而是字体“磅”值,是随显示模式的DPI值变化的。
      

  4.   

    你是要让汉字输出后刚好填满这个矩形区域吗?
    你要将汉字先输出到一个临时的canvas对象
    然后使用 Canvas.StretchDraw 对图像进行缩放,这是比较简单的处理方法,但显示可能不够美观。如果想显示美观的话,就需要手工创建Font对象:
    var
      LogFont: TLogFont;
      hOldFont, hNewFont: HFont;
    begin
      GetObject(Canvas.Font.Handle,SizeOf(LogFont),Addr(LogFont));
      LogFont.lfHeight := 30;
      LogFont.lfWidth := 20;
      hNewFont := CreateFontIndirect(LogFont);
      hOldFont := SelectObject(Canvas.Handle,hNewFont);
      Canvas.TextOut(20 , 20, 'This is a test string');
      hNewFont := SelectObject(Canvas.Handle,hOldFont);
      DeleteObject(hNewFont);
    end;
      

  5.   

    首先申明我不用Delphi,但这个问题如果是我来做,我会这样处理:
    (自然语言算法)1、递增循环字体大小,并将字体写出成图形。
    2、用图像处理算法计算当前字体大小数值下,字体实际所占的像素值、顶边位置、左边位置
    3、纪录步骤2的数据(或者是分析出字体大小与字体实际像素、顶边位置、左边位置之间的数学关系。)经过以上三部,形成成果。
    在使用过程中,遇到某未知矩形,就用成果查找到最合适的字体大小和写出坐标。若最合适的字体大小仍不能填满矩形,则对字体图像进行适当的缩放,这样字体填充的效果和效率都是比较合适的。
      

  6.   


    如果矩形长度是像素的话,
    基本上fontsize= 矩形宽度;
    如果矩形是英寸的话:
    fontsize=矩形 Width *输出设备的分辨率(每英寸像素数)
    getdevicecaps :取得设备分辨率。lz是要这个?