Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Работа с мышью (Assembler)  (Прочитано 38620 раз)
0 Пользователей и 1 Гость смотрят эту тему.
demonhunterus
Интересующийся

ua
Offline Offline

« : 24-09-2011 10:16 » 

Возникли трудности с рабором работы мыши.
Конкретно по делу:
Код:
#include<conio.h>
#include<stdio.h>
int main()
{   int X,Y;
int i=0;
unsigned char mask=1;
unsigned char SCAN;
int BUT;
int IS_ON;
clrscr();
asm {
     mov AX,3;
     int 0x33;
     mov X,CX;
     mov Y,DX;
     mov BUT,BX;
     mov AX,0;
     int 0x33;
     mov IS_ON,AX;
     }
printf ("%d,%d.\n",X,Y);

if (IS_ON==0x0FFFF)
printf ("Mouse Is On\n");
else
if (IS_ON==0x0000)
printf ("Mouse Is Off\n");

for(i=0;i<3;i++) {
if (mask & BUT)
{
  if (i==0)
  printf ("Left Mouse Button\n");
  if (i==1)
  printf ("Right Mouse Button\n");
  if (i==2)
  printf ("Middle Mouse Button\n");
}
mask=mask<<1;
}

asm { mov AH,0;
      int 0x16;
      mov SCAN,AH;
      }
if (SCAN==16)
asm { mov AX,2;
      int 0x33;
      }
getch();
return 0;
}

1)Вывод на экран координат X,Y
Код:
mov AX,3;
      int 0x33;
      mov X,CX;
      mov Y,DX;
      printf ("%d,%d.\n",X,Y);
Результат - координаты выводит.Но только почему-то они не всегда обновляются.Могу получить координаты,выйти из программы,переместить курсор мыши,снова запустить программу,но координаты останутся те же.А иногда меняются на другие.Не понятна причина.

2)Инициализация мыши IS_ON
Код:
mov AX,0;
      int 0x33;
      mov IS_ON,AX;
      if (IS_ON==0x0FFFF)
      printf ("Mouse Is On\n");
      else
      if (IS_ON==0x0000)
      printf ("Mouse Is Off\n");
Результат - работает корректно.Вроде бы.По крайней мере при подключенной к компьютеру мышке выдает Mouse Is On

3)Проверка на нажатие кнопки мыши BUT
Код:
mov BUT,BX;
      for(i=0;i<3;i++) {
      if (mask & BUT)
      {
      if (i==0)
      printf ("Left Mouse Button\n");
      if (i==1)
      printf ("Right Mouse Button\n");
      if (i==2)
      printf ("Middle Mouse Button\n");
      }
      mask=mask<<1;
      }
Результат - программа запущена,нажимаю кнопку мыши(правую/левую),сообщение не появлется.Подозреваю,что нужно,чтоб кнопка была нажата во время запуска программы,но с зажатой кнопкой мыши CTRL+F9 упорно не хочет запускать программу.Вопрос.Как сделать так,чтоб программа ожидала нажатия кнопки мыши,а затем выводила соответствующее сообщение о нажатой клавише?

4)Ну и последнее - при нажатии клавиши скрыть курсор мыши
Код:
asm { mov AH,0;
      int 0x16;
      mov SCAN,AH;
      }
      if (SCAN==16)
      asm { mov AX,2;
      int 0x33;
      }
Нажимаю q после запуска программы - ничего не происходит,а по-идее должен пропадать курсор.Что не так?
Кто может и захочет - хоть по какому-то вопросу дайте пояснения.Благодарю.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 24-09-2011 10:28 » 

4. Что возвращает int 16H?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #2 : 24-09-2011 10:31 » 

int 16h - ожидает нажатия клавиши и читает символ (ход программы выполнения приостанавливается пока не будет нажата клавиша)
Выход:
AH = скан код
AL = ASCII-код или 0 при нажатии специальной функциональной клавиши.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 24-09-2011 10:42 » 

ага, т.е. SCAN == 16 это и есть сканкод Q
а проверить слабо?
прочитал значение в SCAN - выведи его на экран
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #4 : 24-09-2011 10:46 » 

