Форум » Clipper » Чтение состояния мыши » Ответить

Чтение состояния мыши

ort: Привет всем! У меня возникла необходимость прочитать была ли отпущена кнопка мыши, а функция StateMouse() возвращает коды лишь нажатых кнонок. Использую библиотеку Clipper Vision Версия 2.0 (c) Copyright (c) 1995-1997 А.В.Зеленов. Кто знает, как прочитать это действие мыша?

Ответов - 13

Григорьев Владимир: Почему бы не использовать Clipper 5.3b? Там мышка хорошо интегрирована в систему.

ort: Григорьев Владимир пишет: Почему бы не использовать Clipper 5.3b? Там мышка хорошо интегрирована в систему. Зато я хорошо интегрирован в Clipper 5.2e А это сильная привязанность!

Pasha: Согласись, что никто не расскажет кроме автора самопальной библиотеки как в ней прочитать это событие мышки У меня к примеру это событие тоже определяется, но это в моем модуле, и мне бессмысленно рассказывать как я это делаю для твоего случая


Григорьев Владимир: Я думаю, в этой библиотеки, которую вы применяете, используется обычное прерывание 33h. Напишите сами обертку для функции этого прерывания, возвращающего состояние мыши.

ort: Pasha пишет: У меня к примеру это событие тоже определяется, но это в моем модуле, и мне бессмысленно рассказывать как я это делаю для твоего случая А почему бессмысленно? Может, подойдет? Какая библиотека?

Pasha: моя собственная :) Clipper Vision дается в сырцах ? если нет то вряд ли в нее что-либо можно встроить если да то не вопрос, дело техники я имел в виду свой модуль, естественно на С, и естественно через int 33 Но он жестко привязан к другим моим модулям, замена inkey

ort: Clipper Vision - исходников нету Когда-то я подключал мышиные функции через ASM: ms_state proc far ; функция ms_state()( без параметров ) ;возвращает следующие результаты (в регистре bx) : ;О - ни одна из клавиш не нажата ;1 - нажата левая клавиша ;2 - нажата правая клавиша ;4 - нажата средняя клавиша Stack_In mov ax,0003h int 33h Stack_Out push bx ; результат помещаем в стек call __retni ; возврат результата в Clipper pop bx ; восстановить стек call __ret ret ms_state endp Но тоже - все нажатия, а отпущена или отжата кнопка - нет.

ort: Pasha, пожалуйста, поделись кусочком кода, где обрабатываются нажатия и отжатия кнопок. Функцию я нашел - но никак не могу привести в рабочее соостояние.

les: примерно так: Static Function MouseKey( hBarMenu ) //Имитирует Clipper-функцию INKEY(0) с поддержкой клавиш прерывания и мыши. Local bKeyBlock, nKey DO WHILE .T. Ms_open() DO WHILE ( nKey := INKEY() ) == 0 .AND. Ms_getbt() <> 1 ENDDO Ms_close() IF nKey == 0 * Ожидание отпускания левой клавиши "мыши" Do While Ms_GetBt() > 0; EndDo ELSE IF ( (bKeyBlock := SETKEY(nKey) ) != NIL ) EVAL(bKeyBlock, PROCNAME(2), PROCLINE(2)) ELSE EXIT ENDIF ENDIF ENDDO Return( nKey ) лишнее удалить

