2012-07-14 51 views
0

我有画布DrawText的问题,我刚刚从文字我想显示第4个字符。为什么DrawText只打印我的字符串的前四个字符?

作为例子我有文字'离线'它会显示'offl'。

这段代码有什么问题。

代码

procedure TStatusCombo.Paint ; 
var DrawRect : TRect ; 
    StatusColor : TColor ; 
    iTextWidth : Integer ; 
    r : TRect ; 
begin 
DrawRect := ClientRect ; 

//colors 
Canvas.Brush.Style := bsClear ; //transparent background 
Canvas.Brush.Color := Tcolor($4D4D4D) ; 
Canvas.Pen.Color := Tcolor($4D4D4D) ; 

Canvas.RoundRect(DrawRect.Left , DrawRect.Top , 
      DrawRect.Right , DrawRect.Bottom , 15, 15); 

//Drawing 
//SetRect(DrawRect, DrawRect.Left+3, DrawRect.Top+3, DrawRect.Right-3, DrawRect.Bottom-3); 

case ChatStatus of 
    sNormal: StatusColor := TColor($00FF78) ; 
    sOnline: StatusColor := TColor($00FF78) ; 
    sBusy: StatusColor := TColor($00FF78) ; 
    sAway: StatusColor := TColor($00FF78) ; 
    sOffline:StatusColor := TColor($00FF78) ; 
end; 
Canvas.Brush.Color := StatusColor ; 

Canvas.RoundRect(DrawRect.Right - 20 , DrawRect.Top +4 , 
      DrawRect.Right -10 , DrawRect.Bottom -4 , 5, 5); 


FCaption := FStatusText[ChatStatus]; 
Canvas.Brush.Style := bsClear ; 
Canvas.Font.Color := clWhite ; 


DrawText(Canvas.Handle,pchar(FCaption) ,sizeof(FCaption),DrawRect ,DT_VCENTER or DT_CENTER or DT_SINGLELINE); 




end; 

回答

7

你必须使用Length(FCaption)而不是SizeOf(FCaption)

的确,Length(FCaption)是字符串的长度FCaption,而SizeOf(FCaption)是变量FCaption的大小。由于FCaption是一个字符串,它(技术上)是一个指向实际字符的指针,并且指针长度为四个字节(在32位应用程序中)。因此,你只有前四个字符。

+0

谢谢安德烈亚斯,它的工作完美了。 – Realbitt 2012-07-14 10:58:50

+2

最简单的就是传递-1而不是Length() – 2012-07-14 12:43:50