Не слабо.SCAN==16 - это сканкод клавиши q.Прочитал,вывел на экран,всё отлично и красиво.А вот дальнейший код работать не хочет(который скрывает курсор).Так что всё пока без изменений.Ещё предложения будут? (В пункте 4 загвоздка именно в том,что курсор не пропадает,я уже разные комбинации перепробывал, букву q выставил просто от фонаря,но смысл тот же - после нажатия клавиши курсор должен пропадать,но не пропадает)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 24-09-2011 10:50 » 

кроме того, я не увидел цикла ожиданий прерывания

У тебя в конце программы стоит getchar - ожидание нажатия.


А опрос клавиатуры  и мыши должен проходить постоянно. Потому что это прерывания ПРОГРАММНЫЕ.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #6 : 24-09-2011 10:58 » 

Окееей.
"цикла ожиданий прерывания" --- пример можно?Его на Си или Ассемблере писать хоть?
Getch() просто для того вписал,чтоб видеть,какой сканкод выведет на экран.нажатие любой кнопки - выход.без него при нажатии любой клавиши после запуска программы она тут же завершается.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 24-09-2011 11:08 » 

demonhunterus, в conio.h есть функция kbhit, которая не зависает в ожидании нажатия клавиши, а лишь сообщает, была ли нажата клавиша или нет (есть ли в буфере ввода данные).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #8 : 24-09-2011 11:18 » 

Цитата
После запуска программы и нажатия любой кнопки клавиатуры пересчитываются и выводятся текущиее координаты.
Хм.. тогда объясни ... что и когда начинает работать?
« Последнее редактирование: 24-09-2011 11:34 от Sla » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 24-09-2011 11:23 » 

Что-то не совсем понятно, то что ты сейчас написал.
Покажи-ка код цикла в программе.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #10 : 24-09-2011 11:25 » 

Код:
#include<conio.h>
#include<stdio.h>
int main()
{ while (!kbhit()) {
int X,Y,BUT,IS_ON,i=0;
unsigned char SCAN,mask=1;
clrscr();
asm {
     mov AX,3;
     int 0x33;
     mov X,CX;
     mov Y,DX;
     mov BUT,BX;
     mov AX,0;
     int 0x33;
     mov IS_ON,AX;
     }
     if (IS_ON==0x0FFFF)
printf ("Mouse Is On\n");
else
if (IS_ON==0x0000)
printf ("Mouse Is Off\n");
printf ("%d,%d.\n",X,Y);

for(i=0;i<3;i++) {
if (mask & BUT)
{
  if (i==0)
  printf ("Left Mouse Button\n");
  if (i==1)
  printf ("Right Mouse Button\n");
  if (i==2)
  printf ("Middle Mouse Button\n");
}
mask=mask<<1;
}
asm { mov AH,0;
      int 0x16;
      mov SCAN,AH;
      }
      if (SCAN==16)
      asm {
           mov AX,0;
           int 0x33;
           mov AX,1;
           int 0x33;
      }
      printf ("%d\n",SCAN); }
return 0;
}
Разобрался.В таком виде получаем такую работу программы:
при каждом нажатии клавиши на клавиатуре обновляются и выводятся на экран координаты мыши и состояние мыши.
Причина: int 0x16;
ожидаем нажатия клавиши,чтобы продолжить работу.
Убираем код
Код:
asm { mov AH,0;
      int 0x16;
      mov SCAN,AH;
      }
      if (SCAN==16)
Получаем такую работу:
с бешенной скоростью обновляются текст Mouse Is On и координаты,причем иногда не отображаются полностью,а уже начинается новая печать.Совсем не то,что нужно.
Думаю над решением.Может,сделать менюшку какую-со свич кейсами,мол тыкнешь 1 - получишь координаты и при нажатии вернешься в меню,тыкнешь  - получишь состояние мыши и вернешься в меню, тыкнешь 3 - уберется курсор, тыкнешь 4 - появится курсор,тыкнешь 5 - будет отслеживаться нажатие кнопки мышки.как только тыкнешь любую - выведется сообщение о том,какую нажал и вернешься в меню.
Или может кто подскажет вариант,который поможет остановить обновление информации на экране с бешенной скоростью,с возможностью убрать/показать курсор и отслеживать координаты и нажатия кнопок мыши?
« Последнее редактирование: 24-09-2011 12:14 от demonhunterus » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 24-09-2011 13:06 » 

