首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态改变CreateParams?

动态改变CreateParams?
EN

Stack Overflow用户
提问于 2013-02-07 00:49:57
回答 2查看 3.7K关注 0票数 6

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

为了让它自己绘制,我重写了CreateParams,如下所示:

代码语言:javascript
复制
procedure TMyButton.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    Style := Style or BS_OWNERDRAW;
  end;
end;

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

例如,如果该属性被启用,该按钮将使用我自己的绘制例程作为ownerdrawn按钮进行绘制,如果该属性被关闭,则它将绘制为主题窗口按钮样式(就像常规的TButton一样)。

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

这有可能实现吗?如果可以,如何实现?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-07 00:54:27

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

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

总之:

代码语言:javascript
复制
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;
票数 10
EN

Stack Overflow用户

发布于 2013-02-07 00:56:24

你可以这样做:

  1. 创建OwnerDraw属性。
  2. CreateParams中测试该属性并相应地切换行为。每当属性更改时,
  3. 都会调用RecreateWnd

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

就我个人而言,我认为我倾向于强迫窗口重现。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14734419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档