Opengl, glutGetModifiers не срабатывает на сочетания клавиш
| |
cann | Дата: Вторник, 02 Марта 2021, 15:05 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Написал пример с OpenGL, но есть непонимание того, почему не отрабатываются сочетания нажатия клавиш. В частности не срабатывает сочетания клавиш Shift+r и Ctrl+r. Сочетании клавиш Alt+r отрабатывает нормально. Подскажите, пожалуйста, из-за чего так может быть?
Код program ogl_p1;
{$mode objfpc}{$H+}
uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, gl, glut;
var ScreenWidth, ScreenHeight: Integer; const AppWidth = 640; AppHeight = 480;
procedure resize(width, height: LongInt); cdecl; var ar: Real; begin ar := width div height;
glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity; glFrustum(-ar,ar,-1.0,1.0,2.0,100.0);
glMatrixMode(GL_MODELVIEW); glLoadIdentity; end;
procedure display; cdecl; begin glutSwapBuffers(); end;
procedure key(key: Byte; x,y: Integer); cdecl; var mode: Integer; begin WriteLn('Key = ', key); case key of ord('q'), 27: begin Halt(0); Exit; end; ord('r'): begin mode:=glutGetModifiers(); if (mode <> 0) then begin case mode of 1: begin WriteLn('SHIFT key ', mode); Exit; end; 2: begin WriteLn('CTRL key ', mode); Exit; end; 4: begin WriteLn('ALT key ', mode); Exit; end; end; mode:=0; end; Exit; end; end; glutPostRedisplay(); end;
procedure skey(key: Integer; x,y: Integer); cdecl; begin case key of GLUT_KEY_F1: Halt(0); GLUT_KEY_LEFT: WriteLn('GLUT_KEY_LEFT ', key); GLUT_KEY_RIGHT: WriteLn('GLUT_KEY_RIGHT ', key); GLUT_KEY_UP: WriteLn('GLUT_KEY_UP ', key); GLUT_KEY_DOWN: WriteLn('GLUT_KEY_DOWN ', key); end; glutPostRedisplay(); end;
procedure idle(); cdecl; begin glutPostRedisplay(); end;
procedure main(); begin glutInit(@argc, argv); glutInitWindowSize(AppWidth, AppHeight); glutInitWindowPosition(10,10); glutInitDisplayMode(GLUT_RGB or GLUT_DOUBLE or GLUT_DEPTH);
glutCreateWindow('TestApp');
glutReshapeFunc(@resize); glutDisplayFunc(@display);
glutKeyboardFunc(@key); glutSpecialFunc(@skey);
glutMainLoop(); end;
begin main(); end.
|
|
| |
DmitriyIM | Дата: Пятница, 05 Марта 2021, 06:38 | Сообщение # 2 |
частый гость
Сейчас нет на сайте
| cann, привет.
У тебя есть Skype или VK?
|
|
| |
cann | Дата: Пятница, 05 Марта 2021, 17:17 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| Цитата У тебя есть Skype или VK? DmitriyIM, привет. Если есть информация по теме, прошу ответить здесь.
|
|
| |
Sanchez06 | Дата: Пятница, 05 Марта 2021, 18:17 | Сообщение # 4 |
участник
Сейчас нет на сайте
| Пес его знает, можно ли вставлять здесь ссылки на ответ, просто скопипастю его. Условие для проверки нажатия нескольких клавиш, согласно ответу segevara на стаковерфлоу выглядит вот так:
Код int mod = glutGetModifiers(); if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) { cout << "CTRL+Alt+D press" << endl; }
|
|
| |
Fire_Phoenix | Дата: Пятница, 05 Марта 2021, 23:48 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| Sanchez06, текст нужно приводить полностью
Цитата Sanchez06 ( ) Код int mod = glutGetModifiers(); if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) { cout << "CTRL+Alt+D press" << endl; }
С таким фрагментом кода, будет больше путаницы
cann, я Вам в ЛС написал.
Разобрались?
Сообщение отредактировал Fire_Phoenix - Пятница, 05 Марта 2021, 23:48 |
|
| |
cann | Дата: Суббота, 06 Марта 2021, 18:30 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| Спасибо за ответы Sanchez06, Fire_Phoenix. Получилось наладить обработку сочетания клавиш. Например, такие сочетания Shift+d, Alt+d, Ctrl+d работают. Но, попробовал написать код на обработку клавиш Ctrl + Alt + d и данная комбинация не работает. Код обработки сочетания клавиш Ctrl + Alt + d я написал так: Код
Код if ((key=ord('d')) or (key=ord('D')) or (key=$04)) then begin mode:=glutGetModifiers(); if (mode = (GLUT_ACTIVE_CTRL or GLUT_ACTIVE_ALT)) then begin WriteLn('CTRL + ALT + D pressed ', mode); Exit; end; end;
Есть ли идеи почему не работает? Код переделал из примера кода на си с сайта стековерфлоу автора segevara. Код
Код if (key == 'd' || key == 'D' || key == 0x04) { int mod = glutGetModifiers(); if (mod == (GLUT_ACTIVE_CTRL|GLUT_ACTIVE_ALT)) { cout << "CTRL+Alt+D press" << endl; } }
|
|
| |
Sanchez06 | Дата: Суббота, 06 Марта 2021, 18:54 | Сообщение # 7 |
участник
Сейчас нет на сайте
| По логике, там нужен and. if (mode = (GLUT_ACTIVE_CTRL and GLUT_ACTIVE_ALT)) then
|
|
| |
Fire_Phoenix | Дата: Воскресенье, 07 Марта 2021, 06:23 | Сообщение # 8 |
был не раз
Сейчас нет на сайте
| cann, а Вы поставьте breakpoint, и посмотрите, придет ли у Вас с одновременным нажатием Ctrl + Alt + d вообще клавиша в обработчик
Воспользуйтесь кодом из Вашего первого сообщения, там есть:
Код procedure key(key: Byte; x,y: Integer); cdecl; var mode: Integer; begin WriteLn('Key = ', key);
Следовательно, если при нажатии Ctrl + Alt + d WriteLn ничего не печатает в консоль, то функция проверки бесполезна...
Sanchez06, там должно быть именно OR, так как мы складываем биты
НО комбинация Ctrl + Alt туда просто не приходит. Почему? Нужно искать в документации... Вот Shift + Alt + клавиша и Ctrl + Shift + клавиша работают.
|
|
| |
cann | Дата: Понедельник, 08 Марта 2021, 16:50 | Сообщение # 9 |
частый гость
Сейчас нет на сайте
| Sanchez06, Fire_Phoenix спасибо. Написал код для проверки сочетания клавиш Shift+Alt+d, Shift+Ctrl+d, Alt+Ctrl+d.
Код WriteLn('Key = ', key);
if ((key=ord('d')) or (key=ord('D')) or (key=$04)) then begin mode:=glutGetModifiers(); if (mode = (GLUT_ACTIVE_SHIFT or GLUT_ACTIVE_ALT)) then begin WriteLn('SHIFT + ALT + D pressed ', mode); Exit; end; if (mode = (GLUT_ACTIVE_SHIFT or GLUT_ACTIVE_CTRL)) then begin WriteLn('SHIFT + CTRL + D pressed ', mode); Exit; end; if (mode = (GLUT_ACTIVE_ALT or GLUT_ACTIVE_CTRL)) then begin WriteLn('ALT + CTRL + D pressed ', mode); Exit; end; end;
Действительно, обработка сочетания клавиш Shift+Alt+d и Shift+Ctrl+d работают, Alt+Ctrl+d не работает.
|
|
| |
Fire_Phoenix | Дата: Вторник, 09 Марта 2021, 06:32 | Сообщение # 10 |
был не раз
Сейчас нет на сайте
| cann, в ЛС ответил...
|
|
| |
cann | Дата: Вторник, 06 Апреля 2021, 16:31 | Сообщение # 11 |
частый гость
Сейчас нет на сайте
| Вопрос решен. Всем спасибо за ответы.
|
|
| |
|