u8 GetMouseKeyState(void) { u8 key_state=0; if(_IsKeyDown(VK_LBUTTON)) { key_state |= MK_LBUTTON; } if(_IsKeyDown(VK_RBUTTON)) { key_state |= MK_RBUTTON; } if(_IsKeyDown(VK_MBUTTON)) { key_state |= MK_MBUTTON; } return key_state; }
VOID CInputSystem::MouseTick(VOID) { //-------------------------------------------------------- //判断是否是Click的数据标准 const INT MAX_TIME_DRAG = 500; //ms //开始自动行走 const INT MOUSE_REPEAT_DOWN = 1000; //-------------------------------------------------------- //如果鼠标超出Client RECT rectClient; GetClientRect(g_hMainWnd, &rectClient); POINT ptTemp; ::GetCursorPos(&ptTemp); ::ScreenToClient(g_hMainWnd, &ptTemp); if(!::PtInRect(&rectClient, ptTemp) && ::GetCapture() != g_hMainWnd) { m_bMouseInClient = FALSE; return; } m_bMouseInClient = TRUE; //-------------------------------------------------------- // 保存原鼠标位置 m_ptMouseOld = m_ptMouse; //取得鼠标位置 m_ptMouse = m_ptMouseNow; { //保存原鼠标状态 m_dwMouseFlagOld = m_dwMouseFlag; m_dwMouseFlag = 0; //当前时间 UINT dwTimeNow = CGameProcedure::s_pTimeSystem->GetTimeNow(); //处理MouseMove BOOL bMouseMove = FALSE; if(m_ptMouseOld.x != m_ptMouseNow.x || m_ptMouseOld.y != m_ptMouseNow.y) { bMouseMove = TRUE; //保存鼠标 “移动” 事件 AddEvent(EVENT_MOUSE_MOVE); } //察看按键 if(_IsKeyDown(VK_LBUTTON)) m_dwMouseFlag |= MOUSE_LBDOWN; if(_IsKeyDown(VK_MBUTTON)) m_dwMouseFlag |= MOUSE_MBDOWN; if(_IsKeyDown(VK_RBUTTON)) m_dwMouseFlag |= MOUSE_RBDOWN; //左键按下的时间 static UINT s_timeMouseLDownTimeBegin = 0; static UINT s_timeMouseMDownTimeBegin = 0; static UINT s_timeMouseRDownTimeBegin = 0; static BOOL s_bLRepeatDownMode = FALSE; //---------------------------------------------------------------- //察看是否是Down if((m_dwMouseFlagOld & MOUSE_LBDOWN) == FALSE && (m_dwMouseFlag & MOUSE_LBDOWN)) { //保存鼠标DOWN事件 AddEvent(EVENT_MOUSE_LBDOWN); m_dwMouseFlag |= MOUSE_LBCLICK; m_ptMouseLDown = m_ptMouseNow; //记录时间 s_timeMouseLDownTimeBegin = dwTimeNow; s_bLRepeatDownMode = FALSE; //CGameProcedure::s_pGfxSystem->PushDebugString("MouseDown"); } if((m_dwMouseFlagOld & MOUSE_MBDOWN) == FALSE && (m_dwMouseFlag & MOUSE_MBDOWN)) { //保存鼠标DOWN事件 AddEvent(EVENT_MOUSE_MBDOWN); m_dwMouseFlag |= MOUSE_MBCLICK; m_ptMouseMDown = m_ptMouseNow; //记录时间 s_timeMouseMDownTimeBegin = dwTimeNow; } if((m_dwMouseFlagOld & MOUSE_RBDOWN) == FALSE && (m_dwMouseFlag & MOUSE_RBDOWN)) { //保存鼠标DOWN事件 AddEvent(EVENT_MOUSE_RBDOWN); m_dwMouseFlag |= MOUSE_RBCLICK; m_ptMouseRDown = m_ptMouseNow; //记录时间 s_timeMouseRDownTimeBegin = dwTimeNow; } //---------------------------------------------------------------- //察看是否是Clicked if((m_dwMouseFlagOld & MOUSE_LBDOWN) && (m_dwMouseFlag & MOUSE_LBDOWN) == FALSE) { //计算时间 UINT dwTime = CGameProcedure::s_pTimeSystem->CalSubTime(s_timeMouseLDownTimeBegin, dwTimeNow); //如果鼠标位置没有移动,而且时间相隔较短(500ms) if( dwTime < MAX_TIME_DRAG && abs(m_ptMouseLDown.x-m_ptMouseNow.x) <= 4 && abs(m_ptMouseLDown.y-m_ptMouseNow.y) <= 4) { //保存鼠标UP事件 m_dwMouseFlag |= MOUSE_LBCLICKED; AddEvent(EVENT_MOUSE_LBCLICK); } AddEvent(EVENT_MOUSE_LBUP); s_bLRepeatDownMode = FALSE; } if((m_dwMouseFlagOld & MOUSE_MBDOWN) && (m_dwMouseFlag & MOUSE_MBDOWN) == FALSE) { //计算时间 UINT dwTime = CGameProcedure::s_pTimeSystem->CalSubTime(s_timeMouseMDownTimeBegin, dwTimeNow); //如果鼠标位置没有移动,而且时间相隔较短(500ms) if( dwTime < MAX_TIME_DRAG) { //保存鼠标UP事件 m_dwMouseFlag |= MOUSE_MBCLICKED; AddEvent(EVENT_MOUSE_MBCLICK); } AddEvent(EVENT_MOUSE_MBUP); } if((m_dwMouseFlagOld & MOUSE_RBDOWN) && (m_dwMouseFlag & MOUSE_RBDOWN) == FALSE) { //计算时间 UINT dwTime = CGameProcedure::s_pTimeSystem->CalSubTime(s_timeMouseRDownTimeBegin, dwTimeNow); //如果时间相隔较短(500ms) if( dwTime < MAX_TIME_DRAG && abs(m_ptMouseRDown.x-m_ptMouseNow.x) <= 4 && abs(m_ptMouseRDown.y-m_ptMouseNow.y) <= 4) { //保存鼠标UP事件 m_dwMouseFlag |= MOUSE_RBCLICKED; AddEvent(EVENT_MOUSE_RBCLICK); } AddEvent(EVENT_MOUSE_RBUP); } //---------------------------------------------------------------- //处理拖动 //计算鼠标按下的时间 m_dwLBPutdownTime = 0; if((m_dwMouseFlag&MOUSE_LBDOWN)&&(m_dwMouseFlagOld&MOUSE_LBDOWN)) { m_dwLBPutdownTime = CGameProcedure::s_pTimeSystem->CalSubTime(s_timeMouseLDownTimeBegin, dwTimeNow); } //左键拖动事件 if( (m_dwMouseFlag & MOUSE_LBDOWN) && (m_dwMouseFlagOld & MOUSE_LBDOWN) ) //连续两帧以上保持按住状态 { if(bMouseMove) AddEvent(EVENT_MOUSE_LDRAG_MOVE); //左键长按 if(m_dwLBPutdownTime > MOUSE_REPEAT_DOWN) { AddEvent(EVENT_MOUSE_LBDOWNREPEAT); s_bLRepeatDownMode = true; } } //右键拖动事件 if( (m_dwMouseFlag & MOUSE_RBDOWN) && (m_dwMouseFlagOld & MOUSE_RBDOWN) ) { if(bMouseMove) AddEvent(EVENT_MOUSE_RDRAG_MOVE); } //审查是否是Double Click static UINT dwDblClk = ::GetDoubleClickTime(); if(m_dwMouseFlag & MOUSE_LBCLICKED) { static UINT dwCLicked = 0; if(dwTimeNow < dwCLicked + dwDblClk) { //保存鼠标 “双击” 事件 AddEvent(EVENT_MOUSE_LDBCLICK); m_dwMouseFlag |= MOUSE_LBDBLCLK; } dwCLicked = dwTimeNow; m_dwLBPutdownTime = 0; } if(m_dwMouseFlag & MOUSE_MBCLICKED) { static UINT dwCLicked = 0; if(dwTimeNow < dwCLicked + dwDblClk) { //保存鼠标 “双击” 事件 AddEvent(EVENT_MOUSE_MDBCLICK); m_dwMouseFlag |= MOUSE_MBDBLCLK; } dwCLicked = dwTimeNow; } if(m_dwMouseFlag & MOUSE_RBCLICKED) { static UINT dwCLicked = 0; if(dwTimeNow < dwCLicked + dwDblClk) { //保存鼠标 “双击” 事件 AddEvent(EVENT_MOUSE_RDBCLICK); m_dwMouseFlag |= MOUSE_RBDBLCLK; } dwCLicked = dwTimeNow; } //计算托拽盒 if(m_dwMouseFlag & MOUSE_RBCLICK) { //右键被按下 托拽框左上 m_rcRBDrag.left = m_ptMouse.x; m_rcRBDrag.top = m_ptMouse.y; } if(m_dwMouseFlagOld & MOUSE_RBCLICKED) { //右键抬起 m_rcRBDrag.right = m_ptMouse.x; m_rcRBDrag.bottom = m_ptMouse.y; } //滚轮 if(m_dwMouseFlagOld & MOUSE_WHEELUP) AddEvent(EVENT_MOUSE_WHEEL_UP); if(m_dwMouseFlagOld & MOUSE_WHEELDOWN) AddEvent(EVENT_MOUSE_WHEEL_DOWN); } }
void MouseInput(s32 x,s32 y,u32 key_state) { HWND hwnd; POINT pt; RECT rc; pt.x =x; pt.y =y; GDD_Lock(); hwnd =GetWindowFromPoint(&pt); //记录LButtonDown窗口. // LBUTTON if(key_state&MK_LBUTTON) { if(!_IsKeyDown(VK_LBUTTON)) { _SetKeyDown(VK_LBUTTON); HWND_LButton_Down =hwnd; //记录LButtonDown窗口. GetClientRectToScreen(hwnd,&rc); if(_PtInRect(&rc,&pt)) { LButton_Msg =MSG_LBUTTON_DOWN; _ScreenToClient(hwnd,&pt,1); //客户区使用客户坐标. } else { LButton_Msg =MSG_NCLBUTTON_DOWN; } PostMessage(hwnd,LButton_Msg,0,(pt.y<<16)|(pt.x)); } } else { if(_IsKeyDown(VK_LBUTTON)) { _SetKeyUp(VK_LBUTTON); hwnd =HWND_LButton_Down; if(LButton_Msg==MSG_LBUTTON_DOWN) { _ScreenToClient(hwnd,&pt,1); //客户区使用客户坐标. LButton_Msg =MSG_LBUTTON_UP; } else { LButton_Msg =MSG_NCLBUTTON_UP; } PostMessage(hwnd,LButton_Msg,0,(pt.y<<16)|(pt.x)); } } if((cursor_x!=x) || (cursor_y!=y)) { cursor_x =x; cursor_y =y; pt.x =x; pt.y =y; ScreenToClient(hwnd,&pt,1); PostMessage(hwnd,MSG_MOUSE_MOVE,key_state,(pt.y<<16)|(pt.x)); } GDD_Unlock(); }