2012-04-10 3 views
3

У меня возникают проблемы с неправильно окрашенными углами при рисовании оконных элементов в стиле VCL. В стилях, которые имеют закругленные углы, я получаю белый фон в пространстве между ограничивающим прямоугольником элемента управления и закругленным окном окна стиля.Стиль Delphi XE2 живопись

enter image description here

изображение было запустить с помощью аква Light Slate, но в любом стиле с закругленными углами покажет такую ​​же проблему. Что мне не хватает?

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

Кстати, я также попытался ParentBackground: = True, никаких изменений. Попробовали также убедиться, что csOpaque удален. –

+0

Вы пытались отладить метод 'StyleServices.DrawElement', чтобы увидеть, как он рисует растровое изображение в холсте? – RRUZ

+0

Честно говоря, я надеялся избежать погружения в внутренние части движка темы, но если у кого-то нет лучших идей, это то, что мне нужно сделать. –

ответ

4

Хорошо, я провожу несколько минут в вашем вопросе, и я нашел ответ. Ключ для рисования закругленных углов вызывает функцию StyleServices.GetElementRegion, чтобы получить область, а затем использовать функцию SetWindowRgn, чтобы применить область к элементу управления.

проверить этот образец

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; 

И это результат

enter image description here

+0

Это абсолютно работает, спасибо за помощь! Это также работает с использованием экранного растрового изображения для области заголовка. Для всех, кто делает что-то подобное, стоит указать, что весь клиентский адрес нужно передать GetElementRegion. –