HGE2D引擎按键消息分析
我們自己先動手來模仿HGE其鍵盤特殊按鍵消息響應(yīng),其中所涉及到的數(shù)據(jù)操作含義稍后再介紹。
?
首先創(chuàng)建基于對話框CGetKeyBoardTestDlg的程序,創(chuàng)建一個(gè)STATIC控件ID為IDC_STATIC_CONTENT在對話框上面。添加成員?unsigned char kbstate[256]; 和int flag;
?
在CGetKeyBoardTestDlg.h文件頭設(shè)置宏定義
?
#define HGEINP_SHIFT 1 //0 #define HGEINP_CTRL 2 //1 #define HGEINP_ALT 4 //2 #define HGEINP_CAPSLOCK 8 //3 #define HGEINP_SCROLLLOCK 16//4 #define HGEINP_NUMLOCK 32//5 #define HGEINP_REPEAT 64//6
?
?
?
?
重載WindowProc()消息
?
LRESULT CGetKeyBoardTestDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) {// TODO: Add your specialized code here and/or call the base class//if (GetDlgItem(IDC_STATIC_CONTENT)->GetSafeHwnd() == NULL)//{// return CDialog::WindowProc(message, wParam, lParam);//}GetKeyboardState(kbstate);flags = 64;if(kbstate[VK_SHIFT] & 0x80) flags|=HGEINP_SHIFT;if(kbstate[VK_CONTROL] & 0x80) flags|=HGEINP_CTRL;if(kbstate[VK_MENU] & 0x80) flags|=HGEINP_ALT;if(kbstate[VK_CAPITAL] & 0x1) flags|=HGEINP_CAPSLOCK;if(kbstate[VK_SCROLL] & 0x1) flags|=HGEINP_SCROLLLOCK;if(kbstate[VK_NUMLOCK] & 0x1) flags|=HGEINP_NUMLOCK;//ToAscii(key, scan, kbstate, (unsigned short *)&eptr->event.chr, 0);return CDialog::WindowProc(message, wParam, lParam); }
?
重載WM_TIMER消息
?
?void CGetKeyBoardTestDlg::OnTimer(UINT_PTR nIDEvent) {// TODO: Add your message handler code here and/or call defaultif (flags & HGEINP_SHIFT){SetDlgItemText(IDC_STATIC_CONTENT, _T("HGEINP_SHIFT"));}if (flags & HGEINP_CTRL){SetDlgItemText(IDC_STATIC_CONTENT, _T("HGEINP_CTRL"));}if (flags & HGEINP_CAPSLOCK){SetDlgItemText(IDC_STATIC_CONTENT, _T("HGEINP_CAPSLOCK"));}if (flags & HGEINP_SCROLLLOCK){SetDlgItemText(IDC_STATIC_CONTENT, _T("HGEINP_SCROLLLOCK"));}if (flags & HGEINP_NUMLOCK){SetDlgItemText(IDC_STATIC_CONTENT, _T("HGEINP_NUMLOCK"));}CDialog::OnTimer(nIDEvent); }
?
?
最后在初始對話框的時(shí)候
SetTimer(NULL, 100, NULL);
?
好了,特殊按鍵消息可以如期執(zhí)行。
?
?
為什么要這樣傳呢?
因?yàn)槲覀兺ㄟ^GetKeybroadState[虛擬鍵碼] 取得是此按鍵的位移狀態(tài)。
在處理按鍵訊息時(shí),可能需要知道是否按下了位移鍵(Shift、Ctrl和Alt)或開關(guān)鍵(Caps Lock、Num Lock和Scroll Lock)。通過呼叫GetKeyState函式,也能獲得此資訊。例如:
iState = GetKeyState (VK_SHIFT) ;
如果按下了Shift,則iState值為負(fù)(即設(shè)定了最高位置位元)。如果Caps Lock鍵打開,則從
iState = GetKeyState (VK_CAPITAL) ;
傳回的值低位元被設(shè)為1。此位元與鍵盤上的小燈保持一致。
?
這樣就能解釋為分別與0x80,與0x01的原因了。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的HGE2D引擎按键消息分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv感兴趣通道COI的使用
- 下一篇: Modbus协议栈应用实例之一:Modb