Hallo Oki,
ich habe jetzt wieder mal mit dem Code etwas experimentiert und versucht...
Das Gute ist, dass der Border nun auch gezeichnet wird. Was allerdings nicht funktioniert und das verstehe ich leider nicht ganz, ist , dass der Gradient nicht mehr gezeichnet wird und auch das Bild nicht mehr gezeichnet wird. Dies passiert nur, wenn ich die Variante mit den abgerundeten Ecken wähle.
Folgender Code wird in dem Falle ausgeführt, wobei die Reihenfolge die gleiche ist und myRect des Canvas durch R aus deinem Code ersetzt wurde.
Delphi-Quellcode:
if CornerUse
and (CornerWidth > 0)
then begin
R := GetClientRect;
FullRgn := CreateRectRgn(0, 0, Width, Height);
CombineRgn( FullRgn, FullRgn, FullRgn, RGN_DIFF );
// alle sichtbaren Bereiche einblenden
Region := CreateRoundRectRgn(0, 0, R.Right, R.Bottom, FCornerWidth, FCornerWidth);
CombineRgn( FullRgn, FullRgn, Region, RGN_OR );
DeleteObject(Region);
// alles Kombiniert und fertig
SetWindowRgn(
Handle, FullRgn, TRUE);
R := GetClientRect;
//jetzt bitte Gradient zeichnen
if PaintGradient
then
DrawGradient(Canvas, BgColorFrom, BgColorTo, R, GradientDirection);
//wenn bild vorhanden bild zeichnen
if Picture <>
nil then
if PictureStretched
then
Canvas.StretchDraw(R,Picture.Graphic)
else
Canvas.Draw(0,0,Picture.Graphic);
//bitte den border zeichnen
if BorderWidth > 1
then
Canvas.RoundRect(0 + (BorderWidth
div 2), 0 + (BorderWidth
div 2), width - (BorderWidth
div 2),height - (BorderWidth
div 2),FCornerWidth,FCornerWidth)
else
Canvas.RoundRect(0, 0, width-1, height-1,FCornerWidth,FCornerWidth);
//und zum schluss noch den text drauf
if FText <> '
'
then
DrawText(Canvas.Handle, PChar(FText), -1, TextRect, myAlignment);
end else DoVisible;
Der Border, wenn auch etwas unsauber ist mit abgerundeten Ecken zu sehen. Der Text ist auch auf dem Control. Es fehlen der Gradient, respektive das Bild. Ist kann ja immer nur eines von beiden zu sehen sein. Es wird aber komischerweise, wenn der Gradient auf True steht nur komplett mit schwarz oder der Farbe aus BGColorTo gefüllt und richtigerweise, wenn PaintGradient auf false steht, mit BgColorFrom gefüllt. Das heisst, dass der Gradient nicht korrekt ausgeführt wird. Ich habe, nur um sicher zu gehen, nochmals R := GetClientRect; ausgeführt, was aber nichts brachte.
Ich vermute mal, dass der Canvas sich irgendwie verändert hat, nach der Modifikation, was zur Folge hat, dass man nicht mehr so einfach ohne weiteres wie vorher drauf rummalen kann. Muss ich hierbei wieder etwas besonderes beachten?
Interessant ist auch, dass der Border bei den abgerundeten Ecken links und rechts oben "ausgefranst" aussieht, wenn ich PaintGradient auf false stehen habe.
Ansonsten bin ich einigermaßen zufrieden und werde hier noch versuchen das Beste rauszuholen...Ein Bild hängt an...