Delphi 当鼠标移动到TButton上时,为什么会多次触发FormPaint事件

Delphi 当鼠标移动到TButton上时,为什么会多次触发FormPaint事件,delphi,windows-10,delphi-xe8,Delphi,Windows 10,Delphi Xe8,为什么表单的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')

为什么表单的
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;
    
  • 运行应用程序

  • 当鼠标移到
    t按钮上时
    ,会触发
    OnPaint
    事件4次,当鼠标从
    t按钮移出时
    会触发4次

    当鼠标移动到
    TBitBtn
    上时,会触发
    OnPaint
    事件3次,当鼠标从
    TBitBtn
    移出时会触发3次

    当样式在“项目/选项/应用程序/外观”中更改为例如“Luna”时,我将改为以下行为:

    当鼠标移动到
    TButton
    /
    TBitBtn
    上时,会触发
    OnPaint
    事件1次,当鼠标从
    TButton
    /
    TBitBtn
    移出时,会触发2次

    为什么不一致

    当鼠标移动到
    t按钮上时,是否可以避免
    OnPaint
    事件


    我有XE8订阅更新1(和Windows 10)。

    按钮的悬停效果是您观察到的结果的原因。当您将鼠标悬停在按钮上时,它会更改外观。将光标移离按钮时,它将恢复其外观。每次外观更改都会触发窗体的
    OnPaint
    事件。这就是底层绘画系统的工作原理。为了绘制子控件,会将
    WM_PRINTCLIENT
    消息传递给控件的父控件,这反过来会导致窗体的
    OnPaint
    事件触发

    您可以通过禁用运行时主题看到这种情况。执行此操作时,将光标移动到按钮上不会触发
    OnPaint

    VCL样式和Windows主题导致触发的
    OnPaint
    事件数量不同的原因很简单,就是它们以不同的方式处理绘制。但是VCL样式也有悬停效果,它们还导致触发
    OnPaint
    事件

    当光标移动到按钮上时,是否可以避免
    OnPaint
    事件

    在VCL样式的应用程序中,您可能会使用没有任何悬停效果的VCL样式。在Windows主题应用程序中,您可以禁用按钮的主题


    我怀疑解决您真正问题的方法,即对您未被问到的问题的答案,是停止使用
    OnPaint
    ,无论您目前使用它做什么。相反,你可以在更合适的地方做任何事情。

    按钮的悬停效果对你观察到的情况负责。当您将鼠标悬停在按钮上时,它会更改外观。将光标移离按钮时,它将恢复其外观。每次外观更改都会触发窗体的
    OnPaint
    事件。这就是底层绘画系统的工作原理。为了绘制子控件,会将
    WM_PRINTCLIENT
    消息传递给控件的父控件,这反过来会导致窗体的
    OnPaint
    事件触发

    您可以通过禁用运行时主题看到这种情况。执行此操作时,将光标移动到按钮上不会触发
    OnPaint

    VCL样式和Windows主题导致触发的
    OnPaint
    事件数量不同的原因很简单,就是它们以不同的方式处理绘制。但是VCL样式也有悬停效果,它们还导致触发
    OnPaint
    事件

    当光标移动到按钮上时,是否可以避免
    OnPaint
    事件

    在VCL样式的应用程序中,您可能会使用没有任何悬停效果的VCL样式。在Windows主题应用程序中,您可以禁用按钮的主题


    我怀疑解决您真正问题的方法,即对您未被问到的问题的答案,是停止使用
    OnPaint
    ,无论您目前使用它做什么。相反,你可以在更合适的地方做任何事情。

    按钮的悬停效果对你观察到的情况负责。当您将鼠标悬停在按钮上时,它会更改外观。将光标移离按钮时,它将恢复其外观。每次外观更改都会触发窗体的
    OnPaint
    事件。这就是底层绘画系统的工作原理。为了绘制子控件,会将
    WM_PRINTCLIENT
    消息传递给控件的父控件,这反过来会导致窗体的
    OnPaint
    事件触发

    您可以通过禁用运行时主题看到这种情况。执行此操作时,将光标移动到按钮上不会触发
    OnPaint

    VCL样式和Windows主题导致触发的
    OnPaint
    事件数量不同的原因很简单,就是它们以不同的方式处理绘制。但是VCL样式也有悬停效果,它们还导致触发
    OnPaint
    事件

    当光标移动到按钮上时,是否可以避免
    OnPaint
    事件

    在VCL样式的应用程序中,您可能会使用没有任何悬停效果的VCL样式。在Windows主题应用程序中,您可以禁用按钮的主题


    我怀疑解决您真正问题的方法,即对您未被问到的问题的答案,是停止使用
    OnPaint
    ,无论您目前使用它做什么。相反,你可以在更合适的地方做任何事情。

    按钮的悬停效果对你观察到的情况负责。当您将鼠标悬停在按钮上时,它会更改外观。当你移动