SimpleOpenGlControl选项卡切换奇怪的行为

时间:2014-04-17 16:04:21

标签: c# winforms opengl opentk tao-framework

我对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的缓冲区相冲突。

AutoMakeCurrentAutoSwapBuffers属性设置为true。我尝试在SwapBuffers()更改之前致电TabPage,结果更好但不完美:在标签中前后移动会导致MonthCalendar闪烁一段时间。

EDIT2:

我使用OpenTK.GLControl时遇到了同样的问题。使用dotNet控件作为PictureBox没问题。

EDIT3:

我还尝试覆盖Why do my WinForm controls flicker before the paint event?中描述的WndProc,但结果是一样的。 此外,OpenTk论坛上的这个answer也无济于事。

似乎不可能解决这个问题!

0 个答案:

没有答案