Цикл ожидания нажатия
  Чтения состояния мыши
  Если предыдущее состояние изменилось - вывод
  иначе на начало цикла
Конец цикла
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #12 : 24-09-2011 13:36 » 

Переделал вот так вот
Код:
#include <stdio.h>
#include <conio.h>

int main()
{
    unsigned char mask=1;
    int key,BUT,IS_ON,X,Y,i=0;
    do
    {
        clrscr();
        printf ("1 - Check Mouse Status\n");
        printf ("2 - Hide Mouse\n");
        printf ("3 - Show Mouse\n");
        printf ("4 - Show Coords\n");
        printf ("5 - Button Status\n");
        printf ("6 - Exit\n\n");
        printf ("Press key: ");
        scanf ("%d", &key);
        switch (key)
        {
            case 1:
                {   clrscr();
                    asm {
                         mov AX,0;
                         int 0x33;
                         mov IS_ON,AX;
                         }
                    if (IS_ON==0x0FFFF)
                    printf("Mouse Is On\n");
                    else
                    if (IS_ON=0x0000)
                    printf("Mouse If Off\n");
                    getch();
                    break;
                }
            case 2:
                {
                    clrscr();
                    asm {
                         mov AX,2;
                         int 0x33;
                         }
                    getch();
                    break;
                }
            case 3:
                {
                    clrscr();
                    asm {
                         mov AX,1;
                         int 0x33;
                         }
                     getch();
                     break;

                     }
            case 4:
                {
                    clrscr();
                    asm {
                         mov AX,3;
                         int 0x33;
                         mov X,CX;
                         mov Y,DX;
                         }
                    printf ("%d, %d\n",X,Y);
                    getch();
                    break;
                    }
            case 5:
                 {
                   clrscr();
                   asm {
                        mov AX,3;
                        int 0x33;
                        mov BUT,BX;
                        }
                   while(!kbhit()) {
                   for (i=0;i<3;i++) {
                   if (mask&BUT)
                   {
                     if (i==0)
                     printf ("Left Mouse Button Is Pressed\n");
                     if (i==1)
                     printf ("Right Mouse Button Is Pressed\n");
                     if (i==2)
                     printf ("Middle Mouse Button Is Pressed\n");
                     }
                     mask=mask<<1; }  }
                     break;
                   }
            default:
                {
                    if (key == 6)
                    printf ("Exiting succesfully\n");
                    else
                    printf ("Press only 1, 2, 3,4,5 or 6\n");
                    getch();
            }
        }
    }
    while (key != 6);
    return 0;
}
1 - отображает,что мышка подключена
2 - курсор так и не пропадает Жаль
3 - естественно,если он не пропадает,то и появляться нечему
4 - показывает текущие координаты
5 - должен выводить сообщение,при нажатии кнопки мыши,но не выводит
6 - выход хоть нормально работает ^_^

Не могу разобраться с пропажей курсора.В чем проблема?Должен же пропадать...Без этого и появление не могу сделать.С нажатием кнопки мыши сейчас разбираюсь,попробую что-нибудь придумать

Цитата
Цикл ожидания нажатия
       Чтения состояния мыши
       Если предыдущее состояние изменилось - вывод
       Иначе на начало цикла
       Конец цикла
Словесно понял о чем идет речь,но не знаю вот как это реализовать в коде.
Код:
while (!kbhit())
{
   asm {
        mov AX,3;
        int 0x33;
        mov X,CX;
        mov Y,DX;
        mov BUT,BX;
       }
        if (предыдущее значение координат != текущему значению координат)
        printf ("%d,%d.\n",X,Y);
}
Как-то так?Или через goto? (никогда с ним не работал,если честно)
Код:
while (!kbhit())
{  start:
   asm {
        mov AX,3;
        int 0x33;
        mov X,CX;
        mov Y,DX;
        mov BUT,BX;
       }
        if (предыдущее значение координат != текущему значению координат)
        printf ("%d,%d.\n",X,Y);
        else
        goto Start;
}

