Programación del ratón en C/C++

Hasta ahora, solo hemos visto una salida estática en la ventana negra en C / C++ sin ninguna interacción con el dispositivo periférico (como el mouse). Aquí estático significa que la interacción con la pantalla de salida a través del mouse para ejecutar un evento o tarea dinámica. El objetivo será hacer visible el puntero del mouse en nuestra pantalla de salida, a través del cual puede ver cualquier evento nuevo cuando se hace clic con el mouse en la misma ventana de salida.

Requisito: Turbo C++ IDE o DOS BOX

Conocimiento fundamental: 
la idea es decirle a un mouse que haga cualquier cosa en la pantalla de salida. En realidad, la comunicación directa con el ratón no es posible sino a través del controlador proporcionado. La idea es usar interrupciones para obtener acceso a este controlador. Cada dispositivo proporcionado por una computadora tiene un puerto único que es un valor hexadecimal que está diseñado para ser independiente de la máquina, lo que mejora la portabilidad del programa. El mouse tiene el puerto 0X33 adjunto. También se requiere el uso de registros de direcciones para acceder a estos puertos. Estos son básicamente UNION de tipo REGS definidos en “ dos.h“. Use dos registros para comunicarse con un controlador de dispositivo, uno para entrada y otro para salida, y envíe el valor al controlador de dispositivo a través del registro de entrada y reciba información incrustada en el registro de salida. 

Ahora hay dos formas de mostrar el puntero del mouse en la pantalla C/C++. El primero es el modo no gráfico y el segundo es el modo gráfico. Aquí usamos el modo gráfico. Para cambiar nuestra ventana de salida en el modo gráfico, los pasos se enumeran a continuación:
Habilitar el modo gráfico: para habilitar el modo gráfico, use la función initgraph() que se usa para inicializar el modo gráfico. Esta función está presente en el archivo de cabecera graphics.h .

Sintaxis de initgraph():  

void initgraph(int *gdriver, int *gmode, char *pathtodriver);

  • gdriver: es un número entero que especifica qué controlador de gráficos se utilizará. Use DETECT significa que el compilador selecciona automáticamente el controlador adecuado de acuerdo con los requisitos.
  • gmode: también es un número entero que especifica el modo de gráficos inicial. when gdriver = DETECT En este caso, initgraph() establece gmode en la resolución más alta disponible para el controlador detectado.
  • pathtodriver: indica la ruta del directorio donde initgraph debe buscar los controladores gráficos.

Programa 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\n",
               grapherrormsg(errorcode));
    else
        printf("Graphics error: %s\n",
               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: \n"
             << grapherrormsg(errorcode);
    else
        cout << "Graphics error: \n"
             << grapherrormsg(errorcode);
 
    getch();
 
    // Close the graph init()
    closegraph();
    return 0;
}

Producción: 

Requisito previo para la programación del mouse:

Registro AX : se puede acceder a las diversas funciones del mouse usando diferentes valores del registro de entrada AX y pasando esos valores al puerto del mouse usando una interrupción. Las funciones se enumeran a continuación en la tabla: 

Aquí AX , BX , CX y DX son miembros de UNION REGS .

Interrumpir Servicio Descripción

0X33

O

51

0

  • Reinicie el mouse y obtenga el estado.
  • Llamar con AX = 0
  • Devuelve AX = FFFFh , si la compatibilidad con el mouse está disponible; de ​​lo contrario, devuelve Ax = 0 .

1

  • Mostrar puntero del mouse.
  • Llame con AX = 1 .
  • No devuelve nada

2

  • Ocultar puntero del mouse.
  • Llame con AX = 2 .
  • No devuelve nada.

3

  • Obtenga la posición del mouse y el estado del botón.
  • Llame con AX = 3 .
  • Devuelve BX = estado del botón del ratón.
  • Significado de bits BX:
    • 0 botón no presionado
    • Se presiona 1 botón izquierdo
    • botón derecho está presionado
    • Se presiona el botón central 3
    • CX = coordenada x
    • DX = coordenada y

4

  • Establecer la posición del puntero del mouse.
  • Llame con AX = 4 .
  • CX = coordenada x
  • DX = coordenada y
  • No devuelve nada.

7

  • Establecer límites horizontales para el puntero.
  • Llame con AX = 7 .
  • CX = coordenada x mínima.
  • DX = máxima coordenada x.
  • No devuelve nada.

8

  • Establecer límites verticales para el puntero.
  • Llame con AX = 8 .
  • CX = coordenada y mínima.
  • DX = máxima coordenada y.
  • No devuelve nada.

Función int86() : int86() es una función de biblioteca C que facilita el acceso a las interrupciones de servicio de DOS y BIOS. Es un contenedor sobre una llamada de interrupción de ensamblaje en línea. Toma valores de registro de CPU con objeto a una estructura donde las variables miembro son equivalentes a registros de CPU. Se necesitan tres argumentos. 

// Sintaxis de la declaración 
int int86(int intno, union REGS* inregs, union REGS* outregs);
// intno: vector de interrupción/número de servicio 
// inregs: el argumento de entrada se registra como REGS 
// outregs: el argumento de salida se registra como REGS 

Casos de uso de la programación del mouse :

Hay varios casos de uso de la programación del mouse que se enumeran a continuación:

  1. Detección de ratón
  2. Mostrar el puntero del mouse en modo gráfico
  3. Ocultar puntero
  4. Determinar la posición actual
  5. Identificado en qué botón del mouse se hace clic
  6. Restringir el puntero del mouse
  7. Dibujo a mano alzada (Uso de todas las funciones)

Programa 2: 
a continuación se muestra el programa para verificar si un controlador de mouse está cargado o no:

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 mentioned above)
    int86(0X33, &in, &out);
 
    if (out.x.ax == 0)
        printf("\nMouse Failed To Initialize");
    else
        printf("\nMouse was Successfully Initialized");
}
 
// Driver Code
int main()
{
    clrscr();
 
    int gdriver = DETECT, gmode;
 
    // Method to enable graphics
    initgraph(&gdriver, &gmode, "c:\tc\bgi");
 
    // 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 mentioned above)
    int86(0X33, &in, &out);
 
    if (out.x.ax == 0)
        cout << "\nMouse Failed To"
             << " Initialize";
    else
        cout << "\nMouse was Successfully"
             << " Initialized";
}
 
// Driver Code
int main()
{
    clrscr();
 
    int gdriver = DETECT, gmode;
 
    // Method to enable graphics
    initgraph(&gdriver, &gmode, "c:\tc\bgi");
 
    // Function Call
    detectMouse();
 
    getch();
 
    // Close graphics mode
    closegraph();
 
    return 0;
}

Producción: 

Publicación traducida automáticamente

Artículo escrito por shubhamp338 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *