3

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

在此处输入图像描述

我读了那个 Windows 错误,但我该如何修复它?

4

2 回答 2

4

这是一个晦涩的错误,当您显示带有与您的 StatusStrip 重叠的 Windows 工具栏的表单时触发。将窗口从工具栏移开不会正确重绘状态条上的 ToolStripItems。您会在此论坛帖子中找到一些背景知识。对未来修复它的承诺很微弱,不知道这是否曾经发生过。如果您在 Win7 上运行它,可能不会。

您需要更加注意窗口的位置,确保它的某些部分不会消失在工具栏下方。一般来说,你总是会考虑的事情,只要这个错误没有得到修复,就显得格外重要。如果您不想确定启动位置(您应该这样做,用户往往喜欢在上次移动它的位置重新显示一个窗口),那么只需将表单的 StartPosition 属性更改为“CenterScreen”。

于 2014-06-24T09:43:52.723 回答
0

这个错误从未被修复过。它在框架 2 中,现在仍在框架 4 中。

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

但这对我没有帮助,因为“CenterScreen”不能解决问题。

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

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

首先我尝试过

statusStrip.Invalidate();

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

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();
}
于 2016-06-11T21:21:00.813 回答