我使用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;
}
答案 0 :(得分:6)
当您按CTRL + D key
并不等于'd' or 'D'
时,它等于EOT传输结束并等于此key == 0x04
(更多Pass By Reference)所以你需要添加你的if表达式
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上为我工作。
答案 1 :(得分:1)
我没有这方面的代码,但您可以设置关键回调,如果已按下另一个键但未释放,那么您就可以了。 GLFW支持关键回调,这是应该使用的方法。但是,我不了解freeGLUT,但应该实现关键回调。