6

我有一个从 TCustomButton 派生的自定义按钮组件。

为了使它成为所有者,我已经像这样覆盖了 CreateParams:

procedure TMyButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    Style := Style or BS_OWNERDRAW;
  end;
end;

我的按钮适用于我自己的绘画等,但我想做的是在对象检查器中提供一个布尔属性,它可以用来告诉我的按钮是否应该是所有者绘制的。

例如,如果启用了该属性,则按钮使用我自己的绘制例程作为所有者绘制按钮进行绘制,如果该属性被关闭,那么它应该绘制为主题 Windows 按钮样式(如常规 TButton)。

CreateParams 告诉我的按钮它应该是 ownerdawn,但我想提供一个选项来告诉按钮它是否应该是 ownerdrawn。通过在设计时或通过代码在运行时更改属性,我想告诉我的按钮是否要所有者绘制。

这有可能吗?如果可以,怎么做?

4

2 回答 2

10

添加属性并做出CreateParams相应的行为不是我想的问题。立即生效的新设置可能是。

RecreateWnd切换属性时调用。这将导致删除当前的 Windows 句柄并重新创建它,包括使用您覆盖的CreateParams例程。

总而言之:

type
  TMyButton = class(TButtonControl)
  private
    FOwnerDraw: Boolean;
    procedure SetOwnerDraw(Value: Boolean);
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  published
    property OwnerDraw: Boolean read FOwnerDraw write SetOwnerDraw
      default False;
  end;

procedure TMyButton.CreateParams(var Params: TCreateParams);
const
  OwnerDraws: array[Boolean] of DWORD = (0, BS_OWNERDRAW);
begin
  inherited CreateParams(Params);
  Params.Style := Params.Style or OwnerDraws[FOwnerDraw];
end;

procedure TMyButton.SetOwnerDraw(Value: Boolean);
begin
  if FOwnerDraw <> Value then
  begin
    FOwnerDraw := Value;
    RecreateWnd;
  end;
end;
于 2013-02-06T16:54:26.767 回答
6

你可以这样做:

  1. 做一个OwnerDraw财产。
  2. 测试该属性CreateParams并相应地切换行为。
  3. RecreateWnd每当属性更改时调用。

代替第 3 项,您可以通过调用来简单地更改窗口样式SetWindowLong。请确保HandleAllocated在尝试执行此操作之前进行测试。没有必要强制创建窗口。但是,您可能还需要在发生这种情况时强制执行绘制周期。

就个人而言,我想我会倾向于强制窗口娱乐。

于 2013-02-06T16:56:24.250 回答