一起绘制字形和WordWrap文本

时间:2015-11-19 14:22:56

标签: delphi

我有一个Canvas,Glyph,Text和变量Space作为整数。我想根据TRadioGroup的ItemIndex将Glyph和Text绘制到Canvas中(例如,如果ItemIndex = 1则在Text等的左侧绘制Glyph等) 在任何情况下,必须插入空格作为字形和文本之间的空格。 Glyph和Text都必须以Canvas为中心,即使Canvas的宽度小于Glyph的宽度+ Text的宽度。

我正在尝试执行此任务,但我对某些计算感到困惑。 在下面附上我的代码:

procedure TForm1.Button1Click(Sender: TObject);
var
  R1, R2: TRect;
  S: String;
  G, D: Integer;
  B, C: TBitmap;   
begin
  S := 'This is an example text to show how WordWrap works';
  B := TBitmap.Create;
  B.LoadFromFile('C:\g.bmp');

  C := TBitmap.Create;
  C.Width := 242;
  C.Height := 96;

  Form1.Repaint;
  Form1.Canvas.Brush.Color := clGreen;
  Form1.Canvas.FillRect(Rect(0, 0, TrackBar1.Position, C.Height));

  // left
  if RadioGroup1.ItemIndex = 0 then
    begin
      R1 := Rect(B.Width + TrackBar2.Position, 0, TrackBar1.Position, C.Height);
      Form1.Canvas.TextRect(R1, S, [tfWordBreak, tfNoClip, tfCenter, tfCalcRect]);

      Form1.Canvas.Brush.Color := clWebSkyBlue;
      R2 := Rect(B.Width + TrackBar2.Position, (C.Height - R1.Bottom) div 2, TrackBar1.Position, C.Height);
      Form1.Canvas.TextRect(R2, S, [tfWordBreak, tfNoClip, tfCenter]);

      Form1.Canvas.Draw((TrackBar1.Position - R1.Right - TrackBar2.Position) div 2, (C.Height - B.Height) div 2, B);
    end;

  //right
  if RadioGroup1.ItemIndex = 1 then
    begin
      R1 := Rect(B.Width + TrackBar2.Position, 0, TrackBar1.Position, C.Height);
      Form1.Canvas.TextRect(R1, S, [tfWordBreak, tfNoClip, tfCenter, tfCalcRect]);

      Form1.Canvas.Brush.Color := clWebSkyBlue;
      R2 := Rect(0, (C.Height - R1.Bottom) div 2, TrackBar1.Position - B.Width - TrackBar2.Position, C.Height);
      Form1.Canvas.TextRect(R2, S, [tfWordBreak, tfNoClip, tfCenter]);

      Form1.Canvas.Draw((TrackBar1.Position + R1.Right - (B.Width*2) + TrackBar2.Position) div 2, (C.Height - B.Height) div 2, B);
    end;

  //top
  if RadioGroup1.ItemIndex = 2 then
    begin
      R1 := Rect(0, B.Height + TrackBar2.Position, TrackBar1.Position, C.Height);
      Form1.Canvas.TextRect(R1, S, [tfWordBreak, tfNoClip, tfCenter, tfCalcRect]);

      G := B.Height + R1.Bottom - R1.Top;
      D := (C.Height - G) div 2;

      Form1.Canvas.Brush.Color := clWebSkyBlue;
      R2 := Rect(0, D + TrackBar2.Position, TrackBar1.Position, C.Height);
      Form1.Canvas.TextRect(R2, S, [tfWordBreak, tfNoClip, tfCenter]);

      Form1.Canvas.Draw((TrackBar1.Position - B.Width) div 2, D - TrackBar2.Position, B);
    end;

  //bottom
  if RadioGroup1.ItemIndex = 3 then
    begin
      R1 := Rect(0, B.Height + TrackBar2.Position, TrackBar1.Position, C.Height);
      Form1.Canvas.TextRect(R1, S, [tfWordBreak, tfNoClip, tfCenter, tfCalcRect]);

      G := B.Height + R1.Bottom - R1.Top;
      D := (C.Height + G) div 2;

      Form1.Canvas.Brush.Color := clWebSkyBlue;
      R2 := Rect(0, D - R1.Bottom - R1.Top + B.Height + TrackBar2.Position, TrackBar1.Position, C.Height);
      Form1.Canvas.TextRect(R2, S, [tfWordBreak, tfNoClip, tfCenter]);

      Form1.Canvas.Draw((TrackBar1.Position - B.Width) div 2, D + TrackBar2.Position, B);
    end;

  FreeAndNil(B);
end;

如何使用此代码: 将两个TrackBars放到Form上,并将其Max值设置为第一个242,第二个设置为10; 将TRadioGroup放入Form并在其Items属性中按下一个顺序设置4个项目:Left,Right,Top,Bottom。

因此,当选择“左”或“右”项时,代码正常工作(正确 - 正如我所料),但选择“上”或“下”项时,“字形”和“文本”绘画不正确。我的意思是,例如,我们选择项目' Top'然后单击Button1。我们看到了什么?对,Glyph在Text上绘制(有关详细信息,请参见图片)。不幸的是,我试图打败但不成功:

Top glyph's issue

嗯,有没有办法改进这段代码?或者我应该用另一种方式来实现我的目标?

P.S。 抱歉我的英语不好;)

EDIT 更新源代码。

1 个答案:

答案 0 :(得分:2)

您对顶部和底部的计算是错误的。 您可以直接在位图画布上绘制而不是使用表单画布。 这是固定版本:

  //top
  if RadioGroup1.ItemIndex = 2 then
    begin
      R1 := Rect(0, B.Height + TrackBar2.Position, TrackBar1.Position, C.Height);
      C.Canvas.TextRect(R1, S, [tfWordBreak, tfNoClip, tfCenter, tfCalcRect]);
      G := (C.Height div 2);
      // D is top for centered text rec + glyph size and spacing
      D := G + ((R1.Height + B.Height + Trackbar2.Position) div 2);
      C.Canvas.Brush.Color := clWebSkyBlue;
      R2 := Rect(0, D - R1.Height, TrackBar1.Position, D+R1.Height);
      C.Canvas.TextRect(R2, S, [tfWordBreak, tfNoClip, tfCenter]);
      C.Canvas.Draw((TrackBar1.Position - B.Width) div 2, R2.Top - B.Height - TrackBar2.Position, B);
    end;

  //bottom
  if RadioGroup1.ItemIndex = 3 then
    begin
      R1 := Rect(0, 0, TrackBar1.Position, C.Height);
      C.Canvas.TextRect(R1, S, [tfWordBreak, tfNoClip, tfCenter, tfCalcRect]);
      // G is absolute middle of draw canvas
      G := (C.Height div 2);
      // D is top for centered text rec + glyph size and spacing
      D := G - ((R1.Height + B.Height + Trackbar2.Position) div 2);
      C.Canvas.Brush.Color := clWebSkyBlue;
      R2 := Rect(0, D, TrackBar1.Position, D + R1.Height);
      C.Canvas.TextRect(R2, S, [tfWordBreak, tfNoClip, tfCenter]);
      C.Canvas.Draw((TrackBar1.Position - B.Width) div 2, R2.Bottom + TrackBar2.Position, B);
    end;