6 delphi custom-controls ownerdrawn
我有一个自定义按钮组件,我从TCustomButton派生.
为了使它成为ownerdrawn我已经覆盖了CreateParams,如下所示:
procedure TMyButton.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
Style := Style or BS_OWNERDRAW;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我的按钮与我自己的绘画等工作正常,但我想要做的是在对象检查器中提供一个布尔属性,可用于告诉我的按钮是否应该是所有权.
例如,如果启用了属性,则按钮使用我自己的绘制例程绘制为所有者绘制按钮,如果切换属性,则应绘制为主题Windows按钮样式(如常规TButton).
CreateParams告诉我的按钮它应该是ownerdawn,但是我想提供一个选项来告诉按钮它是否应该被拥有.通过在设计时或在运行时通过代码更改属性,我想告诉我的按钮是否为ownerdraw.
这可能吗?如果可以的话怎么办?
NGL*_*GLN 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;
Run Code Online (Sandbox Code Playgroud)
你可以这样做:
OwnerDraw属性.CreateParams并相应地切换行为.RecreateWnd属性更改时调用.您可以通过调用来简单地更改窗口样式,而不是第3项SetWindowLong.HandleAllocated在尝试执行此操作之前,请确保进行测试.没有必要迫使窗口被创建.但是,您可能还需要在发生这种情况时强制进行油漆循环.
就个人而言,我认为我倾向于强迫窗户娱乐.
| 归档时间: |
|
| 查看次数: |
3439 次 |
| 最近记录: |