2016-02-10 3 views
3

У меня проблема с ключами с помощью freeglut функций. Все ключи работают нормально, кроме ctrl+alt+D. Я не знаю, почему это не работает, что я делаю неправильно.
Это код:Несколько ключей не работают

#include<iostream> 
#include<cstdlib> 
#include <GL\freeglut.h> 
using namespace std; 

void Display(void) { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glEnd(); 
    glFlush(); 
} 

void SpecialKeys(int key, int xpos, int ypos) { 

    if (key == GLUT_KEY_UP) { 
     cout << "up key press" << endl; 
    } 

    else if (key == GLUT_KEY_DOWN) { 

     cout << "down key press" << endl; 
    } 

    else if (key == GLUT_KEY_RIGHT) { 

     cout << "Right key press" << endl; 

    } 
    else if (key == GLUT_KEY_LEFT) { 

     cout << "left key press" << endl; 

    } 
    glutPostRedisplay(); 
} 

void KeysFun(unsigned char key, int xpos, int ypos) { 

    if (key == 'a' || key == 'a') { 
     cout << "A Key press" << endl; 
    } 

    else if (key == 's' || key == 'S') { 

     int mod = glutGetModifiers(); 

     if (mod == GLUT_ACTIVE_ALT) { 

      cout << "Alt+S press" << endl; 
     } 

    } 

    else if (key == 'd' || key == 'D') { 

     int mod = glutGetModifiers(); 
     int mod2 = glutGetModifiers(); 
     if (mod == GLUT_ACTIVE_CTRL && mod2== GLUT_ACTIVE_ALT) { 

      cout << "CTRL+Alt+D press" << endl; 
     } 

    } 

    glutPostRedisplay(); 
} 

void init(void) { 

    glClearColor(0.0f,0.0f,0.0f,0.0f); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 

} 


int main(int argc, char**argv) { 

    glutInit(&argc, argv); 
    glutCreateWindow("Frame"); 
    init(); 
    glutDisplayFunc(Display); 
    glutKeyboardFunc(KeysFun); 
    glutSpecialFunc(SpecialKeys); 
    glutMainLoop(); 

    return EXIT_SUCCESS; 
} 

ответ

6

При нажатии CTRL + D key не равна 'd' or 'D' она равна СРВ Конец передачи и равна этому key == 0x04 (более info here), поэтому вам необходимо добавить к вашему, если выражение еще

if (key == 'd' || key == 'D' || key == 0x04) 

рядом, когда вы нажимаете ALT и CTRL одновременно glutGetModifiers() вернет вам комбинацию любого из следующих символических битмаски: GLUT_ACTIVE_CTRL GLUT_ACTIVE_ALT ... подробнее info here

в результате, если блок для кнопки D Нажмите, может выглядеть следующим образом:

else if (key == 'd' || key == 'D' || key == 0x04) { 
    int mod = glutGetModifiers(); 
    if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) { 
     cout << "CTRL+Alt+D press" << endl; 
    } 
} 

работает для меня на Linux.

+0

Control-D не должен вызывать EOT в MS Windows (см. Обратную косую черту в '# include'), по крайней мере, ни на одной из оболочек, которые я знаю. Мне все еще интересно, помогло ли это решить проблемы. –

+0

@segevara где я могу найти коды этих ключей вроде 0x04 для D – hamel123

+0

@segevara Что такое eot? – hamel123

1

У меня нет кода для этого, но вы можете настроить обратный вызов и если другой ключ был нажат и не отпущен, тогда у вас есть свой случай. GLFW поддерживает ключевой обратный вызов, который является методом, который следует использовать. Однако я не знаю о freeGLUT, но он должен иметь ключевой обратный вызов.

Смежные вопросы