我对Tao'SimpleOpenGlControl
控件有一个奇怪的“闪烁”问题。我有一个System.Windows.Forms.TabControl
的3个标签页。第一页和第二页填充SimpleOpenGlControl
,而第三页则有MonthCalendar
(或Button
或其他内容)。请考虑以下代码:
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
simpleOpenGlControl1.InitializeContexts();
Gl.glClearColor(0, 0, 0, 1);
simpleOpenGlControl2.InitializeContexts();
Gl.glClearColor(0, 0, 0, 1);
}
private void simpleOpenGlControl1_Paint(object sender, PaintEventArgs e) {
// This delay makes the problem evident.
Thread.Sleep(2000);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
}
private void simpleOpenGlControl2_Paint(object sender, PaintEventArgs e) {
Thread.Sleep(2000);
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
}
}
如果我从第一页切换到第二页,第三页,第二页再到第一页,我会在绘制第一个控件之前将日历视为一种背景。
我从源代码中看到,OnPaintBackground
方法被覆盖,并且未调用基类UserControl.OnPaintBackground
方法。这可能是问题吗?
编辑:
我试图覆盖子类中的OnPaintBackground
方法,但是没有调用它。实际上控件的样式是以这种方式初始化的:
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, false);
this.SetStyle(ControlStyles.Opaque, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);
this.SetStyle(ControlStyles.UserPaint, true);
我怀疑标签控件缓冲在某种程度上与SimpleOpenGlControl
的缓冲区相冲突。
AutoMakeCurrent
和AutoSwapBuffers
属性设置为true。我尝试在SwapBuffers()
更改之前致电TabPage
,结果更好但不完美:在标签中前后移动会导致MonthCalendar
闪烁一段时间。
EDIT2:
我使用OpenTK.GLControl
时遇到了同样的问题。使用dotNet控件作为PictureBox
没问题。
EDIT3:
我还尝试覆盖Why do my WinForm controls flicker before the paint event?中描述的WndProc
,但结果是一样的。
此外,OpenTk论坛上的这个answer也无济于事。
似乎不可能解决这个问题!