Delphi 德尔福XE3 TStatusBar重画

Delphi 德尔福XE3 TStatusBar重画,delphi,delphi-xe3,Delphi,Delphi Xe3,我似乎无法使状态栏更新/刷新/重画: TopFormmlcmpStatusPanel1.Invalidate; SendMessage(TopFormmlcmpStatusPanel1.Handle, WM_PAINT, WParam(0), LParam(0)); 在另一个场景中,我尝试过: SendMessage(TopFormmlcmpStatusPanel1.Handle, WM_ERASEBKGND, WParam(0), LParam(0)); 我只想用更新的颜色重新绘

我似乎无法使状态栏更新/刷新/重画:

  TopFormmlcmpStatusPanel1.Invalidate;
  SendMessage(TopFormmlcmpStatusPanel1.Handle, WM_PAINT, WParam(0), LParam(0));
在另一个场景中,我尝试过:

 SendMessage(TopFormmlcmpStatusPanel1.Handle, WM_ERASEBKGND, WParam(0), LParam(0));

我只想用更新的颜色重新绘制状态栏。

我假设
TopFormmlcmpStatusPanel1
TStatusBar
类型

您不发送
WM_PAINT
WM_ERASEBKGND
消息。系统就是这样做的

您的代码:

TopFormmlcmpStatusPanel1.Invalidate;
将导致一个新的油漆周期。当消息循环下一次清空时,将生成绘制循环,并重新绘制控件

或者,您可以使用:

TopFormmlcmpStatusPanel1.Refresh;
如果希望立即重新绘制控件

所以,我想你的问题比你想象的更微妙。我期望您的控件由系统使用系统主题绘制。而您更改颜色的尝试根本无法产生任何效果,因为主题会覆盖控件的颜色属性。没有SSCCE,很难确定这就是问题所在



在注释中,您声明控件是所有者绘制的。可以想象,您的所有者绘制代码有一个错误。我显然无法对我无法遵守的准则发表评论。但是,我要重新声明一个事实,即
Invalidate
Refresh
方法都会导致绘制周期。

状态栏是通过所有者绘制生成的。我还尝试了Invalidate和Refresh,但两个命令都不起作用。Invalidate和Refresh都会导致绘制周期。也许您的所有者绘制代码有一个错误。你没有出席SSCCE。另外,TopFormmlcmpStatusPanel1是什么类型的?我猜是TStatusBar。对吗?那是一个TStatusBar。状态栏最初工作正常,但更改颜色时不会刷新。