Только вот я не могу понять как запомнить текущее значение координат и сравнивать его с новыми,если оно таковое будет.Ну и открытый вопрос по поводу курсора.Вроде бы самое простое.Но не работает
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 24-09-2011 13:53 » 

а какой вид у тебя имеет "мышечный" курсор?

Добавлено через 3 минуты и 18 секунд:
Чтобы сделал я?
Я бы написал
1. макрос работы с 33 прерыванием
2. Каждый пункт меню = функция
например
ShowMouse
HideMouse
« Последнее редактирование: 24-09-2011 13:57 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #14 : 24-09-2011 14:05 » 

а какой вид у тебя имеет "мышечный" курсор?
--- стрелочка Отлично Отлично Отлично Я так понял,она должна пропадать.Но даже если и речь идет о текстовом курсоре(который мигает,который  _  ),то он всё равно не пропадает.
Чтобы сделал я?
Я бы написал
1. макрос работы с 33 прерыванием
2. Каждый пункт меню = функция
например
ShowMouse
HideMouse
---а в чем принципиальная разница?Ну как бы
HideMouse будет
Код:
asm {
              mov AX,2;
              int 0x33;
                         }
,но оно всё равно не работает...
Даже если прописать
Код:
#include <conio.h>
#include <stdio.h>
int main()
{ asm {
       mov AX,2;
       int 0x33;
      }
getch();
return 0;
}
при запуске курсор всё равно не пропадает.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 24-09-2011 14:16 » 

ты под какой ОС работаешь?
если только в чистом DOS, то все у тебя получится.
под XP - думаю, что у тебя не получится погасить курсор. Ты ведь не один в системе работаешь Улыбаюсь
Про функции. Естественно ничего не изменится в работе. Но на порядок будет читабельнее.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #16 : 24-09-2011 14:22 » 

Работаю под XP,в DOS_BOX (Borlad C 3.1).Значит,отсюда отключить курсор не получится?Беда.Хотя говорили,что под DOS_BOX всё должно работать...
А,ну может быть )) Просто черновой вариант.Записываю мысли,главное,чтоб работало,а чтоб красиво делаю потом.
Ну,предположим,что курсор не пропадет.Остается нажатие кнопки мыши.
Нет для мыши случайно такого же прерывания как для клавиатуры с ожиданием нажатия кнопки мыши?Или прийдется что-то другое выдумать?

Добавлено через 26 минут и 59 секунд:
Sla, Вы были правы по поводу курсора.Запустил иначе - курсор стал пропадать.
Осталось последнее - выводить сообщение при нажатии правой или кнопкой мыши.Может,надоумите меня как это лучше всего сделать?
« Последнее редактирование: 24-09-2011 14:49 от demonhunterus » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 24-09-2011 15:06 » 

Конечно, можно сделать умное лицо и продолжить здесь общение, но я лентяй, тем более такой инфы в инете есть
например http://www.codenet.ru/progr/other/mouse.php
Кстати... там как раз мой совет использован (про функции)
Посмотри там про обработчик событий.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #18 : 24-09-2011 16:52 » 

Код:
#define MOUSE_MOVE_MASK 0x01
#define MOUSE_LBUTTON_PRESS 0x02
#define MOUSE_LBUTTON_RELEASE 0x04
#define MOUSE_RBUTTON_PRESS 0x08
#define MOUSE_RBUTTON_RELEASE 0x10
#define MOUSE_MBUTTON_PRESS 0x20
#define MOUSE_MBUTTON_RELEASE 0x40

static void far MouseStub () {
    asm {
    push ds // preserve ds
    push ax // preserve ax
    mov ax, seg CurHandler
    mov ds, ax
    pop ax // restore ax
    push dx // у
    push cx // x
    push bx // button state
    push ax // event mask
    call CurHandler
    add sp, 8 // clear stack
    pop ds
    }
    }

void SetMouseHandler ( MouseHandler h, int mask )
    {
    void far *p = MouseStub;
    CurHandler = h; asm {
    push es
    mov ax, OCh
    mov cx, mask
    les dx, p
    int 33h
    pop es
    }
    }

