Dann versuch mal über eine Maske (gebastelt mit TextOut), eine Farbsource(die so gross ist, wie die Maske) und anschliessend das ganze via MaskBlt auf das Zielcanvas zu übertragen. Evtl. musst du noch den Platzbedarf berechnen um Maske und Farbsource zu kalkulieren.
PS: Wenn du dann viel Langeweile hast, kannst du's ja in eine eigene Label-Komponente kapseln
EDIT: mal ganz grob:
Delphi-Quellcode:
procedure cnvDrawColoredText(Text: string; Canvas: TCanvas; X,Y: Integer);
var
Mask, cSrc: TBitmap;
Size: TSize;
i: Integer;
begin
// Groesse berechnen
Size := Canvas.TextExtent(Text);
// Buffer vorbereiten
Mask := TBitmap.Create; Mask.Width := Size.cx; Mask.Height := Size.cy;
cSrc := TBitMap.Create; cSrc.Width := Size.cx; cSrc.Height := Size.cy;
{ :
:
// cSrc wie gewünscht colorieren
:
: }
// Maske schwarz faerben
Mask.Canvas.Pen.Color := clBlack;
Mask.Canvas.Brush.Color := clBlack;
Mask.Canvas.Rectangle(0,0,Size.cx,Size.cy);
// Text in Weiss schreiben
Mask.Canvas.Font.Color := clWhite;
Mask.Canvas.TextOut(0,0,Text);
// Maske Schwarz/Weiss machen
Mask.Monochrome := True;
Mask.PixelFormat := pf1bit;
// Kopieren
// Wichtig! MUSS 2 mal durchlaufen
for i:= 0 to 1 do MaskBlt(
Canvas.Handle, X, Y,
Size.cx, Size.cy,
cSrc.Canvas.Handle, 0, 0,
Mask.Handle, 0, 0,
MakeROP4(SRCCOPY,DSTINVERT)
);
Mask.Free;
cSrc.Free;
end;
Hab nochmal drübergeschaut... Müsste jetzt funzen