0

Canvas DrawTextに問題があります。表示したいテキストから、最初の4文字だけを取得しました。

例として、「offline」というテキストがあり、「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;
4

1 に答える 1

7

Length(FCaption)の代わりに使用する必要がありSizeOf(FCaption)ます。

実際、Length(FCaption)は文字列の長さであり、FCaptionSizeOf(FCaption)変数のサイズですFCaption。は文字列であるためFCaption、(技術的には)(実際の文字への)ポインタであり、ポインタの長さは4バイトです(32ビットアプリケーションの場合)。したがって、最初の4文字しか取得できません。

于 2012-07-14T10:32:10.507 に答える