如何实现自定义TGraphicControl.OnResize?

Vla*_*lad 4 delphi delphi-7

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

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

谢谢.


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

OnResize即使只有控制位置的顶部/左侧发生了变化,奇怪地或者可能有意地触发:即使没有进行实际的调整并且控制被移动,在调用之后立即调用
Delphi 7 Resize中. 这是设计的吗?TControl.SetBoundsPerform(WM_WINDOWPOSCHANGED)

bum*_*mmi 8

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

将它用于自己的组件:

TMycontrol=Class(TGraphicControl)
    published
    Property OnResize;
End;
Run Code Online (Sandbox Code Playgroud)

使用插入类:

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;
Run Code Online (Sandbox Code Playgroud)

使用"hack"就位:

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;
Run Code Online (Sandbox Code Playgroud)

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