我有一个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上绘制(有关详细信息,请参见图片)。不幸的是,我试图打败但不成功:
嗯,有没有办法改进这段代码?或者我应该用另一种方式来实现我的目标?
P.S。 抱歉我的英语不好;)
EDIT 更新源代码。
答案 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;