动态更改CreateParams?

时间:2013-02-06 16:49:57

标签: delphi custom-controls ownerdrawn

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

为了使其成为所有者,我已经覆盖了CreateParams,如下所示:

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

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

例如,如果启用了属性,则按钮使用我自己的绘制例程绘制为ownerdrawn按钮,如果切换属性,则应绘制为主题Windows按钮样式(如常规TButton)。

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:5)

你可以这样做:

  1. 制作OwnerDraw财产。
  2. CreateParams中测试该属性并相应地切换行为。
  3. 只要财产发生变化,请致电RecreateWnd
  4. 您可以通过调用SetWindowLong来改变窗口样式,而不是第3项。在尝试执行此操作之前,请确保您测试HandleAllocated。没有必要迫使窗口被创建。但是,你可能还需要在发生这种情况时强制进行油漆循环。

    就个人而言,我认为我倾向于强迫窗户娱乐。