void ReraoveMouseHandler () {
    CurHandler = NULL;
    asm {
    mov ax, OCh
    mov cx, 0 int 33h } }
#pragma argsused void
WaitPress (int mask, int button, int x, int у) {
if (mask & MOUSE_RBUTTON_PRESS ) DoneFlag = 1;
}
SetMouseHandler ( WaitPress );
while ( !DoneFlag )
Мозг закипел.Не думал,что всё окажется настолько сложно.

Ну,на сколько я понял,вот это проверка на заданное условие
Код:
if (mask & MOUSE_RBUTTON_PRESS ) DoneFlag = 1
Я уже примерно вижу,что это будет в конечном итоге.Что-то типа
Код:
...if (mask & MOUSE_RBUTTON_PRESS ) 
printf ("Нажата правая кнопка мыши");
DoneFlag = 1;
if (mask & MOUSE_LBUTOON_PRESS)
printf ("Нажата левая кнопка мыши");
DoneFlag = 1;
...

Правда разобраться с функциями,описаными выше,не могу.
Ну вот,скажем,происходит проверка текущей маски с маской,которую написали в #define.
А каким образом получаем текущую маску?Вот эту самую int mask.Или вот тут
Код:
void SetMouseHandler ( MouseHandler h, int mask )

что за MouseHandler h и опять же откуда берется int mask?
Ладно,буду пытаться разобраться.Если кто поможет буду благодарен
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 24-09-2011 17:19 » 

ну давай разбираться, только по частям?

Какая идея всего этого?

1. Есть функция в драйвере мыши, которая позволяет создать свой обработчик событий при изменение состояния мыши.
2. Пишем эту функцию (какую? это должен сказать ты)
3. И ждем-с события мыши.

зы. Попытался разбить на части - вопросы по частям.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #20 : 24-09-2011 18:08 » 

Мммм.
0Сh - Установить обработчик событий.
Вход:
AX = 000Ch
ES:DX = адрес обработчика
CX = условие вызова
бит 0 - любое перемещение мыши
бит 1 - нажатие ЛКМ
бит 2 - отпускание ЛКМ
бит 3 - нажатие ПКМ
бит 4 - отпускание ПКМ
бит 5 - нажатие средней КМ
бит 6 - отпускание средней КМ
СХ=0000h - отменить обработчик.
Нашел это.Это оно?Я так понимаю, 03h позволит выполнить мне запрос и вывод если клавиша нажата только при использовании цикла типа (while !kbhit()),что повлечет за собой постоянный вызов прерывания,пока не нажму клавишу на клавиатуре...
(а может есть способ сделать это проще?скажем,вот этот цикл,а при нажатии на кнопку мыши (левую,правую,среднюю),делаем паузу и выходим из цикла?Ну это так.Для себя.Вдруг дойдет как это так красивенько сделать,чтоб не лезть в дебри 0Сh)
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 24-09-2011 18:17 » 

гляди
Код:
void SetMouseHandler ( MouseHandler h, int mask )
    {
    void far *p = MouseStub;
    CurHandler = h; asm {
    push es
    mov ax, OCh
    mov cx, mask
    les dx, p
    int 33h
    pop es
    }
    }
Сопоставь со своей информацией...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #22 : 24-09-2011 18:23 » 

Код:
void SetMouseHandler ( MouseHandler h, int mask )
    {
    void far *p = MouseStub;
    CurHandler = h;
    asm {
    push es
    mov ax, OCh
    mov cx, mask
    les dx, p
    int 33h
    pop es
    }
    }
push es --- запоминаем значение es
mov ax,0ch --- на входе AX = 000Ch
mov cx,mask --- cx = условие вызова,маска
les dx, p --- не знаю,что такое
int 33h --- прерывание 33h
pop es --- возвращаем запомненое значение es

void SetMouseHandler ( MouseHandler h, int mask ) --- не понимаю,откуда берет и что за MouseHandler h и как выбирает значение int mask
les dx, p --- не знаю,что такое
void far *p = MouseStub;
CurHandler = h;          --- и вот это тоже не понятно мне
 
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 24-09-2011 18:40 » 

