|
发表于 2011-4-10 02:33:00
|
显示全部楼层
Re:鼠标与键盘输入应当采用何种方式处理?
void HaWinGameHost::UpdateInput(UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg)
{
case WM_KEYDOWN:
{
HaVirtualKey key = MappingKeyCode(wParam,it_Down);
_input._AddInputAction(key,(HaInputType)(it_KeboardAction|it_Down),0,0,(int16)lParam);
break;
}
case WM_KEYUP:
{
HaVirtualKey key = MappingKeyCode(wParam,it_Up);
_input._AddInputAction(key,(HaInputType)(it_KeboardAction|it_Up),0,0,0);
break;
}
case WM_LBUTTONDOWN:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
_input._AddInputAction(vk_LeftButton,(HaInputType)(it_MouseAction|it_Down),x,y,0);
break;
}
case WM_LBUTTONUP :
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
_input._AddInputAction(vk_LeftButton,(HaInputType)(it_MouseAction|it_Up),x,y,0);
break;
}
case WM_MBUTTONDOWN:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
_input._AddInputAction(vk_MiddleButton,(HaInputType)(it_MouseAction|it_Down),x,y,0);
break;
}
case WM_MBUTTONUP:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
_input._AddInputAction(vk_MiddleButton,(HaInputType)(it_MouseAction|it_Up),x,y,0);
break;
}
case WM_RBUTTONDOWN:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
_input._AddInputAction(vk_RightButton,(HaInputType)(it_MouseAction|it_Down),x,y,0);
break;
}
case WM_RBUTTONUP:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
_input._AddInputAction(vk_RightButton,(HaInputType)(it_MouseAction|it_Up),x,y,0);
break;
}
case WM_XBUTTONDOWN:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
int32 mask = (wParam & 0xffff);
if(mask == MK_XBUTTON1)
{
_input._AddInputAction(vk_XButton1,(HaInputType)(it_MouseAction|it_Down),x,y,0);
}
else if(mask == MK_XBUTTON2)
{
_input._AddInputAction(vk_XButton2,(HaInputType)(it_MouseAction|it_Down),x,y,0);
}
break;
}
case WM_XBUTTONUP:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
int32 mask = (wParam>>16);
if(mask == XBUTTON1)
{
_input._AddInputAction(vk_XButton1,(HaInputType)(it_MouseAction|it_Up),x,y,0);
}
else if(mask == XBUTTON2)
{
_input._AddInputAction(vk_XButton2,it_Down,x,y,0);
}
break;
}
case WM_MOUSEWHEEL:
{
int32 delta = (int16)(wParam>>16);
delta /=120;
_input._AddInputAction(vk_MouseWheel,(HaInputType)(it_MouseAction|it_MouseScroll),0,0,delta);
break;
}
case WM_MOUSEMOVE:
{
uint16 x = (uint16)lParam;
uint16 y = (lParam>>16);
_input._AddInputAction(vk_UndefinedKey,
(HaInputType)(it_MouseMove|it_MouseAction),x,y,0);
break;
}
}
}
--------------------------------
上面这段代码基本的输入消息类型都有了
初学用直接在一个线程里处理windows消息就可以了,可以有需要了再考虑用GetAsyncKeyState或者单独开一个线程处理输入
windows编程的书可以参考Programming Windows 5th Edition(Petzold)经典之作,看前面几章就ok了 |
|