已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第6章Windows應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng),掃描碼是依賴于具體設(shè)備的,為達(dá)到設(shè)備無關(guān)性的要求,往往使用與具體設(shè)備無關(guān)的虛擬碼,虛擬碼是由Windows系統(tǒng)定義的與設(shè)備無關(guān)的鍵的標(biāo)識,6.1鍵盤在應(yīng)用程序中的應(yīng)用,虛擬碼是一種與設(shè)備無關(guān)的鍵盤編碼,它的值存放在鍵盤消息的wParam參數(shù)中,用以標(biāo)識哪一個(gè)鍵被按下或釋放,最常用的虛擬碼已經(jīng)在Windows.h中定義。,應(yīng)用程序一般有幾個(gè)窗口,但當(dāng)按下某一個(gè)鍵時(shí),只有一個(gè)窗口能接收到該鍵盤消息,接收這個(gè)鍵盤消息的窗口稱為有“輸入焦點(diǎn)”的窗口,有“輸入焦點(diǎn)”的窗口應(yīng)是活動窗口或者活動窗口的子窗口,鍵盤消息,按鍵消息,字符消息,按下或松開一個(gè)鍵時(shí)就產(chǎn)生了一按鍵消息,一個(gè)按鍵的組合產(chǎn)生了一個(gè)可以顯示的字符時(shí),就產(chǎn)生了一個(gè)字符消息,系統(tǒng)按鍵消息,非系統(tǒng)按鍵消息,Alt鍵與相關(guān)輸入鍵的組合產(chǎn)生的消息,這些鍵一般由Windows系統(tǒng)內(nèi)部直接處理,應(yīng)用程序不處理,若應(yīng)用程序處理了這些系統(tǒng)鍵消息,還要調(diào)用DefWindowsProc()函數(shù),以便不影響系統(tǒng)對它們的處理,不使用Alt鍵組合的按鍵消息,32位的變量,包含了識別按下的鍵的虛鍵碼,在WinMain函數(shù)的消息循環(huán)中包含了TranslateMessage函數(shù),其功能是把按鍵消息轉(zhuǎn)化為字符消息,但只有當(dāng)鍵盤驅(qū)動程序把鍵盤字符映射成ASCII碼后才能產(chǎn)生WM_CHAR消息。,【例6-1】設(shè)計(jì)一個(gè)窗口,在該窗口中練習(xí)鍵盤的響應(yīng),要求如下:(1)單擊鍵盤上的向上箭頭時(shí),窗口中顯示“Youhadhittedtheupkey”(2)單擊鍵時(shí),窗口中顯示“YouhadhittedtheSHIFTkey”(3)單擊鍵時(shí),窗口中顯示“YouhadhittedtheCTRLkey”(4)單擊鍵時(shí),窗口中顯示“YouhadhittedtheCTRLAkey”(5)單擊鍵時(shí),窗口中顯示“YouhadhittedtheSHIFTBkey”,longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)HDChDC;/定義設(shè)備環(huán)境句柄PAINTSTRUCTps;/定義包含繪圖信息的結(jié)構(gòu)體變量HPENhPen;/定義畫筆句柄HBRUSHhBrush;/定義畫刷句柄,/以下定義輸出的字符串staticcharcUp=YouhadhittedtheUPkey;staticcharcCtrl=YouhadhittedtheCtrlkey;staticcharcShift=YouhadhittedtheSHIFTkey;staticcharcCtrl_A=YouhadhittedtheCTRLAkey;staticcharcShift_B=YouhadhittedtheSHIFTBkey;,/下面定義并初始化按鍵標(biāo)志變量staticBOOLnUpKeyDown=FALSE,nShiftKeyDown=FALSE,nCtrlKeyDown=FALSE,nCtrlAKeyDown=FALSE,nShiftBKeyDown=FALSE;,switch(iMessage)caseWM_KEYDOWN:switch(wParam)caseVK_UP:/當(dāng)按上箭頭鍵時(shí),變量置為真nUpKeyDown=TRUE;break;caseVK_SHIFT:/當(dāng)按Shift鍵時(shí),變量置為真nShiftKeyDown=TRUE;break;caseVK_CONTROL:/當(dāng)按Control鍵時(shí),變量置為真nCtrlKeyDown=TRUE;break;default:break;break;caseWM_KEYUP:InvalidateRect(hWnd,NULL,FALSE);break;,caseWM_CHAR:if(wParam=(65,caseWM_PAINT:/處理繪圖消息.hDC=BeginPaint(hWnd,/設(shè)置字體顏色為紅色。,/輸出信息。if(nUpKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cUp,strlen(cUp);nUpKeyDown=FALSE;,elseif(nCtrlAKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,100,cCtrl_A,strlen(cCtrl_A);nCtrlAKeyDown=FALSE;nCtrlKeyDown=FALSE;,elseif(nCtrlAKeyDown=TRUE)elseif(nCtrlKeyDown=TRUE,elseif(nShiftBKeyDown=TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift_B,strlen(cShift_B);nShiftBKeyDown=FALSE;nShiftKeyDown=FALSE;,elseif(nShiftBKeyDown=FALSEelse;,/刪除畫筆和畫刷DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd,caseWM_DESTROY:PostQuitMessage(0);return0;default:return(DefWindowProc(hWnd,iMessage,wParam,lParam);return0;,程序中緩沖區(qū)大小只設(shè)30個(gè)字符,當(dāng)緩沖區(qū)滿時(shí)若再輸入任何字符,就出現(xiàn)(1)號錯(cuò)誤提示,用戶按下左箭頭鍵直至光標(biāo)到達(dá)本行起始位置時(shí),就無法再往左移動,則出現(xiàn)(2)號錯(cuò)誤信息,若此時(shí)您按下Esc鍵,就出現(xiàn)(3)號錯(cuò)誤提示信息,若當(dāng)前光標(biāo)位置處于本行的起始位置,此時(shí)按下回退鍵(BackSpace),則出現(xiàn)編號為(4)的錯(cuò)誤提示信息,若字符緩沖區(qū)中已沒有任何字符,此時(shí)按下了Delete鍵,則出現(xiàn)(5)號錯(cuò)誤提示信息,【例6-2本例演示鍵盤輸入時(shí)所產(chǎn)生的消息序列并在窗口的客戶區(qū)顯示對應(yīng)的字符,6.2鍵盤操作應(yīng)用舉例,#include#include#includevoidWINAPICaretPos(int*xCaret,int*yCaret);longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam);BOOLInitWindowsClass(HINSTANCEhInstance);BOOLInitWindows(HINSTANCEhInstance,intnCmdShow);HWNDhWndMain;,longWINAPIWndProc(HWNDhWnd,UINTiMessage,UINTwParam,LONGlParam)#defineBufSize30/設(shè)置存放字符的緩沖區(qū)大小staticcharcCharBufBufSize;/設(shè)置靜態(tài)字符數(shù)組,/存放輸入的字符,字符個(gè)數(shù)不能超出緩沖區(qū)大小staticintnNumChar=0;/現(xiàn)有字符個(gè)數(shù)staticintnArrayPos=0;/字符的位置staticintnLnHeight;staticintnCharWidth;staticintxCaret,yCaret;intx;HDChDC;TEXTMETRICtm;PAINTSTRUCTPtStr;/定義指向包含繪圖信息的結(jié)構(gòu)體變量,switch(iMessage)/處理消息caseWM_CHAR:/遇到非系統(tǒng)字符所作的處理if(wParam=VK_BACK)/處理遇到回退鍵的消息if(nArrayPos=0)/若已在一行文字的開始處,則提示不能回退MessageBox(hWnd,“當(dāng)前位置是文本的起始位置,不能回退,NULL,MB_OK);elsenArrayPos=nArrayPos-1;/按一次回退鍵就回退一字符位置CaretPos(,if(wParam=VK_ESCAPE)/處理按下Escape鍵消息MessageBox(hWnd,“您現(xiàn)在不能按ESC鍵,請繼續(xù)其它操作,NULL,MB_OK);break;,if(nNumChar=BufSize)/如寫入的字符數(shù)超過緩沖區(qū)大小,則報(bào)警MessageBox(hWnd,“緩沖區(qū)已滿,不能再輸入字符了n若需要刪除字符,請用BackSpace鍵,NULL,MB_OK);break;for(x=nNumChar;xnArrayPos;x=x-1)cCharBufx=cCharBufx-1;cCharBufnArrayPos=(unsignedchar)wParam;nArrayPos=nArrayPos+1;nNumChar=nNumChar+1;CaretPos(,caseWM_CREATE:/處理窗口創(chuàng)建消息hDC=GetDC(hWnd);GetTextMetrics(hDC,caseWM_SETFOCUS:/處理活動焦點(diǎn)消息CreateCaret(hWnd,0,0,nLnHeight);CaretPos(,caseWM_KILLFOCUS:/處理失去焦點(diǎn)消息DestroyCaret();break;,caseWM_KEYDOWN:/處理按下鍵消息switch(wParam)caseVK_END:/處理按下鍵為End時(shí)的消息nArrayPos=nNumChar;/輸入位置從本行的末尾開始CaretPos(,caseVK_DELETE:/處理按下鍵為Delete時(shí)的消息if(nArrayPos=nNumChar)/輸入位置處于本行的末尾MessageBox(hWnd,緩沖區(qū)已空,沒有字符可供刪除,NULL,MB_OK);elsefor(x=nArrayPos;x0)nArrayPos=nArrayPos-1;/當(dāng)前輸入位置往前移一個(gè)位置,再輸入字符時(shí),等于插入字符CaretPos(,caseVK_RIGHT:/處理按下右方向鍵時(shí)的消息if(nArrayPos50,if(x150,if(x250/西南-東北光標(biāo),if(x50/I字型光標(biāo),if(x50/東西向箭頭,if(x150/沙漏光標(biāo),if(x250/向上箭頭光標(biāo),if(x150/西北-東南箭頭,if(x250/南北向箭頭,hdc=GetDC(hwnd);GetTextMetrics(hdc,caseWM_PAINT:hdc=BeginPaint(hwnd,【6-3】編寫一個(gè)鼠標(biāo)應(yīng)用程序,按下鼠標(biāo)左鍵在窗口中移動時(shí),將按下左鍵時(shí)所在點(diǎn)和當(dāng)前點(diǎn)所形成的矩形涂成灰色,此時(shí)光標(biāo)為十字型。當(dāng)抬起鼠標(biāo)左鍵時(shí),將前面所繪制度矩形拉伸到整個(gè)窗口,拉伸過程中將光標(biāo)設(shè)置為沙漏型。然后,若雙擊鼠標(biāo)的左鍵,則灰色消失,窗口恢復(fù)到初始狀態(tài)。,voidInvertBlock(HWNDhwnd,POINTptBeg,POINTptEnd)HDChdc;hdc=CreateDC(DISPLAY,NULL,NULL,NULL);ClientToScreen(hwnd,LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam)staticBOOLoperate=FALSE,ready=TRUE;staticPOINTBeginP,EndP;staticRECTrect=0,0,0,0;HDChdc;PAINTSTRUCTPtStr;HBRUSHhBrush;,switch(message)caseWM_LBUTTONDOWN:if(!operate),caseWM_MOUSEMOVE:if(operate)EndP.x=LOWORD(lParam);EndP.y=HIWORD(lParam);rect.left=BeginP.xEndP.x?BeginP.x:EndP.x;rect.top=BeginP.yEndP.y?BeginP.y:EndP.y;SetCursor(LoadCursor(NULL,IDC_WAIT);/載入沙漏光標(biāo)InvalidateRect(hwnd,NULL,TRUE);return0;,caseWM_PAINT:if(ready=FALSE)hdc=BeginPaint(hwnd,caseWM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/Z 113.34-2025旋轉(zhuǎn)電機(jī)第34部分:軋機(jī)用交流調(diào)速電動機(jī)
- 家長疫情培訓(xùn)課件
- 家長會安全課件
- 2026年離婚協(xié)議子女探視權(quán)合同
- 2026年水電維修服務(wù)合同協(xié)議
- 2026年高新技術(shù)企業(yè)投資合同協(xié)議
- 2026年醫(yī)療健康行業(yè)加盟合同
- 影視發(fā)行合同2026年內(nèi)容交付協(xié)議
- 人壽保險(xiǎn)合同2026年續(xù)簽協(xié)議
- 2026屆新高考英語沖刺復(fù)習(xí)非謂動作狀語
- 國開2025年《行政領(lǐng)導(dǎo)學(xué)》形考作業(yè)1-4答案
- 2025年G3鍋爐水處理實(shí)操考試題庫含答案
- 鐵路專業(yè)基礎(chǔ)知識考試題及答案
- 精神科護(hù)理文書書寫規(guī)范
- 美術(shù)包過本科線協(xié)議書3篇
- DB61-T 1823-2024 櫻桃貯運(yùn)技術(shù)規(guī)范
- 高中英語分層教學(xué)課件
- 人工智能在醫(yī)學(xué)教育中的應(yīng)用現(xiàn)狀與未來發(fā)展
- (正式版)DB15∕T 2083-2021 《人工荒漠藻土壤結(jié)皮治沙技術(shù)規(guī)程》
- 氣壓液壓傳動課件
- 2025年1月國開電大專本科《經(jīng)濟(jì)法學(xué)》期末紙質(zhì)考試試題及答案
評論
0/150
提交評論