11

TFramewith TLMDShapeControl(丸い角の背景を描画するため)とコントロール(aまたはaなどTEditも使用可能)に基づいてコンポーネントを作成したいと思います。その後、「Add to Palette」コマンドを使用して、再利用可能なコンポーネントコントロールに変換します。TComboBoxTDBEdit

問題は、幅を柔軟にする必要があることです。そのために、ユーザーが丸みを帯びた角を見ることができるように、フレーム内のすべてを5ピクセルのマージンで回転させるというアイデアがありましalClientTEdit

Alignコンポーネントを重ねて使用したり設定したりできないので、ひどいものでした。これで、使用するたびにコンポーネントをコピーして貼り付ける必要があります。:-(((

私が正しいことを理解する唯一の方法は、TEditwithalClientと5pxのマージンのみを使用し、noを使用することですTShape。代わりにTFrame、透明度のある丸みを帯びた角にすることができるので、さまざまな色やで醜く見えませんTImages

しかし、どうすればそれを行うことができますか?

誰かがコードサンプルを持っていますか?

これが目標です:透明な丸い角

4

1 に答える 1

16

角の丸いフレームを作成する方法についての質問に答えるには、このような方法を試すことができますが、CreateRoundRectRgnここで使用されているのはアンチエイリアスがないため、結果に不満があります。

type
  TFrame1 = class(TFrame)
    Edit1: TEdit;
    Button1: TButton;
  protected
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
  end;

implementation

procedure TFrame1.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
  Region: HRGN;
begin
  inherited;
  Region := CreateRoundRectRgn(0, 0, ClientWidth, ClientHeight, 30, 30);
  SetWindowRgn(Handle, Region, True);
end;

アップデート:

GDIにはアークレンダリングのアンチエイリアスをサポートする関数がないため、GDI +を使用する丸い長方形(純粋に塗りつぶされた丸い長方形)の例をここに投稿しました(このためにはGDI +ラッパーが必要ですfrom here)。

次のプロパティは、その使用に重要です。

  • 色-シェイプの塗りつぶしの色です(ペンの色、グラデーションなどを強調できます)
  • 半径-丸みを帯びた角を描くために使用される円の半径(ピクセル単位)
  • AlphaValue-レンダリングされた丸い長方形の不透明度の値です(楽しみのために:-)

unit RoundShape;

interface

uses
  SysUtils, Classes, Controls, Graphics, GdiPlus;

type
  TCustomRoundShape = class(TGraphicControl)
  private
    FRadius: Integer;
    FAlphaValue: Integer;
    procedure SetRadius(Value: Integer);
    procedure SetAlphaValue(Value: Integer);
  protected
    procedure Paint; override;
    property Radius: Integer read FRadius write SetRadius default 10;
    property AlphaValue: Integer read FAlphaValue write SetAlphaValue default 255;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TRoundShape = class(TCustomRoundShape)
  public
    property Canvas;
  published
    property Align;
    property AlphaValue;
    property Anchors;
    property Color;
    property Constraints;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Font;
    property ParentColor;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property Radius;
    property ShowHint;
    property Visible;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnMouseActivate;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
  end;

procedure Register;

implementation

{ TCustomRoundShape }

constructor TCustomRoundShape.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width := 213;
  Height := 104;
  FRadius := 10;
  FAlphaValue := 255;
end;

procedure TCustomRoundShape.SetRadius(Value: Integer);
begin
  if FRadius <> Value then
  begin
    FRadius := Value;
    Invalidate;
  end;
end;

procedure TCustomRoundShape.SetAlphaValue(Value: Integer);
begin
  if FAlphaValue <> Value then
  begin
    FAlphaValue := Value;
    Invalidate;
  end;
end;

procedure TCustomRoundShape.Paint;
var
  GPPen: TGPPen;
  GPColor: TGPColor;
  GPGraphics: IGPGraphics;
  GPSolidBrush: IGPSolidBrush;
  GPGraphicsPath: IGPGraphicsPath;
begin
  GPGraphicsPath := TGPGraphicsPath.Create;
  GPGraphicsPath.Reset;
  GPGraphicsPath.AddArc(0, 0, FRadius, FRadius, 180, 90);
  GPGraphicsPath.AddArc(ClientWidth - FRadius - 1, 0, FRadius, FRadius, 270, 90);
  GPGraphicsPath.AddArc(ClientWidth - FRadius - 1, ClientHeight - FRadius - 1,
    FRadius, FRadius, 0, 90);
  GPGraphicsPath.AddArc(0, ClientHeight - FRadius - 1, FRadius, FRadius, 90, 90);
  GPGraphicsPath.CloseFigure;

  GPColor.InitializeFromColorRef(ColorToRGB(Color));
  GPColor.Alpha := FAlphaValue;
  GPPen := TGPPen.Create(GPColor);
  GPSolidBrush := TGPSolidBrush.Create(GPColor);

  GPGraphics := TGPGraphics.Create(Canvas.Handle);
  GPGraphics.SmoothingMode := SmoothingModeAntiAlias;
  GPGraphics.FillPath(GPSolidBrush, GPGraphicsPath);
  GPGraphics.DrawPath(GPPen, GPGraphicsPath);
end;

procedure Register;
begin
  RegisterComponents('Stack Overflow', [TRoundShape]);
end;

end.

そして結果(SmoothingModeAntiAliasスムージングモードが適用された場合):

ここに画像の説明を入力してください

このような小さなことに対してGDI+を使用することは大きなオーバーヘッドであると言えますが、結果を醜く見せるものをアンチエイリアスせずに純粋なGDIレンダリングを行います。純粋なGDIを使用してレンダリングされた同じ円形の長方形の例を次に示します。

ここに画像の説明を入力してください

于 2012-07-26T21:01:05.973 に答える