【问题标题】:Form is shown before controls finish being painted在控件完成绘制之前显示表单
【发布时间】:2010-07-31 19:14:19
【问题描述】:

我相当简单的 c# WinForm 表单上的各种控件(主要是标签和面板)在显示表单时不会被绘制。它们在表格显示后大约半秒完成绘制。

有没有简单的解决方法?

更多细节:

绘制最慢的面板显示从 SQL 数据库读取的一些数据。数据是由文本标签绘制的,背景不是。该面板包含从数据库中提取的非常少量的数据。

另一个在表单出现后完成绘制的面板仅包含几个标签、一个文本控件和一个按钮。

此外,此表单位于另一个表单之上,该表单的唯一目的是用半透明背景覆盖计算机屏幕。当我从应用程序中删除此背景表单时,相同的控件仍然无法在显示表单之前完成绘制(但现在它们仅在大约四分之一秒后完成绘制,而不是大约半秒)。

【问题讨论】:

  • 听起来表单上有一个或多个控件正在减慢绘制速度 - 麻烦的面板上显示了哪些组件?
  • @Will,一个面板有一个 groupBox,其中包含三个标签、一个文本框和一个按钮。另一个面板有一个 groupBox,其中包含一个包含六个标签的第二个面板和一个第三个面板,第三个面板显示了从 SQL 数据库中提取的一些数据(数据只是几行用户帐户名)。
  • SQL 数据如何显示在第三个面板上 - 此面板是所有者绘制的,还是包含例如一个 DataGridView?
  • SQL 数据写入 TableLayoutPanel 控件的多个选项卡中。

标签: c# winforms paint


【解决方案1】:

这是标准的 Windows User32 呈现行为。窗体和大多数控件都是单独的窗口。他们每个人都会收到一条 WM_PAINT 消息,告诉他们需要自己绘制,这些消息以 Z 顺序逐个传递到每个窗口。当控件绘制自己的速度很慢时,就会变得很明显。该控件的未绘制矩形及其后的矩形在片刻内可见。

Windows 窗体中可用的标准双缓冲技术无法解决此问题,您必须对整个窗体进行双缓冲。这是可能的,我在this thread 中的回答告诉你怎么做。

【讨论】:

  • 是的,似乎已经做到了(我需要再测试一下才能确定)。再次感谢您的大力帮助。
猜你喜欢
  • 2017-04-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多