2012-04-10 40 views
3

VCLスタイルのウィンドウエレメントを描画するときに、正しくコーナーを描かないと困ります。コーナーが丸みを帯びたスタイルでは、コントロールの境界矩形とスタイルの丸みを帯びたウィンドウコーナーの間に白い背景があります。Delphi XE2スタイルの塗りつぶし

enter image description here

上記画像は、アクアライトスレートを使用して実行されましたが、角を丸くした任意のスタイルは、この同じ問題が表示されます。私は何が欠けていますか?

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を試してみました。 csOpaqueが削除されていることを確認してみてください。 –

+0

'StyleServices.DrawElement'メソッドをデバッグして、キャンバスにビットマップを描画する方法を試してみましたか? – RRUZ

+0

真剣に私はテーマエンジンの内部に飛び込むのを避けたいと考えていましたが、誰も良いアイデアを持っていなければ、それは私がしなければならないことです。 –

答えて

4

[OK]を、私はあなたに質問し、私は答えを見つけた。丸い角を描くためのキーは、StyleServices.GetElementRegion関数を呼び出して領域を取得し、SetWindowRgn関数を使用して領域をコントロールに適用します。 = Trueの場合、変更なし:

チェックこのサンプル

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

これは絶対に役立ちます、助けをありがとう!これは、キャプション領域にオフスクリーンビットマップを使用する場合にも機能します。同様のことをしている他の人にとっては、クライアントrect全体をGetElementRegionに渡す必要があることを指摘する価値があります。 –

関連する問題