2012-04-10 6 views
3

Ich habe Probleme mit falsch bemalten Ecken beim Zeichnen von VCL-Stil Fensterelemente. Bei Stilen, die abgerundete Ecken haben, bekomme ich einen weißen Hintergrund in dem Raum zwischen dem Begrenzungsrechteck des Steuerelements und der abgerundeten Fensterecke des Stils.Delphi XE2 Stile Malerei

enter image description here

Das war die obere Bild unter Verwendung von Aqua Light Slate laufen, aber jeder Stil mit abgerundeten Ecken wird das gleiche Problem zeigen. Was vermisse ich?

type 
    TSample = class(TCustomControl) 
    protected 
    procedure Paint; override; 
    end; 

{ TForm1 } 
procedure TForm1.FormCreate(Sender: TObject); 
var 
    R: TRect; 
    S: TSample; 
begin 
    R := ClientRect; 
    InflateRect(R, -20, -20); 
    S := TSample.Create(Application); 
    S.Parent := Self; 
    S.BoundsRect := R; 
end; 

{ TSample } 
procedure TSample.Paint; 
var 
    Details: TThemedElementDetails; 
begin 
    Details := StyleServices.GetElementDetails(twCaptionActive); 
    StyleServices.DrawParentBackground(Self.Handle, Canvas.Handle, Details, False); 
    StyleServices.DrawElement(Canvas.Handle, Details, ClientRect); 
end; 
+0

btw, ich habe auch versucht, Parent: = True, keine Änderung. Habe auch versucht sicherzustellen, dass csOpaque entfernt wird. –

+0

Haben Sie versucht, die 'StyleServices.DrawElement'-Methode zu debuggen, um zu sehen, wie sie die Bitmap in der Zeichenfläche zeichnet? – RRUZ

+0

Ehrlich gesagt hatte ich gehofft zu vermeiden, in die Interna der Themen-Engine einzutauchen, aber wenn niemand bessere Ideen hat, dann muss ich das tun. –

Antwort

4

Ok, verbringe ich einige Minuten in Ihnen hinterfragen und ich die Antwort gefunden. Um die abgerundeten Ecken zu zeichnen, rufen Sie die Funktion StyleServices.GetElementRegion auf, um die Region abzurufen, und wenden Sie dann die SetWindowRgn-Funktion an, um die Region auf das Steuerelement anzuwenden.

Kontrolle dieser Probe

procedure TSample.Paint; 
var 
    Details : TThemedElementDetails; 
    Region : HRgn; 
    LRect : TRect; 
begin 
    Details := StyleServices.GetElementDetails(twCaptionActive); 
    LRect := Rect(0, 0, Width, Height); 
    StyleServices.GetElementRegion(Details, LRect, Region); 
    SetWindowRgn(Handle, Region, True); 
    StyleServices.DrawParentBackground(Self.Handle, Canvas.Handle, Details, False); 
    StyleServices.DrawElement(Canvas.Handle, Details, ClientRect); 
end; 

Und das Ergebnis ist

enter image description here

+0

Das funktioniert absolut, vielen Dank für die Hilfe! Dies funktioniert auch mit der Verwendung einer Offscreen-Bitmap für den Beschriftungsbereich. Für jeden, der etwas Ähnliches tut, ist es wichtig darauf hinzuweisen, dass der gesamte Client Rect an GetElementRegion übergeben werden muss. –