我有一个从TCustomButton派生的自定义按钮组件。
为了让它自己绘制,我重写了CreateParams,如下所示:
procedure TMyButton.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := Style or BS_OWNERDRAW;
end;
end;我的按钮在我自己的绘画等方面工作正常,但我想做的是在对象检查器中提供一个布尔属性,它可以用来告诉我的按钮是否应该是所有者绘制的。
例如,如果该属性被启用,该按钮将使用我自己的绘制例程作为ownerdrawn按钮进行绘制,如果该属性被关闭,则它将绘制为主题窗口按钮样式(就像常规的TButton一样)。
CreateParams告诉我的按钮它应该是所有者黎明,但我想提供一个选项来告诉按钮它是否应该是所有者绘制的。通过在设计时或运行时通过代码更改属性,我想告诉我的按钮是否拥有或不拥有绘图。
这有可能实现吗?如果可以,如何实现?
发布于 2013-02-07 00:54:27
我想添加该属性并使CreateParams具有相应的行为不是问题。立即生效的新设置可能是。
在切换该属性时调用RecreateWnd。这将导致删除当前的窗口句柄,并重新创建它,包括使用被覆盖的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-07 00:56:24
你可以这样做:
OwnerDraw属性。CreateParams中测试该属性并相应地切换行为。每当属性更改时,RecreateWnd。您可以通过调用SetWindowLong来简单地更改窗口样式,而不是第3项。请确保在尝试执行此操作之前测试HandleAllocated。没有必要强制创建窗口。但是,每当发生这种情况时,您可能还需要强制执行绘制循环。
就我个人而言,我认为我倾向于强迫窗口重现。
https://stackoverflow.com/questions/14734419
复制相似问题