On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение





Пост N: 39
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 17.10.06 11:17. Заголовок: Чтение состояния мыши


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


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 13 [только новые]


постоянный участник


Пост N: 226
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.10.06 11:38. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 40
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 17.10.06 14:52. Заголовок: Re:


Григорьев Владимир пишет:

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


Зато я хорошо интегрирован в Clipper 5.2e
А это сильная привязанность!

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 337
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.10.06 15:19. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 228
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 17.10.06 16:48. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 41
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 17.10.06 16:48. Заголовок: Re:


Pasha пишет:

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


А почему бессмысленно? Может, подойдет?
Какая библиотека?

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 338
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 17.10.06 17:43. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 42
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 17.10.06 18:33. Заголовок: Re:


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

Но тоже - все нажатия, а отпущена или отжата кнопка - нет.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 43
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 18.10.06 08:39. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 28
Зарегистрирован: 29.07.05
ссылка на сообщение  Отправлено: 18.10.06 10:01. Заголовок: Re:


примерно так:

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 )

лишнее удалить

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 339
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.10.06 14:19. Заголовок: Re:


файл 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


Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 340
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 18.10.06 14:22. Заголовок: Re:


Ой, еще нужен _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__();
}


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 45
Зарегистрирован: 06.06.06
ссылка на сообщение  Отправлено: 19.10.06 12:23. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2
Зарегистрирован: 23.10.06
ссылка на сообщение  Отправлено: 23.10.06 16:04. Заголовок: Re:


ort пишет:

 цитата:
Привет всем!
У меня возникла необходимость прочитать была ли отпущена кнопка мыши,
а функция StateMouse() возвращает коды лишь нажатых кнонок.



Очевидно, что если была нажата, а сейчас не нажата - то была отжата

повторюсь за кем-то - лично у меня отпускаение кнопки генерирует код, и даже УДЕРЖАНИЕ кнопки генерирует код, но бессмысленно рассказывать, как я это делаю)))

хотя.... можешь написать свою обертку вокруг той библиотеки) но при этом ты должен будешь переписать все стандартые функции

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 493
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет