Delphi XE2 styles painting
delphi, delphi-xe2, vcl-styles
Solution
Ok, I spend some minutes in you question and I found the answer. The key to draw the rounded corners, is call the `StyleServices.GetElementRegion` function to get the region and then use the `SetWindowRgn` function to apply the region to the control.
check this sample
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;
And this is the result
Problem
I am having trouble with incorrectly painted corners when drawing VCL-styled window elements. On styles that have rounded corners, I get a white background in the space between the control's bounding rect and the style's rounded window corner. The above image was run using Aqua Light Slate, but any style with rounded corners will show this same problem. What am I missing? ``` 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; ```