我应该使用WM_WINDOWPOSCHANGED;
吗? (我没见过CM_WINDOWPOSCHANGED
或类似的)
TGraphicControl是否会收到此消息的通知(它没有Handle)?什么是正确的方法?
感谢。
接受答案后只是一个问题:
即使控制位置的顶部/左侧发生变化,也会发生奇怪或有意OnResize
点火:
在Delphi 7 Resize
中调用TControl.SetBounds
后立即调用Perform(WM_WINDOWPOSCHANGED)
,即使没有进行实际调整大小并移动控件。
这是设计的吗?
答案 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。