Код:
void SetMouseHandler ( MouseHandler h, int mask )
    {
--->    void far *p = MouseStub;
|    CurHandler = h; asm {
|    push es
|    mov ax, OCh
|    mov cx, mask
--->    les dx, p
    int 33h
    pop es
    }
    }

Не понял?

MouseHandler - этот тип описан в самом  начале (см ссылку)
« Последнее редактирование: 24-09-2011 18:43 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #24 : 24-09-2011 19:42 » 

Я скорее допишу это дело простым(ну,на мой взгляд)способом,чем разберусь в 0сh.
Вот до чего дошел
Код:
case 5:
                 {
                   clrscr();
                   while(!kbhit()) {
                   asm {
                        mov AX,3;
                        int 0x33;
                        mov BUT,BX;
                        }
                   for (i=0;i<3;i++)
                   {
                     if (mask&BUT)
                        {
                         if (i==0)
                         printf ("Left Mouse Button Is Pressed\n");
                         if (i==1)
                         printf ("Right Mouse Button Is Pressed\n");
                         if (i==2)
                         printf ("Middle Mouse Button Is Pressed\n");
                        }
                     mask=mask<<1;
                   }
                                    }

                   break;
                   }
и ещё вот так вот
Код:
do {
     for(i=0;i<3;i++)
     {
       if (mask & BUT)
         {
          if (i==0)
          printf ("Left Mouse Button\n");
          if (i==1)
          printf ("Right Mouse Button\n");
          if (i==2)
          printf ("Middle Mouse Button\n");
         }
      mask=mask<<1;
     }
   }
while(!kbhit());
Может увидите ошибку?Хочется уже добить этот пункт с помощью того же while(!kbhit())
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 24-09-2011 20:12 » 

слабак
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #26 : 25-09-2011 07:32 » 

Ну,слабак не слабак,просто мыслю иначе Отлично
Всё-таки добил это дело.
Получилось примерно так.
Код:
switch (key)
        {
            case 5:
                 {
                  METKA: clrscr();
                   do {    mask=1;

                     asm { mov AX,3;
                           int 0x33;
                           mov BUT,BX; }

                           for (i=0;i<3;i++) {

                           if (mask & BUT) {
                              if (i==0) {
                              printf("Left Mouse Button Was Pressed\n");
                              getch();
                              goto METKA;}
                              if (i==1) {
                              printf("Right Mouse Button Was Pressed\n");
                              getch();
                              goto METKA; }
                              if (i==2)
                              printf("Middle Mouse Button Was Pressed\n");
                              }
                              mask <<=1 ;
                                              }
                          }
                   while(!kbhit());
                       break;
                      }
Правда,только для нажатия правой и левой кнопки мыши.
При дописывании кода до такого вида
Код:
if (i==2) {
       printf("Middle Mouse Button Was Pressed\n");
       getch();
       goto METKA;
}
программа отказывается распознавать какие-либо нажатия на кнопку мыши.Пытаюсь разобраться что за нафиг.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 25-09-2011 08:27 » 

Код:
                          for (i=0;i<3;i++) {

                           if (mask & BUT) {
                              if (i==0) {
                              printf("Left Mouse Button Was Pressed\n");
                              getch();
                              goto METKA;}
                              if (i==1) {
                              printf("Right Mouse Button Was Pressed\n");
                              getch();
                              goto METKA; }
                              if (i==2)
                              printf("Middle Mouse Button Was Pressed\n");
                              }
                              mask <<=1 ;
                                              }
                          }
Ты понимаешь что делается в этом цикле?
Можно ли этот цикл превратить в конструкцию
switch case?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #28 : 25-09-2011 09:25 » 

Выполняем побитовое сравнение mask и BUT,со сдвигом mask влево на 1.
При попадании - выходим на начало (goto Metka).
Ммм.

