




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、信息學院信息技術(shù)教研室面向?qū)ο蟪绦蛟O計面向?qū)ο蟪绦蛟O計面向?qū)ο蟪绦蛟O計課程設計面向?qū)ο蟪绦蛟O計課程設計第6章 Windows應用程序?qū)︽I盤與鼠標的響應21 Windows應用程序?qū)︽I盤的響應本節(jié)實現(xiàn)在應用程序中響應鍵盤操作。3俄羅斯方塊游戲?qū)︽I盤的響應:方向鍵、:向左、右、下移動當前方塊;方向鍵:旋轉(zhuǎn)當前方塊;空格鍵:當前方塊一步到位;回車鍵:暫停/啟動游戲。4鍵盤上的鍵鍵盤上的鍵一個唯一的標識值掃描碼)一個唯一的標識值掃描碼)按下或釋放某鍵時按下或釋放某鍵時產(chǎn)產(chǎn)生生6.1 鍵盤在應用程序中的應用5由于鍵盤的輸入由于鍵盤的輸入產(chǎn)生一條產(chǎn)生一條消息消息掃描碼、虛擬碼以及其他與擊鍵有關(guān)的信息掃描碼
2、、虛擬碼以及其他與擊鍵有關(guān)的信息設備驅(qū)動程序設備驅(qū)動程序截取鍵的掃描碼截取鍵的掃描碼翻譯翻譯虛擬碼虛擬碼它含它含取出鍵盤消息進行處理取出鍵盤消息進行處理消息消息設備驅(qū)動程序設備驅(qū)動程序把消息放到系統(tǒng)的把消息放到系統(tǒng)的消息隊列中消息隊列中Windows從系統(tǒng)消息隊從系統(tǒng)消息隊列中取出消息列中取出消息發(fā)送到相應的線程消息隊列中發(fā)送到相應的線程消息隊列中窗口過程窗口過程6 虛擬碼是一種與設備無關(guān)的鍵盤編碼,它的值存放在鍵盤消息虛擬碼是一種與設備無關(guān)的鍵盤編碼,它的值存放在鍵盤消息的的wParam參數(shù)中,用以標識哪一個鍵被按下或釋放,最常用的虛擬參數(shù)中,用以標識哪一個鍵被按下或釋放,最常用的虛擬碼已經(jīng)
3、在碼已經(jīng)在Windows.h中定義,中定義,常用的虛擬碼符符號號常常量量名名稱稱等等價價的的鍵鍵盤盤鍵鍵或或鼠鼠標標按按鈕鈕符符號號常常量量名名稱稱等等價價的的鍵鍵盤盤鍵鍵或或鼠鼠標標按按鈕鈕VK_LBUTTON鼠鼠標標左左按按鈕鈕VK_BACK退退格格鍵鍵VK_RBUTTON鼠鼠標標右右按按鈕鈕VK_TAB制制表表鍵鍵VK_MBUTTON鼠鼠標標中中按按鈕鈕VK_RETURN回回車車鍵鍵VK_SHIFTShift 鍵鍵VK_CONTROLCtrl 鍵鍵VK_MENUAlt 鍵鍵VK_PAUSEPause 鍵鍵VK_CAPITALCaps Lock 鍵鍵VK_ESCAPEEsc 鍵鍵VK_PR
4、IORPage Up 鍵鍵VK_NEXTPage Down 鍵鍵VK_ENDEnd 鍵鍵VK_HOMEHome 鍵鍵VK_LEFT左左鍵鍵頭頭鍵鍵VK_RIGHT右右箭箭頭頭鍵鍵VK_UP上上箭箭頭頭鍵鍵VK_DOWN下下箭箭頭頭鍵鍵VK_0VK_909 鍵鍵VK_AVK_ZAZ 鍵鍵7操作系統(tǒng)在接收到鍵盤輸入后,還要決定哪一個應用程序?qū)㈨憫斎氩僮飨到y(tǒng)在接收到鍵盤輸入后,還要決定哪一個應用程序?qū)㈨憫斎隬indows系統(tǒng)把消息發(fā)送給具有系統(tǒng)把消息發(fā)送給具有“輸入焦點輸入焦點(input focus)的窗口的窗口應用程序一般有幾個窗應用程序一般有幾個窗口,但當按下某一個鍵口,但當按下某一個鍵時
5、,只有一個窗口能接時,只有一個窗口能接收到該鍵盤消息,接收收到該鍵盤消息,接收這個鍵盤消息的窗口稱這個鍵盤消息的窗口稱為有為有“輸入焦點的窗口輸入焦點的窗口有有“輸入焦點輸入焦點”的窗口應是活的窗口應是活動窗口或者活動窗口或者活動窗口的子窗口動窗口的子窗口窗口具有窗口具有輸入焦點輸入焦點 窗口函數(shù)通過捕獲窗口函數(shù)通過捕獲WM_SETFOCUS和和WM_KILLFOCUS消息確消息確定當前窗口是否具有輸入焦點。定當前窗口是否具有輸入焦點。窗口失去窗口失去輸入焦點輸入焦點8輸入焦點在畫圖應用程序中,當打開“編輯顏色對話框時,該窗口具有輸入焦點。9鍵盤消息鍵盤消息分為兩類分為兩類按下或松開一個鍵時按
6、下或松開一個鍵時就產(chǎn)生了一按鍵消息就產(chǎn)生了一按鍵消息一個按鍵的組合產(chǎn)生了一個按鍵的組合產(chǎn)生了一個可以顯示的字符時,一個可以顯示的字符時,就產(chǎn)生了一個字符消息就產(chǎn)生了一個字符消息系統(tǒng)按鍵消息系統(tǒng)按鍵消息非系統(tǒng)按鍵消息非系統(tǒng)按鍵消息Alt鍵與相關(guān)輸入鍵的組合鍵與相關(guān)輸入鍵的組合產(chǎn)生的消息,這些鍵一般產(chǎn)生的消息,這些鍵一般由由Windows系統(tǒng)內(nèi)部直接系統(tǒng)內(nèi)部直接處置,應用程序不處理處置,應用程序不處理若應用程序處理了這若應用程序處理了這些系統(tǒng)鍵消息,還要調(diào)些系統(tǒng)鍵消息,還要調(diào)用用DefWindowsProc()函函數(shù),以便不影響系統(tǒng)對數(shù),以便不影響系統(tǒng)對它們的處理它們的處理不使用不使用Alt鍵組合
7、鍵組合的按鍵消息的按鍵消息10消消 息息類類 型型含含 義義W M _K E Y D O W N非非 系系 統(tǒng)統(tǒng)按按 下下 了了 非非 系系 統(tǒng)統(tǒng) 鍵鍵 消消 息息W M _K E Y U P非非 系系 統(tǒng)統(tǒng)松松 開開 了了 非非 系系 統(tǒng)統(tǒng) 鍵鍵 消消 息息W M _SY SK E Y D O W N系系 統(tǒng)統(tǒng)按按 下下 了了 系系 統(tǒng)統(tǒng) 鍵鍵 消消 息息W M _SY SK E Y U P系系 統(tǒng)統(tǒng)松松 開開 了了 系系 統(tǒng)統(tǒng) 鍵鍵 消消 息息按鍵消息的按鍵消息的兩個變量兩個變量wParamlParam32位的變量位的變量重復計數(shù)位重復計數(shù)位015位)位)OEM掃描碼掃描碼1623位)位)
8、擴展鍵標志擴展鍵標志24位)位)保留位保留位2528位)位)關(guān)聯(lián)碼關(guān)聯(lián)碼29位)位)鍵的先前狀態(tài)位鍵的先前狀態(tài)位30)轉(zhuǎn)換狀態(tài)轉(zhuǎn)換狀態(tài)31位)位)包含了識別按下的鍵的虛擬碼包含了識別按下的鍵的虛擬碼11 在在WinMain函數(shù)的消息循環(huán)中包含了函數(shù)的消息循環(huán)中包含了TranslateMessage函數(shù),函數(shù),其功能是把按鍵消息轉(zhuǎn)化為字符消息,但只有當鍵盤驅(qū)動程序把鍵其功能是把按鍵消息轉(zhuǎn)化為字符消息,但只有當鍵盤驅(qū)動程序把鍵盤字符映射成盤字符映射成ASCII碼后才能產(chǎn)生碼后才能產(chǎn)生WM_CHAR消息消息消消 息息 類類 型型 含含 義義 W WM M_ _C CH HA AR R 非非 系系 統(tǒng)
9、統(tǒng) 非非 系系 統(tǒng)統(tǒng) 字字 符符 W WM M_ _D DE EA AD DC CH HA AR R 非非 系系 統(tǒng)統(tǒng) 非非 系系 統(tǒng)統(tǒng) 死死 字字 符符 W WM M_ _S SY YS SC CH HA AR R 系系 統(tǒng)統(tǒng) 系系 統(tǒng)統(tǒng) 字字 符符 W WM M_ _S SY YS SD DE EA AD DC CH HA AR R 系系 統(tǒng)統(tǒng) 系系 統(tǒng)統(tǒng) 死死 字字 符符 字符消息字符消息系統(tǒng)系統(tǒng)非系統(tǒng)非系統(tǒng)WM_KEYDOWN和和WM_KEYUP的按鍵消息只能產(chǎn)生非系統(tǒng)字符消息的按鍵消息只能產(chǎn)生非系統(tǒng)字符消息WM_SYSKEYDOWN和和WM_SYSKEYUP按鍵消息只能產(chǎn)生系統(tǒng)字符消
10、息按鍵消息只能產(chǎn)生系統(tǒng)字符消息126.2 鍵盤操作應用舉例13用戶窗口區(qū)輸入用戶窗口區(qū)輸入“這是一這是一個有關(guān)鍵盤操作的示例程個有關(guān)鍵盤操作的示例程序的字符串序的字符串程序中緩沖區(qū)大小只設程序中緩沖區(qū)大小只設30個字符,當緩沖區(qū)滿時若個字符,當緩沖區(qū)滿時若再輸入任何字符,就出現(xiàn)再輸入任何字符,就出現(xiàn)(1)號錯誤提示號錯誤提示用戶按下左箭頭鍵直至光用戶按下左箭頭鍵直至光標到達本行起始位置時,標到達本行起始位置時,就無法再往左移動,則出就無法再往左移動,則出現(xiàn)現(xiàn)(2)號錯誤信息號錯誤信息若此時您按下若此時您按下Esc鍵,就出現(xiàn)鍵,就出現(xiàn)(3)號錯號錯誤提示信息誤提示信息若當前光標位置處于本行的起若
11、當前光標位置處于本行的起始位置,此時按下回退鍵始位置,此時按下回退鍵(BackSpace),則出現(xiàn)編號為,則出現(xiàn)編號為(4)的錯誤提示信息的錯誤提示信息若字符緩沖區(qū)中已沒有任若字符緩沖區(qū)中已沒有任何字符,此時按下了何字符,此時按下了Delete鍵,則出現(xiàn)鍵,則出現(xiàn)(5)號錯號錯誤提示信息誤提示信息當按下當按下Home鍵或鍵或End鍵時,當前鍵時,當前輸入位置為本行起始位置或末尾輸入位置為本行起始位置或末尾14long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) #define BufSize 30/設置存放字符
12、的緩沖區(qū)大小設置存放字符的緩沖區(qū)大小 /設置靜態(tài)字符數(shù)組,存放輸入的字符,字符個數(shù)不能超出緩沖區(qū)大小設置靜態(tài)字符數(shù)組,存放輸入的字符,字符個數(shù)不能超出緩沖區(qū)大小static char cCharBufBufSize;static int nNumChar=0;/現(xiàn)有字符個數(shù)現(xiàn)有字符個數(shù)static int nArrayPos=0;/字符的位置字符的位置static int nLnHeight;static int nCharWidth;int x; /循環(huán)變量循環(huán)變量HDC hDC;TEXTMETRIC tm;PAINTSTRUCT PtStr; /定義指向包含繪圖信息的結(jié)構(gòu)體變量定義指向包含
13、繪圖信息的結(jié)構(gòu)體變量 15switch(iMessage) /處理消息處理消息case WM_CHAR: /遇到非系統(tǒng)字符所作的處理遇到非系統(tǒng)字符所作的處理if(wParam=VK_BACK) /處置處置“遇到回退鍵的消息遇到回退鍵的消息” /若已在一行文字的開始處,則提示用戶若已在一行文字的開始處,則提示用戶不能回退不能回退if(nArrayPos=0)MessageBox(hWnd,當前位置是文本的起始位置,不能回退當前位置是文本的起始位置,不能回退,NULL,MB_OK);else /每按一次回退鍵就回退一個字符的位置每按一次回退鍵就回退一個字符的位置nArrayPos=nArrayPo
14、s-1; nNumChar=nNumChar-1;/對現(xiàn)有字符總數(shù)進行計數(shù)對現(xiàn)有字符總數(shù)進行計數(shù) /刷新用戶區(qū),并序發(fā)送刷新用戶區(qū),并序發(fā)送WM_PAINT消息消息InvalidateRect(hWnd,NULL,TRUE);break;if(wParam=VK_ESCAPE) /處理按下處理按下Escape鍵消息鍵消息MessageBox(hWnd,您現(xiàn)在不能按您現(xiàn)在不能按ESC鍵,請繼續(xù)其它操作鍵,請繼續(xù)其它操作,NULL,MB_OK);break;16if(nNumChar=BufSize) /如果寫入的字符數(shù)超過緩沖區(qū)大小,則報警如果寫入的字符數(shù)超過緩沖區(qū)大小,則報警MessageBo
15、x(hWnd,緩沖區(qū)已滿,不能再輸入字符了緩沖區(qū)已滿,不能再輸入字符了n若需要刪除字符,請用若需要刪除字符,請用BackSpace鍵鍵,NULL,MB_OK);break;for(x=nNumChar;xnArrayPos;x=x-1)cCharBufx=cCharBufx-1;cCharBufnArrayPos=(unsigned char)wParam;nArrayPos=nArrayPos+1;nNumChar=nNumChar+1;InvalidateRect(hWnd,NULL,TRUE);break; 17case WM_CREATE: /處理窗口創(chuàng)建消息處理窗口創(chuàng)建消息hDC=G
16、etDC(hWnd);GetTextMetrics(hDC,&tm); /獲取字體信息獲取字體信息nLnHeight=tm.tmHeight+tm.tmExternalLeading;nCharWidth=tm.tmAveCharWidth;ReleaseDC(hWnd,hDC);break;case WM_KEYDOWN: /處理按下鍵消息處理按下鍵消息switch(wParam)case VK_END: /處理按下鍵為處理按下鍵為End時的消息時的消息nArrayPos=nNumChar;/輸入位置從本行的末尾開始輸入位置從本行的末尾開始break;case VK_HOME:/處理
17、按下鍵為處理按下鍵為Home時的消息時的消息nArrayPos=0;/輸入位置為本行的起始位置輸入位置為本行的起始位置break;case VK_DELETE:/處理按下鍵為處理按下鍵為Delete時的消息時的消息if(nArrayPos=nNumChar) /輸入位置處于本行的末尾輸入位置處于本行的末尾MessageBox(hWnd,緩沖區(qū)已空,沒有字符可供刪除緩沖區(qū)已空,沒有字符可供刪除,NULL,MB_OK);else for(x=nArrayPos;x0)nArrayPos=nArrayPos-1; /當前輸入位置往前移一個位置當前輸入位置往前移一個位置elseMessageBox(h
18、Wnd,您已經(jīng)移動到起始位置,不能再往左移動了您已經(jīng)移動到起始位置,不能再往左移動了,NULL,MB_OK);break;case VK_RIGHT處理按下右方向鍵時的消息處理按下右方向鍵時的消息if(nArrayPos=50&x=50&y=50&x=50&y=150&x=50&y=250&x=50&y=50&x=150&y=150&x=150&y=250&x=150&y=50&x=250&y=150&x=250&y=250&x=250&
19、;y=350)/加載一個用于表示系統(tǒng)忙的光標加載一個用于表示系統(tǒng)忙的光標hCursor=LoadCursor(NULL,IDC_WAIT);SetCursor(hCursor);37elsehCursor=LoadCursor(NULL,IDC_ARROW);/其他區(qū)域設置成普通的箭頭型光標其他區(qū)域設置成普通的箭頭型光標SetCursor(hCursor);hdc=GetDC(hWnd);GetTextMetrics(hdc,&tm);hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);SelectObject(hdc,hbrush);hpen=(HP
20、EN)GetStockObject(WHITE_PEN);SelectObject(hdc,hpen); /用白色畫刷畫一個矩形,實際上是擦除上一次輸出的坐標位置用白色畫刷畫一個矩形,實際上是擦除上一次輸出的坐標位置Rectangle(hdc,5,5,tm.tmAveCharWidth*8,tm.tmHeight+3);sprintf(str,%d,%d0,x,y); /把整數(shù)打印到字符串中把整數(shù)打印到字符串中TextOut(hdc,5,5,str,lstrlen(str);EndPaint(hWnd,&ps);break;38case WM_PAINT:hdc=BeginPaint(
21、hWnd,&ps);hpen=(HPEN)GetStockObject(BLACK_PEN);SelectObject(hdc,hpen);Rectangle(hdc,50,50,350,350);MoveToEx(hdc,50,150,NULL);LineTo(hdc,350,150);MoveToEx(hdc,50,250,NULL);LineTo(hdc,350,250);MoveToEx(hdc,150,50,NULL);LineTo(hdc,150,350);MoveToEx(hdc,250,50,NULL);LineTo(hdc,250,350);TextOut(hdc,6
22、0,90,IDC_CROSS,strlen(IDC_CROSS);TextOut(hdc,155,90,IDC_SIZEALL,strlen(IDC_SIZEALL);TextOut(hdc,275,90,IDC_NO,strlen(IDC_NO);TextOut(hdc,50,190,IDC_SIZENESW,strlen(IDC_SIZENESW);TextOut(hdc,160,190,IDC_SIZENS,strlen(IDC_SIZENS);TextOut(hdc,250,190,IDC_SIZENWSE,strlen(IDC_SIZENWSE);TextOut(hdc,60,290
23、,IDC_SIZEWE,strlen(IDC_SIZEWE);TextOut(hdc,150,290,IDC_UPARROW,strlen(IDC_UPARROW);TextOut(hdc,270,290,IDC_WAIT,strlen(IDC_WAIT);EndPaint(hWnd,&ps);break;39case WM_DESTROY:/處理結(jié)束應用程序消息處理結(jié)束應用程序消息PostQuitMessage(0); /結(jié)束應用程序結(jié)束應用程序return 0;default: /其他消息處理程序其他消息處理程序return(DefWindowProc(hWnd,iMessage,
24、wParam,lParam) ;4041switch (message) case WM_LBUTTONDOWN: if (!operate)&ready) operate=TRUE ;/左鍵擊活捕獲左鍵擊活捕獲 ready=FALSE; SetCapture (hwnd) ;/把所有的鼠標信息輸入到被左鍵擊活的窗口把所有的鼠標信息輸入到被左鍵擊活的窗口. SetCursor (LoadCursor (NULL, IDC_CROSS) ; /載入光標載入光標 BeginP.x=LOWORD(lParam); BeginP.y=HIWORD(lParam); return 0 ;LRES
25、ULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) static BOOL operate=FALSE,ready=TRUE; static POINT BeginP,EndP; static RECT rect=0,0,0,0 ; HDC hdc ; PAINTSTRUCT PtStr; HBRUSH hBrush;42 case WM_LBUTTONUP: if (operate) operate=FALSE; SetCursor (LoadCursor (NULL, IDC_WAIT); GetClientRect (hwnd, &rect) ; InvalidateRect(hwnd,NULL,TRUE); SetCursor(LoadCursor(NULL,IDC_ARROW); ReleaseCapture () ;/把鼠標從當前窗口中釋放出來把鼠標從當前窗口中釋放出來 return 0
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 鋼花管錨桿施工方案
- 河流清淤施工方案
- 倉儲服務對象合同范例
- l勞務掛靠合同范例
- 醫(yī)護陪護合同范本
- 城市煤氣知識培訓課件
- 倉庫管理中的最佳行為準則計劃
- 教學設備與技術(shù)支持計劃
- 數(shù)字化轉(zhuǎn)型的戰(zhàn)略規(guī)劃計劃
- 《貴州黎明能源集團有限責任公司金沙縣新化鄉(xiāng)新華煤礦(變更)礦產(chǎn)資源綠色開發(fā)利用方案(三合一)》評審意見
- 【項目方案】合同能源托管模式下開展校園綜合能源建設方案-中教能研院
- 2024秋新冀教版英語七年級上冊教學課件 Unit 3 Lesson 3
- 2024年《國有企業(yè)管理人員處分條例》應知應會知識競賽測試題【附全答案】
- 2024解析:第十四章內(nèi)能的利用-講核心(解析版)
- 癡呆的影像鑒別診斷
- 基于義務教育質(zhì)量監(jiān)測結(jié)果的德育改進對策研究
- 2024版質(zhì)量管理培訓
- 開展我為同學辦實事活動
- 幼兒園大班健康《硬硬的殼香香的肉》課件
- 醫(yī)科大學2024年12月五官科護理學作業(yè)考核試題答卷
- GB/T 44569.1-2024土工合成材料內(nèi)部節(jié)點強度的測定第1部分:土工格室
評論
0/150
提交評論