예제 #1
0
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;
}
예제 #2
0
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);
	}
}
예제 #3
0
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();
}