Воскресенье, 22 Декабря 2024, 06:13

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
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;
    }



С таким фрагментом кода, будет больше путаницы :D

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
частый гость
Сейчас нет на сайте
Вопрос решен. Всем спасибо за ответы.
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг