Tao OpenGL C# Tab 不旋转
Tao OpenGL C# Tab Not Rotate
为什么我的 OpenGL 放在标签栏时不旋转?
private void simpleOpenGlControl1_Paint_1(object sender, PaintEventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glTranslated(0, 0, -5);
Gl.glRotated(yrot += 1, 1, 1, 0);
Gl.glPointSize(3);
Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_LINES);
Gl.glPolygonMode(Gl.GL_BACK, Gl.GL_LINES);
Gl.glBegin(Gl.GL_QUADS);
{
////Vista posterior
Gl.glColor3ub(255, 0, 255);
Gl.glVertex3d(0, 1, -1);
Gl.glVertex3d(1, -1, -1);
Gl.glVertex3d(-1, -1, -1);
Gl.glVertex3d(0, 1, -1);
////DEBAJO
Gl.glColor3ub(0, 255, 255);
Gl.glVertex3d(-1, -1, -1);
Gl.glVertex3d(1, -1, -1);
Gl.glVertex3d(1, -1, 1);
Gl.glVertex3d(-1, -1, 1);
////POR LA IZQUIERDA
Gl.glColor3ub(255, 255, 0);
Gl.glVertex3d(0, 1, -1);
Gl.glVertex3d(-1, -1, -1);
Gl.glVertex3d(-1, -1, 1);
Gl.glVertex3d(0, 1, 1);
////POR LA DERECHA
Gl.glColor3ub(0, 0, 255);
Gl.glVertex3d(0, 1, 1);
Gl.glVertex3d(1, -1, 1);
Gl.glVertex3d(1, -1, -1);
Gl.glVertex3d(0, 1, -1);
Gl.glColor3ub(255, 0, 0);
Gl.glVertex3d(0, 1, 1);
Gl.glVertex3d(-1, -1, 1);
Gl.glVertex3d(1, -1, 1);
Gl.glVertex3d(0, 1, 1);
Gl.glEnd();
}
我打开了选项卡,但是当我单击另一个选项卡并返回到 OpenGL 选项卡时,3D 对象发生了变化,但它没有旋转。
除非您使用计时器强制每秒重新绘制任意 N 次,否则绘制事件仅在需要时发生。
切换tab时,需要重绘,会发生paint事件。这就是为什么你此时看到了一点变化。
你可能会通过 reducing/maximizing 你的 window 等看到同样的东西......
你应该:
- 使用定期调用 Invalidate 或等效函数的计时器。
- 不要在
paint
事件上更新 yrot
。因为你不知道它什么时候被调用,所以你无法控制旋转速度。使用计时器,或基于时间的值插值。
为什么我的 OpenGL 放在标签栏时不旋转?
private void simpleOpenGlControl1_Paint_1(object sender, PaintEventArgs e)
{
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();
Gl.glTranslated(0, 0, -5);
Gl.glRotated(yrot += 1, 1, 1, 0);
Gl.glPointSize(3);
Gl.glPolygonMode(Gl.GL_FRONT, Gl.GL_LINES);
Gl.glPolygonMode(Gl.GL_BACK, Gl.GL_LINES);
Gl.glBegin(Gl.GL_QUADS);
{
////Vista posterior
Gl.glColor3ub(255, 0, 255);
Gl.glVertex3d(0, 1, -1);
Gl.glVertex3d(1, -1, -1);
Gl.glVertex3d(-1, -1, -1);
Gl.glVertex3d(0, 1, -1);
////DEBAJO
Gl.glColor3ub(0, 255, 255);
Gl.glVertex3d(-1, -1, -1);
Gl.glVertex3d(1, -1, -1);
Gl.glVertex3d(1, -1, 1);
Gl.glVertex3d(-1, -1, 1);
////POR LA IZQUIERDA
Gl.glColor3ub(255, 255, 0);
Gl.glVertex3d(0, 1, -1);
Gl.glVertex3d(-1, -1, -1);
Gl.glVertex3d(-1, -1, 1);
Gl.glVertex3d(0, 1, 1);
////POR LA DERECHA
Gl.glColor3ub(0, 0, 255);
Gl.glVertex3d(0, 1, 1);
Gl.glVertex3d(1, -1, 1);
Gl.glVertex3d(1, -1, -1);
Gl.glVertex3d(0, 1, -1);
Gl.glColor3ub(255, 0, 0);
Gl.glVertex3d(0, 1, 1);
Gl.glVertex3d(-1, -1, 1);
Gl.glVertex3d(1, -1, 1);
Gl.glVertex3d(0, 1, 1);
Gl.glEnd();
}
我打开了选项卡,但是当我单击另一个选项卡并返回到 OpenGL 选项卡时,3D 对象发生了变化,但它没有旋转。
除非您使用计时器强制每秒重新绘制任意 N 次,否则绘制事件仅在需要时发生。
切换tab时,需要重绘,会发生paint事件。这就是为什么你此时看到了一点变化。
你可能会通过 reducing/maximizing 你的 window 等看到同样的东西......
你应该:
- 使用定期调用 Invalidate 或等效函数的计时器。
- 不要在
paint
事件上更新yrot
。因为你不知道它什么时候被调用,所以你无法控制旋转速度。使用计时器,或基于时间的值插值。