Программирование мыши на C / C ++
До сих пор мы видели только статический вывод в черном окне в C / C ++ без какого-либо взаимодействия с периферийными устройствами (например, мышью). Здесь статический означает, что взаимодействие с экраном вывода с помощью мыши запускает динамическое событие или задачу. Цель состоит в том, чтобы сделать указатель мыши видимым на нашем экране вывода, через который он может видеть любое новое событие, когда мышь щелкает в том же окне вывода.
Requirement: Turbo C++ IDE or DOS BOX
Фундаментальные знания:
Идея состоит в том, чтобы указать мыши что-либо делать на экране вывода. На самом деле связь с мышью напрямую невозможна, но через предоставленный драйвер. Идея состоит в том, чтобы использовать прерывания для доступа к этому драйверу. Каждое устройство, предоставляемое компьютером, имеет уникальный порт, который представляет собой шестнадцатеричное значение, которое разработано так, чтобы быть машинно-независимым, что улучшает переносимость программы. К мыши подключен порт 0X33. Для доступа к этому порту также требуется использование адресных регистров. Это в основном UNION типа REGS, определенного в «dos.h». Используйте два регистра для связи с драйвером устройства, один для ввода, другой для вывода, и отправьте значение драйверу устройства через входной регистр и получите информацию, встроенную в выходной регистр.
Теперь есть два способа вывести указатель мыши на экран C / C ++. Первый - это неграфический режим, а второй - Графический режим. Здесь мы используем графический режим. Чтобы переключить наше окно вывода в графический режим, шаги перечислены ниже:
Включить графический режим: для включения графического режима используйте функцию initgraph (), которая используется для инициализации графического режима. Эта функция присутствует в заголовочном файле «graphics.h».
Синтаксис initgraph ():
void initgraph(int *gdriver, int *gmode, char *pathtodriver);
- gdriver: это целое число, указывающее, какой графический драйвер должен использоваться. Использование DETECT означает, что компилятор автоматически выбирает подходящий драйвер в соответствии с требованиями.
- gmode: это также целое число, указывающее начальный графический режим. когда gdriver = DETECT В этом случае initgraph () устанавливает gmode на самое высокое разрешение, доступное для обнаруженного драйвера.
- pathtodriver: указывает путь к каталогу, в котором initgraph должен искать графические драйверы.
Программа 1:
C
// C program to show how to // enable Graphics mode #include <conio.h> #include <graphics.h> // Driver Code int main() { int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "C:\TC\BGI" ); errorcode = graphresult(); // If error occurs if (errorcode == grOk) printf ( "Graphics enabled: %s
" , grapherrormsg(errorcode)); else printf ( "Graphics error: %s
" , grapherrormsg(errorcode)); getch(); // Close the graph init() closegraph(); return 0; } |
C ++
// C++ program to show how to // enable Graphics mode #include <bits/stdc++.h> #include <conio.h> #include <graphics.h> // Driver Code int main() { int gdriver = DETECT, gmode, errorcode; initgraph(&gdriver, &gmode, "C:\TC\BGI" ); errorcode = graphresult(); // If error occurs if (errorcode == grOk) cout << "Graphics enabled:
" << grapherrormsg(errorcode); else cout << "Graphics error:
" << grapherrormsg(errorcode); getch(); // Close the graph init() closegraph(); return 0; } |
Выход:
Необходимые условия для программирования мыши:
Регистр AX : к различным функциям мыши можно получить доступ, используя разные значения входного регистра AX и передав эти значения в порт мыши с помощью прерывания. Функции перечислены ниже в таблице: 0X33 ИЛИ 51 0 . 1 2 3 4 7 8
Здесь AX , BX , CX и DX являются членами UNION REGS . Прерывать Услуга Описание
Функция int86 () : int86 () - это функция библиотеки C, которая облегчает доступ к обычным служебным прерываниям DOS и BIOS. Это оболочка над вызовом прерывания встроенной сборки. Он принимает значения регистров ЦП с объектом в структуру, где переменные-члены эквивалентны регистрам ЦП. Требуется три аргумента.
// Declaration syntax
int int86(int intno, union REGS* inregs, union REGS* outregs);// intno – Interrupt vector /service number
// inregs – Input argument registers as REGS
// outregs – Output argument registers as REGS
Сценарии использования программирования с помощью мыши :
Существуют различные варианты использования программирования с помощью мыши, которые перечислены ниже:
- Обнаружение мыши
- Отображать указатель мыши в графическом режиме
- Скрыть указатель
- Определить текущую позицию
- Определено, какая кнопка мыши нажата
- Ограничить указатель мыши
- Рисование от руки (использование всех функций)
Программа 2:
Ниже представлена программа для проверки, загружен драйвер мыши или нет:
C
// C program to check mouse status #include <conio.h> #include <dos.h> #include <graphics.h> #include <stdio.h> union REGS in, out; // Function to implement the functionality // of detecting Mouse void detectMouse() { in.x.ax = 0; // Invoke interrupt (in86 method // description mentionde above) int86(0X33, &in, &out); if (out.x.ax == 0) printf ( "
Mouse Failed To Initialize" ); else printf ( "
Mouse was Succesfully Initialized" ); } // Driver Code int main() { clrscr(); int gdriver = DETECT, gmode; // Method to enable graphics initgraph(&gdriver, &gmode, "c: cgi" ); // Function Call detectMouse(); getch(); // Close graphics mode closegraph(); return 0; } |
C ++
// C++ program to check mouse status #include <bits/stdc++.h> #include <conio.h> #include <dos.h> #include <graphics.h> #include <stdio.h> union REGS in, out; // Function to implement the functionality // of detecting Mouse void detectMouse() { in.x.ax = 0; // Invoke interrupt (in86 method // description mentionde above) int86(0X33, &in, &out); if (out.x.ax == 0) cout << "
Mouse Failed To" << " Initialize" ; else cout << "
Mouse was Succesfully" << " Initialized" ; } // Driver Code int main() { clrscr(); int gdriver = DETECT, gmode; // Method to enable graphics initgraph(&gdriver, &gmode, "c: cgi" ); // Function Call detectMouse(); getch(); // Close graphics mode closegraph(); return 0; } |
Выход: