function TextWidth(Canvas: TCanvas; AText: WideString; Flags: Integer = 0): integer; var R: TRect; Size: TSize; AnsiText: string; begin R := Rect(0, 0, 0, 0);
if IsWinNT and false then begin Windows.DrawTextW(Canvas.Handle, PWideChar(AText), Length(AText), R, DT_CALCRECT or Flags); Result := R.Right; end else begin if Flags = 0 then begin GetTextExtentPoint32W(Canvas.Handle, PWideChar(AText), Length(AText), Size); Result := Size.cx; end else begin SetLength(AnsiText, Length(AText)); WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, PWideChar(AText), Length(AText), PChar(AnsiText), Length(AText), nil, nil); Windows.DrawText(Canvas.Handle, PChar(AnsiText), Length(AnsiText), R, DT_CALCRECT or Flags); Result := R.Right; end; end; end; 这段代码如何修改才能解决呢???? http://www.2ccc.com/idea/index.asp?articleid=94 的方法没看懂是怎么回事!
Windows.DrawText(Canvas.Handle, PChar(AnsiText), Length(AnsiText), R, DT_CALCRECT or Flags); Result := R.Right; end; -----------
by
----------- begin if IsWinNT then begin Windows.DrawTextW(Canvas.Handle, PWideChar(AText), Length(AText), R, DT_CALCRECT or Flags); Result := R.Right; end else begin SetLength(AnsiText, Length(AText)); WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, PWideChar(AText), Length(AText), PChar(AnsiText), Length(AText), nil, ni ); Windows.DrawText(Canvas.Handle, PChar(AnsiText), Length(AnsiText), R, DT_CALCRECT or Flags); Result := R.Right; end; end; -----------