具有Windows窗体Form
派生的表单,其中包含Panel
派生的控件:
该表单具有黑色背景颜色设置:
public MyForm()
{
InitializeComponent();
base.BackColor = Color.Black;
}
面板控件配置为双缓冲等,如here,here和here所述:
public MyPanel()
{
base.DoubleBuffered = true;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();
}
实际绘制是在MyPanel
中的这些替代项内完成的:
protected override void OnPaintBackground(PaintEventArgs e)
{
e.Graphics.Clear(Color.Black);
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(Color.Black);
}
每隔一段时间,当最初显示该窗体时,我的所有者绘制的面板不久就会被绘制成白色,而实际上却没有调用我自己的绘制代码:
调用绘图代码后,所有内容均正确绘制,并且我再也无法重现白色背景:
即使调整窗口和面板的大小也不会使它们闪烁白色。
如果我在表单的Shown
事件处理程序中进行了睡眠,则可以强制执行面板的初始白涂画:
private void MyForm_Shown(object sender, EventArgs e)
{
Thread.Sleep(1000);
}
在调用我的所有者绘制的油漆代码之前,面板以白色显示1000 ms。
当拥有者绘制/自定义绘制面板时,如何避免最初的白色显示?
我的目标是让控件从一开始就“知道”其初始背景颜色(在我的示例中为黑色),而不是在其最初显示之后。
我尝试过各种事情,包括CreateParams
property,但没有取得明显的成功。
我最初的想法是提供一些initial background color through the WNDCLASSEX
structure,但是在深入研究Reference Source之后,我仍然不知道这是否可能并且会有所帮助。
为了安全起见,以下是我的全部代码。
MyForm.cs:
public partial class MyForm : Form
{
public MyForm()
{
InitializeComponent();
base.BackColor = Color.Black;
}
private void MyForm_Shown(object sender, EventArgs e)
{
Thread.Sleep(1000);
}
}
MyPanel.cs:
public class MyPanel : Panel
{
public MyPanel()
{
base.DoubleBuffered = true;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();
}
protected override void OnPaintBackground(PaintEventArgs e)
{
e.Graphics.Clear(Color.Black);
}
protected override void OnPaint(PaintEventArgs e)
{
e.Graphics.Clear(Color.Black);
}
}