Pasha: файл mouse.ch: #ifndef __HARBOUR__ #define M_LEFT 432 #define M_MIDDLE 436 #define M_RIGHT 434 #define MR_LEFT 433 #define MR_MIDDLE 437 #define MR_RIGHT 435 #define M_DOUBLE 438 #else #define M_LEFT 1002 #define M_MIDDLE 436 #define M_RIGHT 1004 #define MR_LEFT 1003 #define MR_MIDDLE 437 #define MR_RIGHT 1005 #define M_DOUBLE 1006 #endif Файл _mouse.c (для Turbo C) #include <dos.h> #include "extend.h" #include "mouse.ch" void _kbdsend(int); int Mouse = 0, /* Mouse presence */ MousePtr = 0, /* Mouse cursor */ MouseRl = 0, /* Mouse button released*/ MouseX, /* X coordinate */ MouseY, /* Y coordinate */ MaxRow = 24, /* Maximum Y coordinate */ MaxCol = 79, /* Maximum X coordinate */ doubleClick = 0; // двойное нажатие long timerTick = 0; CLIPPER MouseXPos() {_retni(MouseX);} CLIPPER MouseYPos() {_retni(MouseY);} /****************************************************************/ /* InitMouse - начальная инициализация */ /****************************************************************/ CLIPPER InitMouse() { _AX = 0; __int__(0x33); /* Initialize mouse */ if(_AX == 0xFFFF) { Mouse = 1; _AX = 0xA; _BX = 0; _CX = 0xFFFF; _DX = 0x7700; __int__(0x33); } _AH = 0x0F; __int__(0x10); (char) MaxCol = _AH - 1; _ES = 0x40; MaxRow = *(char _es *) 0x84; if(MaxRow == 0) MaxRow = 24; if(Mouse) { _DX = MaxCol*8; _AX = 7; _CX = 0; __int__(0x33); _DX = MaxRow*8; _AX = 8; _CX = 0; __int__(0x33); } } CLIPPER QueryPos() { if(Mouse) { _AX = 3; __int__(0x33); MouseX = _CX/8; MouseY = _DX/8; } } /****************************************************************/ /* MouseBut - возвращает состояние клавиш мышки */ /****************************************************************/ CLIPPER MouseBut() { int ret_val; if(Mouse) { _AX = 3; __int__(0x33); if(_BX & 7) { MouseX = _CX/8; MouseY = _DX/8; } ret_val = _BX; } else ret_val = 0; _retni(ret_val); } /****************************************************************/ /* ShowMouse - установить курсор "мышь" */ /****************************************************************/ CLIPPER ShowMouse() { if(Mouse && ! MousePtr) { _AX = 0x1D; _BX = 0; __int__(0x33); /* Set display page */ _AX = 1; __int__(0x33); /* Display mouse pointer */ MousePtr = 1; } } /****************************************************************/ /* HideMouse - спрятать курсор "мышь" */ /****************************************************************/ CLIPPER HideMouse() { if(Mouse && MousePtr) { _AX = 2; __int__(0x33); /* Hide mouse pointer */ MousePtr = 0; } } /****************************************************************/ /* ResetButton - задержка до отжатия мышки */ /****************************************************************/ CLIPPER ResetBut() { if(Mouse) do { _AX = 3; __int__(0x33); /* Query buttons */ } while(_BX & 3); } void _loadds mouseInt() #pragma saveregs { static unsigned kbCodes[] = {0xB000,0xB100,0xB200,0xB300,0xB400,0xB500,0xB600}; unsigned bitMask = _AX; int i; MouseX = _CX/8; MouseY = _DX/8; if(bitMask & 2) { _ES = 0x40; doubleClick = ((*(long _es *) 0x6C) - timerTick <= 8); if(doubleClick) bitMask |= 0x80; timerTick = *(long _es *) 0x6C; } for(i = 0; i < 7; i++) if( (bitMask >>= 1) & 1 ) _kbdsend( kbCodes ); } CLIPPER MouseEvent() { int lOnOff = _parl(1); if(Mouse) { if(lOnOff) { _ES = _CS; _DX = (unsigned) &mouseInt; _CX = 0x7E; } else _CX = 0; _AX = 0x0C; __int__(0x33); } } /* Функция MouseInBar // Назначение: проверяет, попадает ли курсор мышки // в область row:col ... row:col+len // Возвращает: Логическое значение */ CLIPPER MouseInBar() { int row = _parni(1), col = _parni(2), len = _parni(3); _retl(MouseY == row && MouseX >= col && MouseX < col + len); } Файл _event.prg: Вместо Inkey() использовать GetEvent() #include "mouse.ch" #ifndef _fw STATIC MouseRls FUNCTION GetEvent_ // ------------------------------------------------------------- // Event - ожидание события клавиатуры и мышки // ------------------------------------------------------------- LOCAL nKey ShowMouse() MouseRls = 0 while (nKey := InMouse()) == 0 enddo HideMouse() RETURN nKey FUNCTION InMouse() // ------------------------------------------------------------- // Проверка нажатия клавиши мышки или клавиатуры // ------------------------------------------------------------- LOCAL nKey IF (nKey := InKey()) == 0 nKey = GetButton() ENDIF RETURN nKey Function WhileEvent // ------------------------------------------------------------- // Задержка до нажатия клавиши с курсором мышки // Буфер клавиатуры не очищается !!! // ------------------------------------------------------------- Local nKey := 0 ShowMouse() while nKey == 0 IF (nKey := NextKey()) == 0 nKey = GetButton() ENDIF enddo HideMouse() Return nKey Function GetButton // ------------------------------------------------------------- // Опрос нажатия клавиши мышки // ------------------------------------------------------------- Local Buttons := MouseBut(), nKey IF ISBIT(Buttons, 1) nKey = M_LEFT ELSEIF ISBIT(Buttons, 2) nKey = M_RIGHT ELSEIF ISBIT(Buttons, 3) nKey = M_MIDDLE ELSE nKey = 0 MouseRls = 1 ENDIF Return nKey FUNCTION MouseRls RETURN MouseRls #endif Function GetEvent(nDelay) Local nKey #ifndef _fw ShowMouse() IF nDelay != NIL #ifndef __HARBOUR__ MouseEvent(.t.) nKey = Inkey(nDelay) MouseEvent(.f.) #else nKey = Inkey(nDelay, 255) #endif ELSE nKey = InKey() ENDIF HideMouse() #endif Return nKey

Pasha: Ой, еще нужен _kbdsend.c Тут один модуль цепляет следующий :) #include <dos.h> void far pascal kbdsend() { _kbdsend(_parni(1)); _ret(); } _kbdsend(int keycode) { int head, tail, wadr; _ES = 0x40; __cli__(); head = *(unsigned _es *) 0x1A; wadr = tail = *(unsigned _es *) 0x1C; if((tail += 2) == *(unsigned _es *) 0x82) tail = *(unsigned _es *) 0x80; if(tail != head) { *(unsigned _es *) wadr = keycode; *(unsigned _es *) 0x1C = tail; } __sti__(); }

ort: Pasha, огромное спасибо за помощь!!! Уже разобрался, как приручить МЫШКУ!

suv: ort пишет: Привет всем! У меня возникла необходимость прочитать была ли отпущена кнопка мыши, а функция StateMouse() возвращает коды лишь нажатых кнонок. Очевидно, что если была нажата, а сейчас не нажата - то была отжата повторюсь за кем-то - лично у меня отпускаение кнопки генерирует код, и даже УДЕРЖАНИЕ кнопки генерирует код, но бессмысленно рассказывать, как я это делаю))) хотя.... можешь написать свою обертку вокруг той библиотеки) но при этом ты должен будешь переписать все стандартые функции



полная версия страницы