Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

это специальные устройства которые используются для управления курсором

Работа добавлена на сайт samzan.net:


Манипуляторы (мышь, джойстик и др.) — это специальные устройства, которые используются для управления курсором.

Мышь имеет вид небольшой коробки, полностью умещающейся на ладони. Мышь связана с компьютером кабелем через специальный блок — адаптер, и её движения преобразуются в соответствующие перемещения курсора по экрану дисплея. В верхней части устройства расположены управляющие кнопки (обычно их три), позволяющие задавать начало и конец движения, осуществлять выбор меню и т.п.

Использование манипулятора "мышь".

В ИИО TP реализована полная поддержка работы с манипулятором "мышь". Перемещая по столу "мышку" вы быстро найдёте на экране специальный мышиный курсор. Указав этим курсором на нужный Вам раздел меню или подменю и нажав указательным пальцем левую кнопку мыши, Вы войдёте в этот раздел (пробуйте).

Используя манипулятор мышь, можно управлять уже открытыми окнами не используя главное меню. Для этого на рамке окна размещены специальные символы. Если нажимать мышиным курсором на верх или низ, знакомых уже Вам полос скролинга, то текст будет перемещаться постранично и соответственно вверх или вниз, влево или вправо.

Закрыть окно можно нажав тем же мышиным курсором на символ, размещённый вверху слева на рамке окна.

Распахнуть окно, или вернуть ему прежние размеры можно нажав мышиным курсором на символ размещённый рядом с номером окна.

Перемещать окно по экрану можно с помощью мышки, нажав и удерживая мышиный курсор на верхней части рамки окна.

Изменять размеры окна можно используя правый нижний угол окна. Он всегда зелёного цвета. Необходимо просто нажать на него мышиным курсором и удерживая его перемещать мышку по экрану.

Правила работы программы с мышью

Сначала нужно проверить поддерживается ли мышь на данной ЭВМ. Для этого используется функция с номером 0. Эта функция проверяет, имеется ли поддержка мыши на данной ЭВМ, и если имеется, то в регистр AX будет записано число $FFFF. Если нет, то 0, но не обязательно. В регистр BX. В него записывается количество кнопок мыши.

Если мышь имеется, эта функция выполняет следующие действия в текстовом режиме

  1.  перемещает указатель мыши в центр экрана;
  2.  прячет указатель мыши. Для того, чтобы его показать, используется функция с номером 1;
  3.  очищает "область исключения" перемещения указателя мыши, установленную функцией $10. В пределах это прямоугольной области указатель курсора мыши не виден;
  4.  устанавливает вид курсора "по умолчанию". Его изменяет функция $0A;
  5.  разрешает перемещение указателя мыши по всей области экрана. Его ограничивает функция номер 7;
  6.  устанавливает отображение курсора мыши на первую видеостраницу. Напомню, что в текстовом режиме 8 видеостраниц. Первая имеет номер 0;
  7.  устанавливает "обычную" скорость перемещения указателя мыши. То есть, на какое расстояние перемещается указатель мыши при движении манипулятора. А также устанавливает значение интервала между "двойными кликами" по умолчанию. (То есть при двойном щелчке манипулятор может переместится немного, но это не считается). Такие параметры изменяются с помощью функции номер $1A.

Если перед вызовом функции был установлен графический режим, то устанавливается указатель в виде стрелки для данного режима.

Внизу находится листинг первой простейшей программы, в которой проверяется, может ли программа получить доступ к мыши. Если "да", то программа входит в цикл, из которого выходит либо по нажатию любой клавиши на клавиатуре, либо по нажатию любой кнопки мыши.

Для того, чтобы определить, не произошло ли чего с мышью, в этой программе используется функция с номером 3 "Опросить положение и состояние кнопок".

Синтаксис функции 3 прерывания $33: опрос положения курсора и состояния кнопок. Здесь reg - переменная типа REGISTERS

При вызове

AX = 3

Возвращает

биты регистра BX заполнены в соответствии с правилом:

  1.  бит 0 - если нажата левая кнопка мыши. 
    Проверяется
    if reg.BX and 1 = 1 then ...
    ИЛИ: if reg.BX and 1 <> 0 then ...
  2.  бит 1 - если нажата правая кнопка мыши. 
    Проверяется
    if reg.BX and 2 = 2 then ...
    ИЛИ: if reg.BX and 2 <> 0 then ...
  3.  бит 2 - если нажата центральная кнопка мыши. 
    Проверяется
    if reg.BX and 4 = 4 then ...
    ИЛИ: if reg.BX and 4 <> 0 then ...

CX = X координата (горизонтальная) курсора мыши. Для текстового экрана нужно делить на 8, 
чтобы получить номер текстовой колонки

DX = Y координата (вертикальная) курсора мыши. Для текстового экрана нужно делить на 8, 
чтобы получить номер строки

В данном случае мы только опрашиваем состояние левой и правой кнопок. Если нажата любая из них, программа завершает работу.

program mouse_01;

uses DOS, CRT;

var

r: Registers;

BEGIN

 r.ax:=0;

 intr($33, r);

 if r.ax <> $FFFF then

  begin

    WriteLn('Мышь не обнаружена'); Halt(1)

  end;

 Writeln('Обнаружена мышь. Число кнопок = ',r.bx);

 r.ax:=1;  {Покажем указатель мыши}

 intr($33, r);

 repeat

   r.ax:=3;

   intr($33, r);

 until KeyPressed or (r.bx and 3 <> 0);

END.

Теперь, когда убедились в том, что с мышью все в порядке, что-нибудь сделаем посложнее. Например, определим, какой символ находится под указателем мыши, когда нажимаем левую кнопку мыши. Листинг программы приводится ниже. В ней все практически все то же, за исключением некоторых моментов:

  1.  Задействованы регистры CX и DX, заполненные функцией 3. Но ним определяем положение курсора мыши на экране.
  2.  Для определения символа обращаемся к области памяти с сегментом $B800. Это так называемый видеобуфер текстового экрана. Все, что записано там, отображается на экране. Причем организован он так, что по четным адресам находятся коды отображаемых на экране символов, а по следующим за ними нечетным - атрибуты отображения этих символов. То есть, каждую строке текстового экрана соответствует 160 байт (80 колонок). 
    Для определения кода символа используется функция 
    mem Паскаля. Она организована как массив. Индекс "массива" составляют номер сегмента (я использовал константу Паскаля SegB800), и, через двоеточие, номер ячейки памяти (смещение в сегменте). Обратите внимание, что X умножаем на два.
  3.  Код символа преобразуем в символ с помощью функции chr в левом верхнем углу экрана вместе с координатами его.
  4.  НО ЕСТЬ ОДНА ХИТРОСТЬ! Перед тем, как произвести чтение или запись на текстовый экран курсор мыши нужно прятать с помощью функции 2 прерывания $33. Иначе при чтении всегда будет получаться число 255 ($FF), а при записи - любой символ, который бует записан в позиции указателя мыши, пропадет, когда указатель переместится. По этой причине, перед тем, как прочитать и вывести сообщение, курсор мыши прячем, а, написав, показываем опять. Для этого используется функция 1 "мышиного" прерывания. Все происходит так быстро, что никакого мигания человеческий глаз заметить не может (если, конечно, Вы не заставляете программу выполнять какие-либо сложные и длительные расчеты. В этом случае нужно прятать курсор в самый "последний момент"). 
    Убедитесь сами в справедливости сказанного.

program mouse_02;

uses DOS, CRT;

var

r: Registers;

x, y: Word;

BEGIN

 r.ax:=0;

 intr($33, r);

 if r.ax <> $FFFF then

  begin

    WriteLn('Мышь не обнаружена'); Halt(1)

  end;

 Writeln('Мышь обнаружена с ',r.bx,' кнопками');

 r.ax:=1;

 intr($33, r);

 repeat

   r.ax:=3;

   intr($33, r);

   if r.bx and 1 <> 0 then

   begin

     x:=r.cx div 8;

     y:=r.dx div 8;

     r.ax:=2; intr($33, r);

     gotoXY(1,1);

     Write(x:2,'  ', y:2,' ',chr(mem[SegB800:y*160+x*2]),'');

     r.ax:=1; intr($33, r);

   end;

 until KeyPressed or (r.bx and 2 <> 0);

END.

Пример использования подпрограмм модуля Dos

В качестве примера использования ресурсов модуля Dos рассмотрим модуль, содержащий подпрограммы работы с "мышью" и программу, использующую подпрограммы этого модуля и позволяющую рисовать на экране траекторию перемещения курсора "мыши".

Пример.

{ Модуль с подпрограммами мыши }
unit Mouse;
interface
var MousePresent: Boolean;                {Признак наличия мыши}
function MouseInit(var nb: Integer): Boolean; 
            {Инициализация мыши} 
            {nb - количество клавиш мыши;
            значение функции:
            True - инициализация прошла успешно,
            False - в противном случае }
procedure MouseShow;                 {Показать курсор мыши}
procedure MouseHide;                 {Спрятать курсор мыши}
procedure MouseRead(var X, Y, bMask: Word);
  {Определить текущие координаты курсора и состояние клавиш мыши} 
            {X,Y - координаты курсора мыши; 
            bMask - маска клавиш:
            0-й байт - левая клавиша (1 - если нажата), 
            1-й байт - правая клавиша (1 - если нажата), 
            2-й байт - центральная клавиша, если она             присутствует (1 - если нажата) }
procedure MouseSetPos(X, Y: Word);
      {Установить координаты мыши} 
            {X,Y - задаваемые координаты мыши }
