我们有一个按钮单击事件,它启动一个长时间运行的任务,该任务更新状态栏标签和进度控制以提供用户反馈。在我们将任务移动到单独的线程之前,我们注意到状态标签 {label.text = "some message"; }(通常)会立即更新,而进度条和一些自定义控件通常不会更新,直到函数完成并且主 UI 线程再次开始发送消息(考虑到主 UI 线程,我们意识到这很有意义)。
但这让我们想知道 - 某些 Windows 控件是否直接重绘而不是发出 WM_Paint 消息?
问问题
181 次
1 回答
0
您的发现与我对 .NET 控件的了解非常矛盾。常见的规则是更改 Text 属性或更改 ForeColor 或 BackColor 等属性只会导致调用 Invalidate() 方法。当 UI 线程再次开始泵送消息时,这最终会导致传递 WM_PAINT 消息。您可以调用控件或窗体的 Update() 方法来强制在输入慢速代码之前执行任何挂起的绘制。这完全是标准的 Windows 行为。
ProgressBar 控件是一个特例。它的本机 Windows 实现直接更新条形长度。这是兼容行为,此控件通常用于无法正确泵送的代码中。
TextBox 具有特殊的绘制行为,它部分直接绘制到窗口而不是通过 WM_PAINT 消息处理程序。当它需要在 386SUX 机器上合理工作时,这是 Windows 2 的遗留行为。但这在这种情况下无关紧要。
当然,与其为此烦恼,不如永远不要让自己处于任何这些重要的地方。
于 2012-11-28T19:15:08.753 回答