2进制按键处理

来源:互联网 发布:p2p网络摄像机说明书 编辑:程序博客网 时间:2024/06/07 02:21
#define GK_NULL              0#define GK_W                   (1<<0)#define GK_S              (1<<1)#define GK_A              (1<<2)#define GK_D              (1<<3)#define GK_J               (1<<4)#define GK_K              (1<<5)int g_iKeyState = GK_NULL;void(*pListeners[10])(char keycode);short VK2GK(char keyCode){    switch (keyCode)    {    case 'W':    case 'w':        return GK_W;    case 'D':    case 'd':        return GK_D;    case 'A':    case 'a':        return GK_A;    case 'S':    case 's':        return GK_S;    case 'J':    case 'j':        return GK_J;    case 'K':    case 'k':        return GK_K;    default:        return GK_NULL;    }}bool IsKeyDown(int gk){    return g_iKeyState & gk;}void OnKeyDown(char keycode){    cout << keycode << "按下" << endl;    g_iKeyState |= VK2GK(keycode);}void OnKeyUp(char keycode){    cout << keycode << "抬起" << endl;    g_iKeyState &= ~VK2GK(keycode);}int RegistKeyFun(void(*pListeners[10])(char keycode),void(*pF)(char keycode)){    static int iD = 0;    pListeners[iD++] = pF;    return iD - 1;}void NotifyKey(void(*pListeners[10])(char keycode), int funID, int keycode){    pListeners[funID](keycode);}void main(){    int keyDown = RegistKeyFun(pListeners, OnKeyDown);    int keyUp = RegistKeyFun(pListeners, OnKeyUp);    NotifyKey(pListeners, keyDown, 'a');    NotifyKey(pListeners, keyDown, 'J');    if (IsKeyDown(GK_A) && IsKeyDown(GK_J))    {        cout << "a和j被同时按下" << endl;    }    NotifyKey(pListeners, keyUp, 'A');    if (!IsKeyDown(GK_A))    {        cout << "a抬起" << endl;    }}
原创粉丝点击