Re: Мышка в DOS
От: DoС  
Дата: 08.02.05 08:42
Оценка:
Здравствуйте, _Student_, Вы писали:

_S_>Тут вот понадобилось написать программину в Turbo C++ 3.0, которая в графическом режиме (graphics.h) будет работать с мышко (позиция, кнопки и т.д. и т.п.). Меня переглючило, как это сделать. Использовать желательно ТОЛЬКО средства C, расширения C++ не приветствуются (жаль...). Подскажите, кто знает. Желательно с примерами.


Копирайт исходников утерян (остались со времен учебы в институте.) когдато всё это работало...

файл commons.h
//-- commons.h -------
//-- V1.1  28.01.95 --
//--------------------
#ifndef COMMONS_H
  #define COMMONS_H
#include <dos.h>

#define  CFound0    Col0
#define  CFound1    Col1
#define  CFound2    Col2
#define  CFound3    Col3
#define  CFound4    Col4
#define  CText1     Col5
#define  CText2     Col6
#define  CText3     Col7
#define  CLight     Col8
#define  CDark      Col9
#define  CLamp1     Col10
#define  CLamp2     Col11
#define  CMixture   Col12
#define  CWater     Col13
#define  CSteam     Col14
#define  CCountur   Col15

#define  CGaz       Col5
#define  CPres      Col12
#define  CAir       Col13
#define  CNo        Col15

enum Colors     {Col0,Col1,Col2,Col3,Col4,
         Col5,Col6,Col7,Col8,Col9,
         Col10,Col11,Col12,Col13,Col14,Col15
        };

typedef struct palettetype PALETTE;

enum Orient     {Horizontal,Vertical,Left,Right,Down,Up};
enum Boolean    {False,True};
enum Condition  {Passive,Active};
enum Zapor      {NO,CLOSED,OPEN};
//------------------------------------
struct Location;
typedef Location* PLocation;
struct Location       // Математическая точка
{
  int X,Y;
  Location(int InitX=0,int InitY=0): X(InitX), Y(InitY) {}
  ~Location() {};
};
//--------------------------------------
#endif


файл mouse.h
// Заголовочный файл драйвера мыши
// struct REGPACK ioregs;
//------ Сделать курсор невидимым ----------
void hide_cursor(void);
//------ Инициализация драйвера мыши --------
int init_mouse(void);
//-------- Установка курсора в позицию x,y ------------
void set_cursor_position(int x,int y);
//------- Установить соотношение микки-пиксел -----------
void set_mickey_pixel(void);
//------- Задать параметры курсора -----------------------
void set_cursor_shape(void);
//----- Cделать курсор видимым -------/
void show_cursor(void);
//----- Определить местоположение курсора -------
int read_cursor(int &x,int &y);


файл mouse.cpp
#include <dos.h>
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include "commons.h"

static struct REGPACK iorg;

/******* Инициализация драйвера мыши *******/
   int init_mouse(void)
   {
     iorg.r_ax=0;
     intr(0x33,&iorg);
     if(iorg.r_ax==0)
     {
       printf("MOUSE NOT INSTALLED!PRESS ANY KEY!\n");
       getch();
       closegraph();
       exit(1);
     }
     return 0;
   }

/****** Cделать курсор видимым *******/
   void show_cursor(void)
   {
     iorg.r_ax=1;
     intr(0x33,&iorg);
   }

/******* Сделать курсор невидимым *********/
   void hide_cursor(void)
   {
     iorg.r_ax=2;
     intr(0x33,&iorg);
   }

/********* Установка курсора в позицию x,y ***********/
   void set_cursor_position(int x,int y)
   {
     iorg.r_ax=4;
     iorg.r_cx=x+12;
     iorg.r_dx=y;
     intr(0x33,&iorg);
   }

/******** Установить соотношение микки-пиксел **********/
   void set_mickey_pixel(void)
   {
     iorg.r_ax=15;
     iorg.r_cx=36;
     iorg.r_dx=36;
     intr(0x33,&iorg);
   }

/******** Задать параметры курсора **********************/
   void set_cursor_shape(void)
   {
     /* содержимое масок курсора и экрана */

     unsigned int cursor[32]=         // Рука
     {
       // Массив маски по "AND"
//       0xe1ff,0xc0ff,0xc0ff,0xc03f,
//       0xc01f,0x8007,0x0003,0x0000,
//       0x0000,0x0000,0x0000,0x0000,
//       0x0000,0x8001,0xc003,0xc003,
       0xf3ff,0xe1ff,0xe1ff,0xe07f,
       0xe03f,0xc00f,0x8007,0x0003,
       0x0001,0x0001,0x0001,0x0001,
       0x8001,0xc003,0xe007,0xe007,
       // Массив маски по "XOR"
       0x0c00,0x1200,0x1200,0x1380,
       0x12c0,0x3270,0x5258,0x924c,
       0x924a,0x900a,0x8002,0xc002,
       0x6006,0x300c,0x1ff8,0x1ff8
     };
/*
     unsigned int cursor[32]=         // Стрелка
     {
       // Массив маски по "AND"
       0xfffc,0xfff8,0xffe0,0xff81,
       0xfe01,0xf803,0xe003,0x8007,
       0x0007,0x800f,0xc00f,0x801f,
       0x021f,0x07ff,0x0fff,0x1fff,
       // Массив маски по "XOR"
       0x0001,0x0002,0x000e,0x003c,
       0x00fc,0x03f8,0x0ff8,0x3ff0,
       0xfff0,0x3fe0,0x1fe0,0x3fc0,
       0x78c0,0xf000,0xe000,0xc000
     };
*/
     iorg.r_ax=9;
     iorg.r_bx=16;
     iorg.r_cx=0;
     iorg.r_es=FP_SEG(cursor);
     iorg.r_dx=FP_OFF(cursor);
     intr(0x33,&iorg);
   }

/****** Определить местоположение курсора ******/
   int read_cursor(int &x,int &y)
   {
     int button;
     iorg.r_ax=3;
     intr(0x33,&iorg);
     x=iorg.r_cx-12;   /* горизонтальная координата курсора */
     y=iorg.r_dx;   /* вертикальная координата курсора   */
     button=iorg.r_bx;  /* состояние клавиш мыши         */
               /* 1-левая клавиша               */
               /* 2-правая клавиша              */
               /* 3-средняя клавиша(Mouse Systems)*/
     while(iorg.r_bx) intr(0x33,&iorg);
     return button;
   }
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.