glutkeyboardfunc呼叫功能不起作用

glutKeyboardFunc calling function not working

本文关键字:不起作用 功能 呼叫 glutkeyboardfunc      更新时间:2023-10-16

我只是在按下" SpaceBar"时尝试调用功能。它的关键代码是32。

#include <GL/glut.h>
#include <GL/glu.h>
#include <GL/gl.h>
#include <cmath> 
#include <iostream>
#include <string.h>
using namespace std;
GLuint window, View1;
void Display_Mid_Ellipse()
{
    double xc=0.0, yc=0.0,  rx=140.0, ry=200.0;
    double rxSq = rx * rx;
    double rySq = ry * ry;
    double x = 0, y = ry, p;
    double px = 0, py = 2 * rxSq * y;
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f( 1 ,0, 0);
     glBegin(GL_POINTS);

     glVertex2d(xc+x,yc-y);
     glVertex2d(xc-x,yc-y);
     glVertex2d(xc-x,yc+y);
    glEnd();
    p = rySq - (rxSq * ry) + (0.25 * rxSq);
    while (px < py)
    {
                    x++;
                    px = px + 2 * rySq;
                    if (p < 0)
                    p = p + rySq + px;
                    else
                    {
                    y--;
                    py = py - 2 * rxSq;
                    p = p + rySq + px - py;
                    }
                     glBegin(GL_POINTS);
                     glVertex2d(xc+x,yc+y);
                     glVertex2d(xc+x,yc-y);
                     glVertex2d(xc-x,yc-y);
                     glVertex2d(xc-x,yc+y);
                    glEnd();
    }
    p = rySq*(x+0.5)*(x+0.5) + rxSq*(y-1)*(y-1) - rxSq*rySq;
    while (y > 0)
    {
            y--;
            py = py - 2 * rxSq;
            if (p > 0)
            p = p + rxSq - py;
            else
            {
            x++;
            px = px + 2 * rySq;
            p = p + rxSq - py + px;
            }
           glBegin(GL_POINTS);
     glVertex2d(xc+x,yc+y);
     glVertex2d(xc+x,yc-y);
     glVertex2d(xc-x,yc-y);
     glVertex2d(xc-x,yc+y);
    glEnd();
    glFlush();
    }
}    //end_MIDPOINT_ELLIPSE
void init () {
    glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.3,0.3,0.3,0.7);
    gluOrtho2D(-500.0,500.0,-500.0,500.0);
}
void View1Display()
{
glutSetWindow(View1);
gluOrtho2D(-500.0,500.0,-500.0,500.0);  
Display_Mid_Ellipse();

   }
    void Display()
 { 
    glutSetWindow(window);
    glClear(GL_COLOR_BUFFER_BIT);
    //View1Display(); 
 }
void keyFunc(unsigned char ch, int x, int y){
if(ch==32){
View1Display();
}
}
int main (int argc, char *argv[]) {      
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(750, 750);
glutInitWindowPosition(0, 0);
window=glutCreateWindow("Circle and ellipse");
init();
View1 = glutCreateSubWindow(window,20,40, 340,340);
glutDisplayFunc(Display);
glutKeyboardFunc(keyFunc);
glutMainLoop();
    return 0;
}

当我从display()函数调用相同的View1Display时,它可以很好地工作。我很困惑。我已经尝试了我可以但找不到解决方案的替代方案。请帮忙。谢谢

  • 为活动窗口注册了回调(创建一个窗口隐式激活它),因此您可以为Toplevel窗口和您的Subwindow注册单独的显示回调。
  • 不要从键盘回调调用您的子窗显示功能。切换共享变量&amp;使用 glutPostWindowRedisplay()代替重复。
  • 如果要使用GLUT_SINGLE,请确保glFlush()强制更新到Framebuffer。

一起:

#include <GL/glut.h>
#include <cmath> 
using namespace std;
void Display_Mid_Ellipse()
{
    double xc = 0.0, yc = 0.0, rx = 140.0, ry = 200.0;
    double rxSq = rx * rx;
    double rySq = ry * ry;
    double x = 0, y = ry, p;
    double px = 0, py = 2 * rxSq * y;
    glClear( GL_COLOR_BUFFER_BIT );
    glColor3f( 1, 0, 0 );
    glBegin( GL_POINTS );

    glVertex2d( xc + x, yc - y );
    glVertex2d( xc - x, yc - y );
    glVertex2d( xc - x, yc + y );
    glEnd();
    p = rySq - ( rxSq * ry ) + ( 0.25 * rxSq );
    while( px < py )
    {
        x++;
        px = px + 2 * rySq;
        if( p < 0 )
            p = p + rySq + px;
        else
        {
            y--;
            py = py - 2 * rxSq;
            p = p + rySq + px - py;
        }
        glBegin( GL_POINTS );
        glVertex2d( xc + x, yc + y );
        glVertex2d( xc + x, yc - y );
        glVertex2d( xc - x, yc - y );
        glVertex2d( xc - x, yc + y );
        glEnd();
    }
    p = rySq*( x + 0.5 )*( x + 0.5 ) + rxSq*( y - 1 )*( y - 1 ) - rxSq*rySq;
    while( y > 0 )
    {
        y--;
        py = py - 2 * rxSq;
        if( p > 0 )
            p = p + rxSq - py;
        else
        {
            x++;
            px = px + 2 * rySq;
            p = p + rxSq - py + px;
        }
        glBegin( GL_POINTS );
        glVertex2d( xc + x, yc + y );
        glVertex2d( xc + x, yc - y );
        glVertex2d( xc - x, yc - y );
        glVertex2d( xc - x, yc + y );
        glEnd();
        glFlush();
    }
}    //end_MIDPOINT_ELLIPSE
bool displayEllipse = false;
void View1Display()
{
    glClearColor( 0.3, 0.3, 0.3, 0.7 );
    glClear( GL_COLOR_BUFFER_BIT );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluOrtho2D( -500.0, 500.0, -500.0, 500.0 );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    if( displayEllipse )
        Display_Mid_Ellipse();
    glFlush();
}
void Display()
{
    glClearColor( 0.0, 0.0, 0.0, 1.0 );
    glClear( GL_COLOR_BUFFER_BIT );
    glFlush();
}
GLuint window;
GLuint View1;
void keyFunc( unsigned char ch, int x, int y )
{
    if( ch == 32 )
    {
        displayEllipse = !displayEllipse;
        glutPostWindowRedisplay( View1 );
    }
}
int main( int argc, char *argv[] )
{
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutInitWindowSize( 750, 750 );
    glutInitWindowPosition( 0, 0 );
    window = glutCreateWindow( "Circle and ellipse" );
    glutDisplayFunc( Display );
    glutKeyboardFunc( keyFunc );
    View1 = glutCreateSubWindow( window, 20, 40, 340, 340 );
    glutDisplayFunc( View1Display );
    glutMainLoop();
    return 0;
}