function MouseGetb(bMask: Word;
         var Count,LastX,LastY: Word): Word;
            {Определить состояние клавиши} 
            {bMask - маска клавиш - то же, что и в процедуре                 MouseRead, здесь необходимо записать единицу                 в байт, соответствующий проверяемой клавише; 
            Count - количество нажатий клавиши; 
            LastX,LastY - координаты последнего нажатия клавиши; 
            значение функции:
            бит 0 равен 1, если нажата левая клавиша, 
            бит 1 равен 1, если нажата правая клавиша }
implementation
uses Dos;
var R: Registers;           {Стандартный тип модуля Dos}
Mi: Pointer;
function MouseInit(var nb: Word): Boolean; 
begin
  if MousePresent then
    begin                   {Мышь присутствует} 
      R.AX := 0; 
      Intr($33, R) 
      if R.AX = 0 then
        begin               {Инициализация не удалась}
          nb := 0;
          MouseInit := False 
        end 
      else
        begin               {Инициализация удалась}
          nb := R.BX;         {Число клавиш}
          Mouselnit := True
        end 
      end 
  else
    begin                    {Мышь отсутствует}
      nb := 0;
      Mouselnit := False 
    end 
end;
procedure MouseShow; 
begin
  R.AX := 1;
  Intr($33, R) 
end;
procedure MouseHide; 
begin
  R.AX := 2;
  Intr($33, R) 
end;
procedure MouseRead(var X, Y, bMask: Word); 
begin
  R.AX := 3;
  Intr($33, R);
  X := R.CX;
  Y := R.DX;
  bMask := R.BX 
end;
procedure MouseSetPos(X, Y: Word); 
begin
  R.AX := 4;
  R.CX :- X;
  R.DX := Y;
  Intr($33, R)
end;
function MouseGetb(bMask: Word;
                   var Count, LastX, LastY: Word): Word;
begin
  R.AX := 5;
  R.BX := bMask;
  Intr($33, R);
  Count := R.BX;
  LastX .= R.CX;
  LastY := R.DX;
  MouseGetb := R.AX
end;
{ Секция инициализации } 
begin
  GetIntVec($33, Mi);
  if Mi = nil then
    MousePresent := False     {Нет адреса программы обработки 
                               прерываний} 
  else
    if Byte(Mi^) = $CE then
      MousePresent := False    {Фиктивный адрес программы                                обработки прерываний}
    else
      MousePresent := True     {Присутствует программа                                 обработки прерываний}
end.
{ Основная программа }
program EXAMPLE30;
uses Crt, Mouse;
var X, Y, BN, NB: Word;
begin
  TextBackGround(Blue); 
  ClrScr;
  TextColor(Red); 
  if Mouselnit(NB) then 
    begin
      MouseShow; 
      repeat
        MouseRead(X, Y, BN); 
        if BM and 1 <> 0 then
        begin                  {Нажата левая клавиша}
          X := X div В + 1; 
          Y := Y div В + 1; 
          GotoXY(X, Y); 
          Write(' * ') 
        end 
      until BM and 2 <> 0     {Выход при нажатой правой клавише}
    end 
end.

В этом примере в модуле Mouse приведены некоторые подпрограммы, которые не используются в основной программе (MouseHide, MouseSetPos, MouseGetb), но они могут быть полезны в других приложениях. Здесь используется ряд стандартных подпрограмм модуля Dos (GetlntVec, Intr), а также стандартный тип модуля Registers.

"Мышь" работает с номером прерывания $33. Во всех случаях обращения к подпрограмме выполнения прерывания Intr параметры передаются в подпрограмму и обратно в вызывающую программу через соответствующие регистры. В приведенном модуле используется секция инициализации, в которой проверяется наличие программы обработки прерываний от "мыши".




1. Гуманистическая философия Возрождения.html
2. Важно чтобы тип величины был согласован с видом выражения
3. Зачем Левша блоху ковал
4. ; 2 10 Укажите верные утверждения С ~ произвольная по
5. Страна запрашиваемой визы 2
6. 1 Кадровый регламент К работе по техническому обслуживанию и ремонту грузовых вагонов допускаются
7. Уголовно правовая охрана фауны России
8. тема уголовного права как отрасли права
9. Юридическая ответственность- современные проблемы понимания и классификаци
10. Механизм фашистской диктатуры в Германии
11. Лекція на тему- Країни Європи Вінниця Розділ ІІ РЕГІОНИ ТА КРАЇНИ СВІТУ Країни Єв
12. Будущее человечества, Земли и Вселенной
13. 50х роках У перші післявоєнні роки перед США стояли проблеми переведення економіки на мирні рейки та відвер
14. Если же вы планируете использовать семена в качестве посевного материала то помните что именно это действи
15.  Плательщик БИК Сч
16.  О предмете философии и ее месте в системе научного знания 2
17. Реферат- Нептун
18. Обследование
19. Тематика.html
20. Речной вокзал Ориентировочное время в пути до Санкт Петербурга 18 часов