Программирование мыши на C / C ++

Опубликовано: 16 Декабря, 2021

До сих пор мы видели только статический вывод в черном окне в 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 и передав эти значения в порт мыши с помощью прерывания. Функции перечислены ниже в таблице:
Здесь AX , BX , CX и DX являются членами UNION REGS .

Прерывать Услуга Описание

0X33

ИЛИ

51

0

  • Сбросьте мышь и получите статус.
  • Звонок с AX = 0

    .



  • Возвращает AX = FFFFh , если доступна поддержка мыши, в противном случае возвращает Ax = 0 .

1

  • Показать указатель мыши.
  • Звоните с AX = 1 .
  • Ничего не возвращает

2

  • Скрыть указатель мыши.
  • Звоните с AX = 2 .
  • Ничего не возвращает.

3

  • Получите положение мыши и статус кнопки.
  • Звоните с AX = 3 .
  • Возвращает BX = статус кнопки мыши.
  • Значение бита BX:
    • 0 кнопка не нажата
    • Нажата 1 левая кнопка
    • 2 правая кнопка нажата
    • 3 центральная кнопка нажата
    • CX = координата x
    • DX = координата y

4

  • Установите положение указателя мыши.
  • Звоните с AX = 4 .
  • CX = координата x
  • DX = координата y
  • Ничего не возвращает.

7

  • Установите горизонтальные пределы для указателя.
  • Звоните с AX = 7 .
  • CX = минимальная координата x.
  • DX = максимальная координата x.
  • Ничего не возвращает.

8

  • Установите вертикальные пределы для указателя.
  • Звоните с AX = 8 .
  • CX = минимальная координата y.
  • DX = максимальная координата y.
  • Ничего не возвращает.

Функция 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

Сценарии использования программирования с помощью мыши :

Существуют различные варианты использования программирования с помощью мыши, которые перечислены ниже:

  1. Обнаружение мыши
  2. Отображать указатель мыши в графическом режиме
  3. Скрыть указатель
  4. Определить текущую позицию
  5. Определено, какая кнопка мыши нажата
  6. Ограничить указатель мыши
  7. Рисование от руки (использование всех функций)

Программа 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;
}

Выход:

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с Базовым курсом C для базового и продвинутого C.
Предыдущий
Опыт собеседования в Cisco для прохождения стажировки (в кампусе, 2020 г.)
Следующий
Примеры использования программирования мыши на C / C ++
Рекомендуемые статьи
Страница :
Статья предоставлена:
shubhamp338
@ shubhamp338
Голосуйте за трудности
Текущая сложность: эксперт
Теги статьи:
  • Статьи
  • Язык C
  • Программы C
  • C ++
  • Программы на C ++
Теги практики:
  • CPP
Сообщить о проблеме
Статьи C++ C

РЕКОМЕНДУЕМЫЕ СТАТЬИ