为什么Form的OnPaint
事件在此应用程序中触发了这么多次?
使用两个TButton
控件,一个TMemo
控件和一个TBitBtn
控件创建一个新的VCL表单应用程序。
使用此代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.Clear;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Memo1.Lines.Add('FormPaint');
end;
运行该应用程序。
当鼠标移动到TButton
时,OnPaint
事件会被触发4次,当鼠标从TButton
移出时会被触发4次。
当鼠标移动到TBitBtn
时,OnPaint
事件会被触发3次,当鼠标从TBitBtn
移出时会触发3次。
在“项目/选项/应用程序/外观”中将样式更改为例如“Luna”,我会改变这种行为:
当鼠标移动到TButton
/ TBitBtn
时,OnPaint
事件会被触发1次,当鼠标从TButton
移出时会被触发2次/ TBitBtn
。
为什么不一致?
当鼠标移到OnPaint
上时,是否可以避免TButton
事件?
我有XE8订阅更新1(和Windows 10)。
答案 0 :(得分:3)
悬停在按钮上的效果是您观察到的内容的原因。将鼠标悬停在按钮上时,会更改外观。当您将光标移离按钮时,它会恢复其外观。每次外观更改都会导致表单的OnPaint
事件被触发。这就是底层绘画系统的工作原理。为了绘制子控件,将WM_PRINTCLIENT
消息传递给控件的父级,这反过来导致表单的OnPaint
事件触发。
您可以通过禁用运行时主题来了解这种情况。执行此操作时,将光标移到按钮上不会导致OnPaint
被触发。
VCL样式和Windows主题导致不同数量的OnPaint
事件被触发的原因只是他们以不同的方式处理绘画。但VCL样式也会悬停在效果上,并且还会导致OnPaint
事件被触发。
当光标移到按钮上时,是否可以避免
OnPaint
事件?
在VCL风格的应用程序中,您可能使用没有任何悬停效果的VCL样式。在Windows主题应用程序中,您可以禁用按钮的主题。
我怀疑您真正问题的解决方案,即您未提出问题的答案,就是暂停使用OnPaint
来处理您目前使用它的任何内容。而是在更合适的地方做任何你做的事。