329 lines
11 KiB
C++
329 lines
11 KiB
C++
#include"WinWindow.h"
|
|
#include<hgl/platform/InputDevice.h>
|
|
#include<Windows.h>
|
|
|
|
#ifdef _DEBUG
|
|
#include<hgl/log/LogInfo.h>
|
|
#endif//_DEBUG
|
|
|
|
namespace hgl
|
|
{
|
|
namespace
|
|
{
|
|
static KeyboardButton KeyConvert[256];
|
|
static void (*WMProc[2048])(WinWindow *,uint32,uint32); //消息处理队列
|
|
|
|
uint32 GetMouseKeyFlags(uint32 wflags)
|
|
{
|
|
uint32 flag=0;
|
|
|
|
if(wflags&MK_LBUTTON)flag|=mbLeft;
|
|
if(wflags&MK_RBUTTON)flag|=mbRight;
|
|
if(wflags&MK_MBUTTON)flag|=mbMid;
|
|
|
|
if(wflags&MK_XBUTTON1)flag|=mbX1;
|
|
if(wflags&MK_XBUTTON2)flag|=mbX2;
|
|
|
|
if(wflags&MK_SHIFT )flag|=mbShift;
|
|
if(wflags&MK_CONTROL)flag|=mbCtrl;
|
|
|
|
return(flag);
|
|
}
|
|
|
|
void InitKeyConvert()
|
|
{
|
|
int i;
|
|
|
|
memset(KeyConvert,0,sizeof(KeyConvert));
|
|
|
|
KeyConvert[VK_ESCAPE ]=kbEsc;
|
|
for(i=VK_F1;i<=VK_F12;i++)KeyConvert[i]=(KeyboardButton)(kbF1+i-VK_F1);
|
|
|
|
KeyConvert['`' ]=kbGrave;
|
|
for(i='0';i<='9';i++)KeyConvert[i]=(KeyboardButton)(kb0+i-'0');
|
|
KeyConvert['-' ]=kbMinus;
|
|
KeyConvert['=' ]=kbEquals;
|
|
KeyConvert['\\' ]=kbBackSlash;
|
|
KeyConvert[VK_BACK ]=kbBackSpace;
|
|
|
|
KeyConvert[VK_TAB ]=kbTab;
|
|
KeyConvert['Q' ]=kbQ;
|
|
KeyConvert['W' ]=kbW;
|
|
KeyConvert['E' ]=kbE;
|
|
KeyConvert['R' ]=kbR;
|
|
KeyConvert['T' ]=kbT;
|
|
KeyConvert['Y' ]=kbY;
|
|
KeyConvert['U' ]=kbU;
|
|
KeyConvert['I' ]=kbI;
|
|
KeyConvert['O' ]=kbO;
|
|
KeyConvert['P' ]=kbP;
|
|
KeyConvert['[' ]=kbLeftBracket;
|
|
KeyConvert[']' ]=kbRightBracket;
|
|
|
|
KeyConvert[VK_CAPITAL ]=kbCapsLock;
|
|
KeyConvert['A' ]=kbA;
|
|
KeyConvert['S' ]=kbS;
|
|
KeyConvert['D' ]=kbD;
|
|
KeyConvert['F' ]=kbF;
|
|
KeyConvert['G' ]=kbG;
|
|
KeyConvert['H' ]=kbH;
|
|
KeyConvert['J' ]=kbJ;
|
|
KeyConvert['K' ]=kbK;
|
|
KeyConvert['L' ]=kbL;
|
|
KeyConvert[';' ]=kbSemicolon;
|
|
KeyConvert['\'' ]=kbApostrophe;
|
|
KeyConvert[VK_RETURN ]=kbEnter;
|
|
|
|
KeyConvert[VK_LSHIFT ]=kbLeftShift;
|
|
KeyConvert['Z' ]=kbZ;
|
|
KeyConvert['X' ]=kbX;
|
|
KeyConvert['C' ]=kbC;
|
|
KeyConvert['V' ]=kbV;
|
|
KeyConvert['B' ]=kbB;
|
|
KeyConvert['N' ]=kbN;
|
|
KeyConvert['M' ]=kbM;
|
|
KeyConvert[',' ]=kbComma;
|
|
KeyConvert['.' ]=kbPeriod;
|
|
KeyConvert['/' ]=kbSlash;
|
|
KeyConvert[VK_RSHIFT ]=kbRightShift;
|
|
|
|
KeyConvert[VK_LCONTROL ]=kbLeftCtrl;
|
|
KeyConvert[VK_LWIN ]=kbLeftOS;
|
|
KeyConvert[VK_LMENU ]=kbLeftAlt;
|
|
KeyConvert[VK_SPACE ]=kbSpace;
|
|
KeyConvert[VK_RMENU ]=kbRightAlt;
|
|
KeyConvert[VK_RWIN ]=kbRightOS;
|
|
KeyConvert[VK_RCONTROL ]=kbRightCtrl;
|
|
|
|
KeyConvert[VK_PAUSE ]=kbPause;
|
|
// KeyConvert[VK_CLEAR ]=kbClear;
|
|
|
|
KeyConvert[VK_NUMPAD0 ]=kbNum0;
|
|
KeyConvert[VK_NUMPAD1 ]=kbNum1;
|
|
KeyConvert[VK_NUMPAD2 ]=kbNum2;
|
|
KeyConvert[VK_NUMPAD3 ]=kbNum3;
|
|
KeyConvert[VK_NUMPAD4 ]=kbNum4;
|
|
KeyConvert[VK_NUMPAD5 ]=kbNum5;
|
|
KeyConvert[VK_NUMPAD6 ]=kbNum6;
|
|
KeyConvert[VK_NUMPAD7 ]=kbNum7;
|
|
KeyConvert[VK_NUMPAD8 ]=kbNum8;
|
|
KeyConvert[VK_NUMPAD9 ]=kbNum9;
|
|
|
|
KeyConvert[VK_DECIMAL ]=kbNumDecimal;
|
|
KeyConvert[VK_DIVIDE ]=kbNumDivide;
|
|
KeyConvert[VK_MULTIPLY ]=kbNumMultiply;
|
|
KeyConvert[VK_SUBTRACT ]=kbNumSubtract;
|
|
KeyConvert[VK_ADD ]=kbNumAdd;
|
|
|
|
KeyConvert[VK_UP ]=kbUp;
|
|
KeyConvert[VK_DOWN ]=kbDown;
|
|
KeyConvert[VK_LEFT ]=kbLeft;
|
|
KeyConvert[VK_RIGHT ]=kbRight;
|
|
|
|
KeyConvert[VK_INSERT ]=kbInsert;
|
|
KeyConvert[VK_DELETE ]=kbDelete;
|
|
KeyConvert[VK_HOME ]=kbHome;
|
|
KeyConvert[VK_END ]=kbEnd;
|
|
KeyConvert[VK_PRIOR ]=kbPageUp;
|
|
KeyConvert[VK_NEXT ]=kbPageDown;
|
|
|
|
KeyConvert[VK_NUMLOCK ]=kbNumLock;
|
|
KeyConvert[VK_SCROLL ]=kbScrollLock;
|
|
|
|
//KeyConvert[VK_SHIFT ]=kbLeftShift;
|
|
//KeyConvert[VK_CONTROL ]=kbLeftCtrl;
|
|
//KeyConvert[VK_MENU ]=kbLeftAlt;
|
|
|
|
KeyConvert[VK_OEM_1 ]=kbSemicolon;
|
|
KeyConvert[VK_OEM_PLUS ]=kbEquals;
|
|
KeyConvert[VK_OEM_COMMA ]=kbComma;
|
|
KeyConvert[VK_OEM_MINUS ]=kbMinus;
|
|
KeyConvert[VK_OEM_PERIOD]=kbPeriod;
|
|
KeyConvert[VK_OEM_2 ]=kbSlash;
|
|
KeyConvert[VK_OEM_3 ]=kbGrave;
|
|
KeyConvert[VK_OEM_4 ]=kbLeftBracket;
|
|
KeyConvert[VK_OEM_5 ]=kbBackSlash;
|
|
KeyConvert[VK_OEM_6 ]=kbRightBracket;
|
|
KeyConvert[VK_OEM_7 ]=kbApostrophe;
|
|
}
|
|
|
|
KeyboardButton ConvertOSKey(uint key)
|
|
{
|
|
if(key>=256)return(kbBeginRange);
|
|
if(KeyConvert[key]==0)return(kbBeginRange);
|
|
|
|
if(key==VK_SHIFT)
|
|
{
|
|
if((GetAsyncKeyState(VK_LSHIFT)>>15)&1)
|
|
return kbLeftShift;
|
|
else
|
|
return kbRightShift;
|
|
}
|
|
else
|
|
if(key==VK_CONTROL)
|
|
{
|
|
if((GetAsyncKeyState(VK_LCONTROL)>>15)&1)
|
|
return kbLeftCtrl;
|
|
else
|
|
return kbRightCtrl;
|
|
}
|
|
if(key==VK_MENU)
|
|
{
|
|
if((GetAsyncKeyState(VK_LMENU)>>15)&1)
|
|
return kbLeftAlt;
|
|
else
|
|
return kbRightAlt;
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
if(KeyConvert[key]==0)
|
|
{
|
|
wchar_t name[64];
|
|
|
|
::GetKeyNameTextW(key,name,64);
|
|
|
|
LOG_INFO(WideString(L"Unknow Key: " )+WideString::valueOf(key)
|
|
+WideString(L" ,name: " )+WideString(name));
|
|
}
|
|
#endif _DEBUG
|
|
|
|
return KeyConvert[key];
|
|
}
|
|
|
|
void WMProcDestroy(WinWindow *win,uint32,uint32)
|
|
{
|
|
win->ProcClose();
|
|
PostQuitMessage(0);
|
|
}
|
|
|
|
#define WMEF_MOUSE(button,action) void WMProcMouse##button##action(WinWindow *win,uint32 wParam,uint32 lParam) \
|
|
{ \
|
|
const int x=LOWORD(lParam); \
|
|
const int y=HIWORD(lParam); \
|
|
\
|
|
win->ProcMouseMove(x,y); \
|
|
win->ProcMouse##action(x,y,mb##button|GetMouseKeyFlags(wParam)); \
|
|
}
|
|
|
|
WMEF_MOUSE(Left,Down);
|
|
WMEF_MOUSE(Left,Up);
|
|
WMEF_MOUSE(Left,DblClick);
|
|
|
|
WMEF_MOUSE(Mid,Down);
|
|
WMEF_MOUSE(Mid,Up);
|
|
WMEF_MOUSE(Mid,DblClick);
|
|
|
|
WMEF_MOUSE(Right,Down);
|
|
WMEF_MOUSE(Right,Up);
|
|
WMEF_MOUSE(Right,DblClick);
|
|
|
|
void WMProcMouseMove(WinWindow *win,uint32 wParam,uint32 lParam)
|
|
{
|
|
win->ProcMouseMove(LOWORD(lParam),HIWORD(lParam));
|
|
}
|
|
#undef WMEF_MOUSE
|
|
|
|
#define WMEF2(name) void name(WinWindow *win,uint32 wParam,uint32 lParam)
|
|
WMEF2(WMProcMouseWheel)
|
|
{
|
|
int zDelta=GET_WHEEL_DELTA_WPARAM(wParam);
|
|
uint key=ConvertOSKey(GET_KEYSTATE_WPARAM(wParam));
|
|
|
|
win->ProcMouseWheel(zDelta,0,key);
|
|
}
|
|
|
|
WMEF2(WMProcMouseHWheel)
|
|
{
|
|
int zDelta=GET_WHEEL_DELTA_WPARAM(wParam);
|
|
uint key=ConvertOSKey(GET_KEYSTATE_WPARAM(wParam));
|
|
|
|
win->ProcMouseWheel(0,zDelta,key);
|
|
}
|
|
|
|
WMEF2(WMProcSize)
|
|
{
|
|
win->ProcResize(LOWORD(lParam),HIWORD(lParam));
|
|
}
|
|
#undef WMEF2
|
|
|
|
#define WMEF1(name) void name(WinWindow *win,uint32 wParam,uint32)
|
|
WMEF1(WMProcKeyDown)
|
|
{
|
|
win->ProcKeyDown(ConvertOSKey(wParam));
|
|
}
|
|
|
|
WMEF1(WMProcKeyUp)
|
|
{
|
|
win->ProcKeyUp(ConvertOSKey(wParam));
|
|
}
|
|
|
|
WMEF1(WMProcChar)
|
|
{
|
|
win->ProcChar((wchar_t)wParam);
|
|
}
|
|
|
|
WMEF1(WMProcActive)
|
|
{
|
|
//if(JoyPlugIn)
|
|
// JoyInterface.SetInputActive(wParam);
|
|
|
|
win->ProcActive(wParam);
|
|
}
|
|
#undef WMEF1
|
|
}//namespace
|
|
|
|
void InitMessageProc()
|
|
{
|
|
memset(WMProc,0,sizeof(WMProc));
|
|
InitKeyConvert();
|
|
|
|
//if(joy)
|
|
// LoadJoystick(win->hInstance,win->hWnd);
|
|
|
|
#define WM_MAP(wm,func) WMProc[wm]=func;
|
|
|
|
WM_MAP(WM_CLOSE ,WMProcDestroy);
|
|
WM_MAP(WM_LBUTTONDOWN ,WMProcMouseLeftDown);
|
|
WM_MAP(WM_LBUTTONUP ,WMProcMouseLeftUp);
|
|
WM_MAP(WM_LBUTTONDBLCLK ,WMProcMouseLeftDblClick);
|
|
WM_MAP(WM_MBUTTONDOWN ,WMProcMouseMidDown);
|
|
WM_MAP(WM_MBUTTONUP ,WMProcMouseMidUp);
|
|
WM_MAP(WM_MBUTTONDBLCLK ,WMProcMouseMidDblClick);
|
|
WM_MAP(WM_RBUTTONDOWN ,WMProcMouseRightDown);
|
|
WM_MAP(WM_RBUTTONUP ,WMProcMouseRightUp);
|
|
WM_MAP(WM_RBUTTONDBLCLK ,WMProcMouseRightDblClick);
|
|
WM_MAP(WM_MOUSEWHEEL ,WMProcMouseWheel);
|
|
WM_MAP(WM_MOUSEHWHEEL ,WMProcMouseHWheel);
|
|
WM_MAP(WM_MOUSEMOVE ,WMProcMouseMove);
|
|
WM_MAP(WM_KEYDOWN ,WMProcKeyDown);
|
|
WM_MAP(WM_KEYUP ,WMProcKeyUp);
|
|
WM_MAP(WM_SYSKEYDOWN ,WMProcKeyDown);
|
|
WM_MAP(WM_SYSKEYUP ,WMProcKeyUp);
|
|
WM_MAP(WM_CHAR ,WMProcChar);
|
|
WM_MAP(WM_SYSCHAR ,WMProcChar);
|
|
WM_MAP(WM_ACTIVATE ,WMProcActive);
|
|
WM_MAP(WM_SIZE ,WMProcSize);
|
|
|
|
#undef WM_MAP
|
|
}
|
|
|
|
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
if(uMsg<2048)
|
|
if(WMProc[uMsg])
|
|
{
|
|
WinWindow *win=(WinWindow *)GetWindowLongPtrW(hWnd,GWLP_USERDATA);
|
|
|
|
if(win)
|
|
WMProc[uMsg](win,wParam,lParam);
|
|
}
|
|
|
|
return (DefWindowProcW(hWnd, uMsg, wParam, lParam));
|
|
}
|
|
|
|
void InitNativeWindowSystem()
|
|
{
|
|
InitMessageProc();
|
|
}
|
|
}//namespace hgl
|