ToolStripStatusLabel显示为黑框

我使用包含ToolStripStatusLabel的StatusStrip。 操作系统 – Windows 7,框架2.0。 通常所有显示正常,但有时ToolStripStatusLabel看起来像黑盒子:

在此处输入图像描述

我读了那个windows bug,但是我怎么能解决它?

这是一个模糊的错误,当您使用Windows工具栏重叠StatusStrip显示表单时触发。 将窗口移离工具栏不会使状态条上的ToolStripItem正确重新绘制。 你会在这个论坛post中找到一些背景知识。 对于它的未来修复有一个微弱的承诺,不知道是否曾经发生过。 如果你在Win7上运行它可能不会。

您需要更加注意窗口的位置,确保窗口的某些部分不会消失在工具栏下方。 一般来说,只要这个bug没有得到修复,你总会考虑一些非常重要的东西。 如果您不想确定启动位置(您应该,用户倾向于喜欢在上次移动它的位置重新显示窗口),那么只需将窗体的StartPosition属性更改为“CenterScreen”即可。

这个bug从未修复过。 它在框架2中,仍然在框架4中。

Hans的答案是social.msdn.microsoft.com中答案的副本。

但它对我没有帮助,因为“CenterScreen”无法解决问题。

问题的原因不是Windows任务栏。 原因是在绘制StatusStrip的第一时刻主窗体位于任何其他窗口后面时,不会绘制StatusStrip的错误。 但是当您从另一个进程使用Process.Start()启动新进程并且新进程在另一个进程的窗口后面打开时,也会发生这种情况。

我找到了比微软提出的更好的解决方案。

首先我尝试了

 statusStrip.Invalidate(); 

但它不起作用。 所以我们需要一种更强大的方法来强制Windows重绘StatusStrip。 重要提示:当具有StatusStrip的表单在前台已经是ALREADY时,必须重新绘制! 这很容易,我不明白为什么微软不建议这种方法。

 Timer mi_StatusTimer = new Timer(); protected override void OnLoad(EventArgs e) { base.OnLoad(e); mi_StatusTimer.Interval = 500; mi_StatusTimer.Tick += new EventHandler(OnTimerBugFix); } protected override void OnActivated(EventArgs e) { base.OnActivated(e); mi_StatusTimer.Start(); } void OnTimerBugFix(object sender, EventArgs e) { mi_StatusTimer.Stop(); statusStrip.Hide(); Application.DoEvents(); statusStrip.Show(); }