Код:
for (i=0;i<3;i++) {
if (!mask & BUT)  //Ммм.Точно не знаю,как задать.Если просто if (mask & BUT),то это то же самое,что if (mask & BUT == True),а вот как задать в короткой форме if (mask & BUT == False) не помню
mask <<=1 ;
else {
switch (i)
{
 case 0:
        { printf("Left Mouse Button Was Pressed\n");
          break; }
 case 1:
        { printf("Right Mouse Button Was Pressed\n");
          break; }
 case 2:
        { printf("Middle Mouse Button Was Pressed\n");
          break; }
}

}
Ну как-то так

 
« Последнее редактирование: 25-09-2011 10:24 от demonhunterus » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 25-09-2011 13:06 » 

нарисуй "таблицу истинности" цикла.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #30 : 25-09-2011 13:34 » 

Начало цикла
  Если результат mask & BUT не true
  Делаем смещение маски на 1 влево
  В противном случае (если true)
  Печатаем вариант,соответствующий текущему значению i
Выход из цикла
Как-то так по-моему.  
Хотя намудрил что-то.

Код:
for (i=0;i<3;i++) {
if (mask & BUT)
switch (i) {
case 0:
        { printf("Left Mouse Button Was Pressed\n");
          break; }
 case 1:
        { printf("Right Mouse Button Was Pressed\n");
          break; }
 case 2:
        { printf("Middle Mouse Button Was Pressed\n");
          break; }
}
mask=mask<<1 }
Сейчас проверю
« Последнее редактирование: 25-09-2011 13:40 от demonhunterus » Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #31 : 25-09-2011 13:45 » 

первый шаг mask = 1
mask && BUT - ?

продолжи.... (еще два шага)

зы чего хочу? Избавиться от цикла.
« Последнее редактирование: 25-09-2011 13:47 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #32 : 25-09-2011 13:47 » 

Код:
                           for (i=0;i<3;i++)
                             {
                              if (mask & BUT)
                                  switch (i)
                                   {
                                    case 0:
                              { printf("Left Mouse Button Was Pressed\n");
                                break; }
                                    case 1:
                              { printf("Right Mouse Button Was Pressed\n");
                                break; }
                                    case 2:
                              { printf("Middle Mouse Button Was Pressed\n");
                                break; }
                                    }
                           mask=mask<<1;
                            }
Вот так работает.
Но опять же
Код:
for (i=0;i<3;i++)
                             {
                              if (mask & BUT)
                                  switch (i)
                                   {
                                    case 0:
                              { printf("Left Mouse Button Was Pressed\nPress Any Key To Return To Menu\n");
                                getch();
                                goto METKA; }
                                    case 1:
                              { printf("Right Mouse Button Was Pressed\nPress Any Key To Return To Menu\n");
                                getch();
                                goto METKA; }
                                    case 2:
                              { printf("Middle Mouse Button Was Pressed\nPress Any Key To Return To Menu\n");
                                getch();
                                goto METKA; }
                                    }
                           mask=mask<<1;
                            }
 при использовании трех GoTo не хочет работать.При двух - работает.При трех - ни в какую.


Ааа.Избавиться от цикла.Хм.
mask=1
mask & BUT  - ну вернет true или false.если false надо mask<<=1 и снова mask & BUT.Если true - узнать какая маска была в этот момент и в соответствии с этим значением вывести сообщение о нажатой клавише...Как-то так...

Что-то я совсем запутался.
Что два шага осталось,это хорошо,но я не понял что имелось ввиду тут "mask && BUT - ?"
« Последнее редактирование: 25-09-2011 14:03 от demonhunterus » Записан
demonhunterus
Интересующийся

ua
Offline Offline

« Ответ #33 : 08-10-2011 06:23 » 

Решил проблему с помощью свич кейса
Код:
case 5:
                 {
                 int a=0;
                 do {

                     asm { mov AX,3;
                           int 0x33;
                           mov BUT,BX; }

                     if (a!=BUT)  {
                        switch(BUT) {
                        case 1:
                              printf("Left Mouse Button Was Pressed\n");
                              break;
                        case 2:
                              asm { MOV AH,2
                                    MOV DL,7
                                    int 0x21
                                     }
                              printf("Right Mouse Button Was Pressed\n");
                              break;
                        case 4:
                              printf("Middle Mouse Button Was Pressed\n");
                              break;
                              }

                            }
                   a=BUT;
                   BUT=0; }

                   while(!kbhit());
                      }
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #34 : 08-10-2011 06:59 » 

>Решил проблему с помощью свич кейса
Вот-Вот. И код стал читабельным.

зы Для админов. Не склеивайте здесь два поста подряд.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines