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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ASM' клик мышки VS getch();  (Прочитано 15166 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FallenSoul
Опытный

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

« : 21-10-2007 07:48 » 

Добрый день, еще один вопрос ...

Вот отрывок функций для работы с мышью, где сама работа осуществляется через значения bo(0-nothing happen,1-left click,2-right 0click,3-right+left click),co(x coordinate),ro(y coordinate)

Цитата
int mouse_init(void)
{
 int result;
 asm {
   mov ax,00h;
   int 33h;
   mov result,ax;
     }
 return(result);
}

void mouse_show(void)
{
 asm {
   mov ax,01h;
   int 33h;
 }
}

void mouse_hide(void)
{
 asm {
   mov ax,02h;
   int 33h;
 }
}

unsigned int co,ro,bo;
/* This fuction is to return the
      mouse information
      bo = mouse button
      ro = the y position of the mouse cursor
      co = the x position of the mouse cursor */
void mouse_info(void)
{
asm {
    mov ax,03h;
    int 33h;
    mov bo,bx;
    mov ro,dx;
    mov co,cx;
    }
}

И вот отрывок который выдаёт в текстовом режиме БС++ 3.1 псевдографикой окошко вида : Вы действительно хотите удалить данную запись ? (Да/Нет)

Цитата
  char*Del_Race[]={
                 {"╔══════════════════════════════╗\n"},
                 {"║ Вы действительно хотите      ║\n"},
                 {"║ удалить найденый авиарейс  ? ║\n"},
                 {"╠══════════════════════════════╣\n"},
                 {"║ ┌───────────┐  ┌───────────┐ ║\n"},
                 {"║ │    Yes    │  │    No     │ ║\n"},
                 {"║ └───────────┘  └───────────┘ ║\n"},
                 {"╚══════════════════════════════╝\n"}
                };

   for(int i=0;i<8;i++)
   {
    gotoxy(36,19+i);
    cout<<Del_Race[ i];
   }
  mouse_init();
  mouse_show();
  int c;
  while(u==1)
   {
    mouse_info();
    if(bo==1 && co>=300 && co<=395 && ro>=178 && ro<=195 || getch()==13) // Acce
pt
     {
      //Delete
     }
    if(bo==1 && co>=418 && co<=518 && ro>=177 && ro<=192 || getch()==27) // Canc
el
     {
      // Cancel delete
     }
   }

В условных операторах отслеживаются клики в областях кнопок Да/Нет и дополнительно добавлена обработка на Ентер(Да) и Ескейп(Нет). Проблема в том, что при такой постановке getch() обработка на клик мыши не работает. Если гетч закоментировать, то прекрасно работает. Можно как-то поправить?
« Последнее редактирование: 21-10-2007 09:15 от Алексей1153++ » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #1 : 21-10-2007 08:26 » 

FallenSoul, наверное тебе нужен опрос кнопок без ожидания ввода.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
FallenSoul
Опытный

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

« Ответ #2 : 21-10-2007 08:32 » 

Не совсем понял что имелось ввиду.
Точнее понял, но не понял как реализовать. Жаль Я пока знаю как сделать только мышку или только клавиши ентер/ескейп, а как совместить это воедино (либо клавиши без гетча описать, либо дописать ассемблеровский код как-то на другую реализацию кликов) не знаю =\
Записан
FallenSoul
Опытный

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

« Ответ #3 : 21-10-2007 11:44 » 

Еще хотелось бы решить такую проблему  чтоб сделать алтернативный выбор в меню (клики на кнопки, или нажатие 1,2,3,4,5 на клавиатуре) Жаль Курсовая ...
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 21-10-2007 18:22 » 

Делаеш что то типа этого
Код:
typedef bool (__stdcall *TSetQuery)(int , int , int, int);
// Первый параметр от кого (клавиатура или мыш), второй третий и четвертый параметры сообшения
#define evt_mouse 1
#define evt_keyboard 2

TSetQuery Query=NULL;

bool __stdcall FirstQuery(int event, int messageA, int messageB, int messageC)
{
    bool res=false; // Возрашаем false если нам не нужно прерывать ход выполнения программы
    switch (event)
    {
       case evt_mouse:
          //тута мыша была
          break;
       case evt_keyboard:
          //тут клавишу жмякали
          break;
    }
    return res;
}

int main()
{
   bool quit=false;
   Query=FirstQuery;
   while (!quit)
   {
      //тут производим быстрый опрос клавиатуры,
      if ("если есть событие от клавиатуры")
      {
          if (Querry != NULL) quit |=Query(evt_keyboard,........);
      }
      //тут опрос мыши
      if ("если есть событие от мыши")
      {
          if (Querry != NULL) quit |=Query(evt_mouse,........);
      }
      sleep(1); //Спим чуть чуть
   }
   return 0;
}
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

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

« Ответ #5 : 21-10-2007 18:58 » 

Ничего не понял что произошло в посте выше Жаль

2Преподователь вроде говорил что bool и события не поддерживаются в досе и компиляторе 3.1
« Последнее редактирование: 21-10-2007 19:02 от FallenSoul » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 21-10-2007 18:59 » 

Конкретнее можно? Что именно не понятно.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

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

« Ответ #7 : 21-10-2007 19:03 » 

Цитата
typedef bool (__stdcall *TSetQuery)(int , int , int, int);

__stdcall - не понятное слово
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 21-10-2007 19:07 » 

Это слово говорит компилятору, как нужно компоновать функцию. Именно данное слово как правило используется для функций обратного вызова. В Borland С++ может быть такой синоним stdcall. Более конкретно надо смотреть в Help. Скорее всего ключевое слово будет Callback function
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #9 : 21-10-2007 19:16 » 

Код:
2Преподователь вроде говорил что bool и события не поддерживаются в досе и компиляторе 3.1
События ты сам формируеш, опрашивая в цикле клавиатуру и мыш. В принципе Винда вочти тоже самое делает, только у нее масштабы другие. Насчет bool. Помоему это стандартный для C++ тип. Хотя я сталкивался с тем, что задания с ним не принимали. Но в принципе его можно заменить на int. Чуть изменив логику выхода из цикла.
« Последнее редактирование: 21-10-2007 19:18 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
FallenSoul
Опытный

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

« Ответ #10 : 26-10-2007 14:51 » 

На самом деле решение проблемы нашел через bioskey(0), bioskey(1).
bioskey(1) проверяет нажатие клавиши, не прерывая работы программы и если клавиша была нажата то bioskey(0) возвращает её ASCII код при следующем вызове. Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines