class MSMessageMouse:public MouseDevice
{
private:
char ButtonState[8]; //сотояние кнопок мышки
HWND WndHandle;
int ox, oy; //Предыдущая позиция курсора
public:
stMSMessageMouse()
{
ZeroMemory(ButtonState, 8);
};
void Init(HWND h_Wnd)
{
WndHandle=h_Wnd;
//Возьмем начальную точку курсора
tagPOINT p;
GetCursorPos(&p);
ox=p.x;
oy=p.y;
};
void Done(){};
void ReadData(MouseInfo &Info)
{
MSG Msg;
int m=0;
int lX, lY;
while(PeekMessage(&Msg, WndHandle, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) && m<Info.MaxNum)
{
TranslateMessage(&Msg);
switch (Msg.message)
{
case WM_MOUSEMOVE:
//Мы будем оперировать не с глобальными координатами курсора
//как делает винда, а с пиращениями координат в каждый тик.
lX=LOWORD(Msg.lParam)-ox;
lY=HIWORD(Msg.lParam)-oy;
//заполним смещение по осям
Info.Axis[0]=lX;
Info.Axis[1]=lY;
Info.Axis[2]=0;
//Если мышка изменила координату по x, то добавим соответствующее сообщение
if(lX)
{
Info.Msg[m].Event=id_MoveX;
Info.Msg[m].Value=lX;
m++;
};
//Если мышка изменила координату по y, то добавим соответствующее сообщение
if(lY)
{
Info.Msg[m].Event=id_MoveY;
Info.Msg[m].Value=lY;
m++;
};
//Запомним координаты курсора для вычисления пиращения в следующем кадре
ox=LOWORD(Msg.lParam);
oy=HIWORD(Msg.lParam);
break;
//Для любителей Delphi6, там есть этот меседж и работает он только под NT, в cpp6 его нету.
// И как брать скролл я не знаю.
// case WM_MOUSEWHEEL:
// Info.Msg[m].Event=id_MoveZ;
// Info.Msg[m].Value=HIWORD(Msg.wParam);
// m++;
// break;
//
// Обработка кнопок. Поступаем точно так-же как и с клавиатурой,
// только тут для каждой кнопки свой меседж.
case WM_LBUTTONDOWN:
ButtonState[0]=1;
Info.Msg[m].Event=id_ButtonDown;
Info.Msg[m].Value=0;
m++;
break;
case WM_LBUTTONUP:
ButtonState[0]=0;
Info.Msg[m].Event=id_ButtonUp;
Info.Msg[m].Value=0;
m++;
break;
//Аналогично обрабатываются WM_RBUTTONUP, WM_RBUTTONDOWN, WM_MBUTTONUP и WM_MBUTTONDOWN..
//для WM_RBUTTON Value=1, а для WM_MBUTTON Value=2.
};
memcpy(Info.ButtonState, ButtonState, 8); //Передаем состояние кнопок.
Info.MsgNum=m;
};
};