日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HGE2D引擎按键消息分析

發(fā)布時(shí)間:2024/7/23 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HGE2D引擎按键消息分析 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們自己先動手來模仿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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。