Delphi 什么时候调用OnResize表单?
我在表单OnResize事件中添加了一些代码。但它似乎只在调整大小更大时才调用事件。有没有办法改变这一点 说我有Delphi 什么时候调用OnResize表单?,delphi,Delphi,我在表单OnResize事件中添加了一些代码。但它似乎只在调整大小更大时才调用事件。有没有办法改变这一点 说我有 procedure TForm1.Resize(Sender: TObject); begin RePaint(); end 我希望每次重新调整表单大小(大或小)时都运行“重新绘制”。我想您可以添加一个检查宽度/高度的复选框,但如果要这样做,为什么还要使用事件调整大小?也许除了调整大小之外,还有另一个事件可以同时实现这两个功能? 谢谢 Glen当通过任何方式调整窗体的大小时,都
procedure TForm1.Resize(Sender: TObject);
begin
RePaint();
end
我希望每次重新调整表单大小(大或小)时都运行“重新绘制”。我想您可以添加一个检查宽度/高度的复选框,但如果要这样做,为什么还要使用事件调整大小?也许除了调整大小之外,还有另一个事件可以同时实现这两个功能?
谢谢
Glen当通过任何方式调整窗体的大小时,都会触发OnResize事件,尽管它比以前大或小 要证明这一点,请创建一个新项目,在干净的表单上放置一个备忘录,并将此代码添加到OnResize事件中:
procedure TForm1.FormResize(Sender: TObject);
begin
Memo1.Lines.Add(Format('%d,%d', [Width, Height]));
end;
执行您的项目,并拖动窗体的一个边缘使其变得越来越大,您会注意到它总是被触发,以及事件被触发的次数
还请注意,表单中有一个OnPaint事件,这可能就是您所关注的。当表单以任何方式调整大小时,都会触发OnResize事件,尽管它比以前大或小 要证明这一点,请创建一个新项目,在干净的表单上放置一个备忘录,并将此代码添加到OnResize事件中:
procedure TForm1.FormResize(Sender: TObject);
begin
Memo1.Lines.Add(Format('%d,%d', [Width, Height]));
end;
执行您的项目,并拖动窗体的一个边缘使其变得越来越大,您会注意到它总是被触发,以及事件被触发的次数
请注意,表单中有一个OnPaint事件,这可能就是您所关注的内容。这里有两个问题 首先,当窗体在任意方向上调整大小时,将触发调整大小。句号 第二,当窗体变小时,为什么
重新绘制不起作用,可能是因为您自己绘制。通常,只需重新绘制画布.Cliprect
。当窗体变小时,显示的区域不会更改,剪裁区域为空。毕竟,没有比以前更多的东西可以画了。当形状在一个方向上变大时,会发生类似的情况:剪裁区域仅由添加到形状表面的部分组成。同样,前面显示的区域保持不变,不会更新。只有当形状在两个方向上展开时,剪裁区域才不能再由单个矩形构成,因此它成为完整的曲面
您的解决方案是,通过调用Invalidate
(或Update
,在需要立即重新绘制表单时,通过调用Invalidate
),通知Windows在任何调整大小时重新绘制表单的全部内容,并在OnPaint
事件中执行自定义绘制
首先,当窗体在任意方向上调整大小时,将触发调整大小
。句号
第二,当窗体变小时,为什么重新绘制不起作用,可能是因为您自己绘制。通常,只需重新绘制画布.Cliprect
。当窗体变小时,显示的区域不会更改,剪裁区域为空。毕竟,没有比以前更多的东西可以画了。当形状在一个方向上变大时,会发生类似的情况:剪裁区域仅由添加到形状表面的部分组成。同样,前面显示的区域保持不变,不会更新。只有当形状在两个方向上展开时,剪裁区域才不能再由单个矩形构成,因此它成为完整的曲面
您的解决方案是,通过调用Invalidate
(或Update
,在需要立即重新绘制表单时,通过调用Invalidate>,向Windows发出信号,在任何调整大小时重新绘制表单的全部内容,并在OnPaint
事件中执行自定义绘图。即使将窗体大小调整为较小的大小,也会触发OnResize
事件。如果使用对齐属性或锚定,则不需要OnResize事件。OnResize并不总是启动(它会启动),但有更巧妙的方法使控件适应窗体大小。这个问题基于一个错误的假设,即只有当窗体变大时才会调整大小。也没有要调试的SSSCE代码。即使将窗体大小调整为较小的大小,也会触发OnResize
事件。如果使用对齐属性或锚定,则不需要OnResize事件。OnResize并不总是启动(它会启动),但有更巧妙的方法使控件适应窗体大小。这个问题基于一个错误的假设,即只有当窗体变大时才会调整大小。也没有要调试的SSSCE代码。使用;-)更容易@特拉玛,是的,但有了备忘录,您就有了完整的历史记录,并了解事件是如何触发的!:)啊,就是这样,我测试过了,它确实调用了重新调整大小。当我收缩表单时,没有调用ONPaint。思考这个问题做得很好。我想我能理解为什么它不叫它,但我还是希望它叫:迪西尔和;-)@特拉玛,是的,但有了备忘录,您就有了完整的历史记录,并了解事件是如何触发的!:)啊,就是这样,我测试过了,它确实调用了重新调整大小。当我收缩表单时,没有调用ONPaint。思考这个问题做得很好。我想我能理解为什么它不叫它,但我还是希望它叫:D