如何实现自定义TGraphicControl.OnResize?

时间:2013-12-24 08:18:00

标签: delphi delphi-7

我应该使用WM_WINDOWPOSCHANGED;吗? (我没见过CM_WINDOWPOSCHANGED或类似的)

TGraphicControl是否会收到此消息的通知(它没有Handle)?什么是正确的方法?

感谢。


接受答案后只是一个问题:

即使控制位置的顶部/左侧发生变化,也会发生奇怪或有意OnResize点火:
在Delphi 7 Resize中调用TControl.SetBounds后立即调用Perform(WM_WINDOWPOSCHANGED),即使没有进行实际调整大小并移动控件。 这是设计的吗?

2 个答案:

答案 0 :(得分:8)

OnResize事件已经在TControl中实现,它只是受到保护。要访问它,您只需为组件重新声明它。您也可以使用插入类或“Hack”类来访问它。作为TImage的示例:

将其用于自己的组件:

TMycontrol=Class(TGraphicControl)
    published
    Property OnResize;
End;

使用插入类:

type
  TImage=Class(ExtCtrls.TImage)
   Property OnResize; 
  End;

  TForm3 = class(TForm)
//....

procedure TForm3.MyResize(Sender: TObject);
begin
  Showmessage(Sender.ClassName)
end;


procedure TForm3.Button1Click(Sender: TObject);
begin
  Image1.OnResize := MyResize;
  Image1.Width := 300;
end;

使用“黑客”:

implementation

{$R *.dfm}
Type THack=Class(TControl)
    Property OnResize;
End;

procedure TForm3.MyResize(Sender: TObject);
begin
  Showmessage(Sender.ClassName)
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  THack(Image1).OnResize :=  MyResize;
  Image1.Width := 300;
end;

该事件由parentcontrol在TWinControl.AlignControls中迭代包含的控件触发。

答案 1 :(得分:4)

  

... OnResize即使......没有实际调整大小并且控件被移动也会触发。这是设计吗?

是。 调整大小不一定只表示大小更改,而是定义其大小的任何属性的更改,包括:Left,Top,Width和Height。

  

TGraphicControl ...

您的问题意味着您正在设计自己的TGraphicControl后代。然后,您不仅应该发布已存在的OnResize事件,还应该覆盖TLama in his comment所述的Resize方法,以及I answered here