// Text mit Formattierungen in den DC zeichnen und Rect berechnen
function TMyClass.DrawTextDC(aDC : HDC; aDCSize : TPoint;
const S : UnicodeString; Position : TextPosition) : Boolean;
var
DrawRes : integer;
tmpRect : TRect;
ShiftX, ShiftY : integer;
DrawTextFlags : UINT;
begin
tmpRect.Top := 1;
tmpRect.Left := 1;
tmpRect.Bottom := aDCSize.Y;
// fDstSize.Bottom;
tmpRect.Right := aDCSize.X;
// fDstSize.Right;
DrawTextFlags := DT_WORDBREAK
OR DT_EXPANDTABS
OR DT_TABSTOP
OR DT_WORD_ELLIPSIS;
case Position
of
tpNone, tpBelow, tpTopLeft,
tpBotLeft: DrawTextFlags := DrawTextFlags
OR DT_LEFT;
tpTopRight,
tpBotRight: DrawTextFlags := DrawTextFlags
OR DT_RIGHT;
tpCenter : DrawTextFlags := DrawTextFlags
OR DT_CENTER;
end;
test := SelectObject(aDC, FTextFont.Handle);
// Erst mal die Größe berechnen:
DrawTextExW(aDC,PWideChar(S),Length(S),tmpRect, DrawTextFlags
or DT_CALCRECT, @FTextParams.DrawTextParams);
// Jetzt verschieben:
ShiftX := 0; ShiftY := 0;
case Position
of
tpCenter :
begin
ShiftX := (aDCSize.X - tmpRect.Right)
div 2;
ShiftY := (aDCSize.Y - tmpRect.Bottom)
div 2;
end;
tpBelow, tpBotLeft : ShiftY := aDCSize.Y - tmpRect.Bottom;
tpBotRight:
begin
ShiftX := aDCSize.X - tmpRect.Right - 1;
ShiftY := aDCSize.Y - tmpRect.Bottom;
end;
tpTopRight: ShiftX := aDCSize.X - tmpRect.Right - 1;
end;
OffsetRect(tmpRect, ShiftX, ShiftY);
// Für die Links alignten Versionen das Rechteck nach rechts vergrößern: (XP Bug)
case Position
of
tpNone, tpBelow, tpTopLeft,
tpBotLeft : tmpRect.Right := aDCSize.X - 1;
end;
// Berechnetes Rect erst mal für außen speichern
if FTextParams.Transparent
then
begin
SetBkMode (aDC, TRANSPARENT);
SetBkColor(aDC, FKeyColor);
// Den Schatten zeichnen
SetTextColor(aDC,FTextParams.BkgColor);
DrawTextExW(aDC,PWideChar(S),Length(S),tmpRect, DrawTextFlags, @FTextParams.DrawTextParams);
end else
begin
SetBkMode (aDC, OPAQUE);
SetBkColor(aDC, FTextParams.BkgColor);
end;
// Vordergrund zeichnen
SetTextColor(aDC,FTextParams.Color);
// Rect verschieben:
OffsetRect(tmpRect, -1, -1);
DrawRes := DrawTextExW(aDC, PWideChar(S), Length(S), tmpRect, DrawTextFlags, @FTextParams.DrawTextParams);
Result := (DrawRes = 0);
end;