我有一个自定义按钮组件,我从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。
这可能吗?如果可以,怎么做?
答案 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)
你可以这样做:
OwnerDraw
财产。 CreateParams
中测试该属性并相应地切换行为。 RecreateWnd
。您可以通过调用SetWindowLong
来改变窗口样式,而不是第3项。在尝试执行此操作之前,请确保您测试HandleAllocated
。没有必要迫使窗口被创建。但是,你可能还需要在发生这种情况时强制进行油漆循环。
就个人而言,我认为我倾向于强迫窗户娱乐。