Delphi 如何实现自定义TGraphicControl.OnResize?
我是否应该使用Delphi 如何实现自定义TGraphicControl.OnResize?,delphi,delphi-7,Delphi,Delphi 7,我是否应该使用WM\u WINDOWPOSCHANGED?(我没有看到CM\u WINDOWPOSCHANGED或类似内容) Tgraphic控件是否会收到此消息的通知(它没有句柄)?正确的方法是什么 谢谢 在接受答案后,我想: 奇怪地或可能是故意地OnResize触发,即使只有控制位置的顶部/左侧发生了更改: 在Delphi 7中,在t控件中调用Resize。在调用Perform(WM_WINDOWPOSCHANGED)之后,即使没有实际调整大小并且控件被移动,SetBounds也会立即停止
WM\u WINDOWPOSCHANGED代码>?(我没有看到CM\u WINDOWPOSCHANGED
或类似内容)
Tgraphic控件是否会收到此消息的通知(它没有句柄)?正确的方法是什么
谢谢
在接受答案后,我想:
奇怪地或可能是故意地OnResize
触发,即使只有控制位置的顶部/左侧发生了更改:
在Delphi 7中,在t控件中调用Resize
。在调用Perform(WM_WINDOWPOSCHANGED)
之后,即使没有实际调整大小并且控件被移动,SetBounds
也会立即停止。
这是故意的吗 OnResize事件已经在TControl中实现,它只是受到保护。要访问它,您只需为组件重新声明它。您还可以使用interposer类或“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中包含的控件触发
OnResize
即使在以下情况下也会激发:。。。没有实际调整大小,控件被移动。这是故意的吗
对。“调整大小”不一定仅表示大小更改,而是表示定义其大小的任何属性的更改,即:左、上、宽和高
tgraphic控件是否会
您的问题意味着您正在设计自己的tgraphic控件
后代。然后,您不仅应该发布已经存在的OnResize
事件,还应该覆盖Resize
方法,如和所述。如果您正在寻找如何调整大小事件的方法,那么发布现成的OnResize
事件是最佳选择。如果要在组件中实现一些额外的逻辑,请重写Resize
方法。不用担心,即使tgraphic控件
不是窗口控件,它的祖先t控件
也会侦听许多消息。这是因为VCL通过Perform
方法发送真实的系统消息(或模拟它们)。因此,即使使用WM_WINDOWPOSCHANGED
的方法也可以,但它的级别太低了。@TLama,感谢您指出这一点!可能是@NGLN的副本,它不是直接的副本:我知道如何处理TCustomControl/TWinControl(网格控制)。我的迪莱玛完全可以控制。谢谢你的帮助!我忽略了OnResize受保护的事实。谢谢。是的,但如果要挑剔的话:左边,Top不定义“大小”。实际窗口具有不同的消息处理程序,用于调整大小/定位。只是说:)+1