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