3

VCL スタイルのウィンドウ要素を描画するときに、角が正しく描画されないという問題があります。角が丸いスタイルでは、コントロールの境界四角形とスタイルの丸みを帯びたウィンドウ コーナーの間のスペースに白い背景が表示されます。

ここに画像の説明を入力

上の画像は Aqua 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;
4

1 に答える 1

5

わかりました、私はあなたの質問に数分費やし、答えを見つけました. 丸みを帯びた角を描画するための鍵は、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;

そして、これが結果です

ここに画像の説明を入力

于 2012-04-12T03:25:11.393 に答える