版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第第5講講 Windows應(yīng)用程序中的鍵盤與鼠標(biāo)應(yīng)用程序中的鍵盤與鼠標(biāo) 掃描碼是依賴于具體設(shè)備的,為達(dá)到掃描碼是依賴于具體設(shè)備的,為達(dá)到設(shè)備無關(guān)性設(shè)備無關(guān)性的要求,往往使用與具體設(shè)備無的要求,往往使用與具體設(shè)備無關(guān)的關(guān)的虛擬碼虛擬碼,虛擬碼是由,虛擬碼是由Windows系統(tǒng)定義的與設(shè)備無關(guān)的鍵的標(biāo)識(shí)系統(tǒng)定義的與設(shè)備無關(guān)的鍵的標(biāo)識(shí)由于鍵盤的輸入由于鍵盤的輸入產(chǎn)生一條產(chǎn)生一條消息消息掃描碼、虛擬碼以及其他與擊鍵有關(guān)的掃描碼、虛擬碼以及其他與擊鍵有關(guān)的消息消息設(shè)備驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序截取鍵的掃描碼截取鍵的掃描碼翻譯翻譯虛擬碼虛擬碼它含它含鍵盤上的鍵鍵盤上的鍵對(duì)應(yīng)對(duì)應(yīng)一個(gè)唯一的一個(gè)唯一的標(biāo)識(shí)值標(biāo)識(shí)值(
2、掃描碼掃描碼)按下或釋放某鍵時(shí)按下或釋放某鍵時(shí)產(chǎn)產(chǎn)生生取出鍵盤消息進(jìn)行處理取出鍵盤消息進(jìn)行處理消息消息設(shè)備驅(qū)動(dòng)程序設(shè)備驅(qū)動(dòng)程序把消息放到系統(tǒng)的把消息放到系統(tǒng)的消息隊(duì)列中消息隊(duì)列中Windows從系統(tǒng)消息隊(duì)從系統(tǒng)消息隊(duì)列中取出消息列中取出消息發(fā)送到相應(yīng)的線程消息隊(duì)列中發(fā)送到相應(yīng)的線程消息隊(duì)列中窗口過程窗口過程6.1 6.1 鍵盤在應(yīng)用程序中的應(yīng)用鍵盤在應(yīng)用程序中的應(yīng)用 虛擬碼虛擬碼是一種與設(shè)備無關(guān)的鍵盤編碼,它的值存放在鍵盤消息的是一種與設(shè)備無關(guān)的鍵盤編碼,它的值存放在鍵盤消息的wParam參數(shù)中,用以標(biāo)識(shí)哪一個(gè)鍵被按下或釋放,最常用的虛擬碼參數(shù)中,用以標(biāo)識(shí)哪一個(gè)鍵被按下或釋放,最常用的虛擬碼已
3、經(jīng)在已經(jīng)在Windows.h中定義,中定義,常用的虛擬碼符符號(hào)號(hào)常常量量名名稱稱等等價(jià)價(jià)的的鍵鍵盤盤鍵鍵或或鼠鼠標(biāo)標(biāo)按按鈕鈕符符號(hào)號(hào)常常量量名名稱稱等等價(jià)價(jià)的的鍵鍵盤盤鍵鍵或或鼠鼠標(biāo)標(biāo)按按鈕鈕VK_LBUTTON鼠鼠標(biāo)標(biāo)左左按按鈕鈕VK_BACK退退格格鍵鍵VK_RBUTTON鼠鼠標(biāo)標(biāo)右右按按鈕鈕VK_TAB制制表表鍵鍵VK_MBUTTON鼠鼠標(biāo)標(biāo)中中按按鈕鈕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 鍵鍵操作系統(tǒng)在接收到鍵盤輸入后操作系統(tǒng)在接收到鍵盤輸入后把消息發(fā)送給具有把消息發(fā)送給具有“輸入焦點(diǎn)輸入焦點(diǎn)(input focus)的)的窗口窗口應(yīng)用程序一般有幾個(gè)窗應(yīng)用程序一般有幾個(gè)窗口,但當(dāng)按下某一個(gè)鍵口,但當(dāng)按下某一個(gè)鍵時(shí),只有一個(gè)窗口能接時(shí),只有一個(gè)窗口能接收到該鍵盤消息,接收收到該鍵盤消息,接收這個(gè)鍵盤消息
5、的窗口稱這個(gè)鍵盤消息的窗口稱為有為有“輸入焦點(diǎn)輸入焦點(diǎn)”的窗口的窗口有有“輸入焦點(diǎn)輸入焦點(diǎn)”的窗口應(yīng)是活的窗口應(yīng)是活動(dòng)窗口或者活動(dòng)窗口或者活動(dòng)窗口的子窗口動(dòng)窗口的子窗口窗口正在接窗口正在接收輸入焦點(diǎn)收輸入焦點(diǎn) 窗口函數(shù)通過捕獲窗口函數(shù)通過捕獲WM_SETFOCUS和和WM_KILLFOCUS消息確消息確定當(dāng)前窗口是否具有輸入焦點(diǎn)。定當(dāng)前窗口是否具有輸入焦點(diǎn)。窗口失去窗口失去輸入焦點(diǎn)輸入焦點(diǎn)鍵盤消息鍵盤消息按鍵消息按鍵消息字符消息字符消息按下或松開一個(gè)鍵時(shí)按下或松開一個(gè)鍵時(shí)就產(chǎn)生了一按鍵消息就產(chǎn)生了一按鍵消息一個(gè)按鍵的組合產(chǎn)生了一個(gè)按鍵的組合產(chǎn)生了一個(gè)可以顯示的字符時(shí),一個(gè)可以顯示的字符時(shí),就產(chǎn)
6、生了一個(gè)字符消息就產(chǎn)生了一個(gè)字符消息系統(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)部直接處理,應(yīng)用程序不處理處理,應(yīng)用程序不處理若應(yīng)用程序處理了這若應(yīng)用程序處理了這些系統(tǒng)鍵消息,還要調(diào)些系統(tǒng)鍵消息,還要調(diào)用用DefWindowsProc()DefWindowsProc()函函數(shù),以便不影響系統(tǒng)對(duì)數(shù),以便不影響系統(tǒng)對(duì)它們的處理它們的處理不使用不使用Alt鍵組合鍵組合的的按鍵消息的的按鍵消息消消 息息類類 型型含含 義義W M _K E Y D O W N非非 系系
7、統(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) 鍵鍵 消消 息息按鍵消息的按鍵消息的兩個(gè)變量?jī)蓚€(gè)變量wParamlParam32位的變量位的變量重復(fù)計(jì)數(shù)位(重復(fù)計(jì)數(shù)位(015位)位)OEM掃描碼(掃描碼(1623位)位)擴(kuò)展鍵標(biāo)志(擴(kuò)展鍵標(biāo)志(24位)位)保留位(保留位(2528位)位)關(guān)聯(lián)碼(關(guān)聯(lián)碼(29位)位)鍵的
8、先前狀態(tài)(位鍵的先前狀態(tài)(位30)轉(zhuǎn)換狀態(tài)(轉(zhuǎn)換狀態(tài)(31位)位)包含了識(shí)別按下包含了識(shí)別按下的鍵的虛鍵碼的鍵的虛鍵碼 在在WinMain函數(shù)的消息循環(huán)中包含了函數(shù)的消息循環(huán)中包含了TranslateMessage函數(shù),函數(shù),其功能是把按鍵消息轉(zhuǎn)化為字符消息,但只有當(dāng)鍵盤驅(qū)動(dòng)程序把鍵其功能是把按鍵消息轉(zhuǎn)化為字符消息,但只有當(dāng)鍵盤驅(qū)動(dòng)程序把鍵盤字符映射成盤字符映射成ASCII碼后才能產(chǎn)生碼后才能產(chǎn)生WM_CHAR消息消息消消 息息 類類 型型 含含 義義 W WM M_ _C CH HA AR R 非非 系系 統(tǒng)統(tǒng) 非非 系系 統(tǒng)統(tǒng) 字字 符符 W WM M_ _D DE EA AD DC CH
9、 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)消息按鍵消息只能產(chǎn)生系統(tǒng)消息【6-1】 設(shè)計(jì)一個(gè)窗口,在該窗口中練習(xí)鍵盤的響應(yīng),要求如下:設(shè)計(jì)一個(gè)
10、窗口,在該窗口中練習(xí)鍵盤的響應(yīng),要求如下:(1) 單擊鍵盤上的向上箭頭時(shí),窗口中顯示單擊鍵盤上的向上箭頭時(shí),窗口中顯示“You had hitted the up key”(2) 單擊單擊鍵時(shí),窗口中顯示鍵時(shí),窗口中顯示“You had hitted the SHIFT key”(3) 單擊單擊鍵時(shí),窗口中顯示鍵時(shí),窗口中顯示“You had hitted the CTRL key”(4) 單擊單擊鍵時(shí),窗口中顯示鍵時(shí),窗口中顯示“You had hitted the CTRL A key”(5) 單擊單擊鍵時(shí),窗口中顯示鍵時(shí),窗口中顯示“You had hitted the SHIFT B
11、key”long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)HDC hDC;/定義設(shè)備環(huán)境句柄定義設(shè)備環(huán)境句柄. PAINTSTRUCT ps;/定義包含繪圖信息的結(jié)構(gòu)體變量定義包含繪圖信息的結(jié)構(gòu)體變量 HPEN hPen;/定義畫筆句柄。定義畫筆句柄。 HBRUSH hBrush;/定義畫刷句柄定義畫刷句柄 /以下定義輸出的字符串。以下定義輸出的字符串。 static char cUp=You had hitted the UP key; static char cCtrl=You had hitted th
12、e Ctrl key; static char cShift=You had hitted the SHIFT key; static char cCtrl_A=You had hitted the CTRL A key; static char cShift_B=You had hitted the SHIFT B key;/下面定義并初始化按鍵標(biāo)志變量。下面定義并初始化按鍵標(biāo)志變量。 static BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDo
13、wn=FALSE; switch(iMessage) case WM_KEYDOWN: switch(wParam) case VK_UP:/當(dāng)按上箭頭鍵時(shí),變量置為真。當(dāng)按上箭頭鍵時(shí),變量置為真。nUpKeyDown = TRUE; break; case VK_SHIFT:/當(dāng)按當(dāng)按shift鍵時(shí),變量置為真。鍵時(shí),變量置為真。nShiftKeyDown = TRUE; break; case VK_CONTROL:/當(dāng)按當(dāng)按control鍵時(shí),變量置為真鍵時(shí),變量置為真nCtrlKeyDown = TRUE; break; default: break; break; case WM_K
14、EYUP:InvalidateRect(hWnd,NULL,FALSE);break; case WM_CHAR: if(wParam=(65&VK_CONTROL)/65為主鍵盤字符為主鍵盤字符A的的ASCII碼值碼值 if(nCtrlKeyDown = TRUE) /VK_CONTROL的值為的值為11 nCtrlAKeyDown = TRUE;nCtrlKeyDown = FALSE; else if(wParam=98|wParam=66)/當(dāng)按下當(dāng)按下b鍵時(shí)。鍵時(shí)。66是是B if(nShiftKeyDown = TRUE)/檢查檢查shift鍵是否處于按下狀態(tài)。鍵是否處于按下狀態(tài)。
15、nShiftBKeyDown = TRUE;/當(dāng)當(dāng)SHIFT鍵按下時(shí),變量置為真鍵按下時(shí),變量置為真 nShiftKeyDown = FALSE; break;case WM_PAINT:/處理繪圖消息處理繪圖消息.hDC=BeginPaint(hWnd,&ps);hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH); /創(chuàng)建創(chuàng)建 白畫刷。白畫刷。hPen = (HPEN)GetStockObject(WHITE_PEN);/創(chuàng)建白畫筆。創(chuàng)建白畫筆。SelectObject(hDC,hPen);/選入白畫刷選入白畫刷SelectObject(hDC,hBru
16、sh);/選入白畫筆選入白畫筆SetTextColor(hDC,RGB(255,0,0);/設(shè)置字體顏色為紅色。設(shè)置字體顏色為紅色。/輸出信息。輸出信息。if(nUpKeyDown = TRUE) Rectangle(hDC,0,0,300,200);/繪制一個(gè)矩形繪制一個(gè)矩形 TextOut(hDC,0,0,cUp,strlen(cUp);/在矩形內(nèi)輸出字符串在矩形內(nèi)輸出字符串cUP nUpKeyDown = FALSE; /重新刷新重新刷新 else if(nCtrlAKeyDown = TRUE) Rectangle(hDC,0,0,300,200);TextOut(hDC,0,100,
17、cCtrl_A,strlen(cCtrl_A);nCtrlAKeyDown = FALSE;nCtrlKeyDown = FALSE;else if(nCtrlAKeyDown = TRUE) else if(nCtrlKeyDown = TRUE&nCtrlAKeyDown = FALSE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,60,cCtrl,strlen(cCtrl);nCtrlKeyDown = FALSE;else if(nShiftBKeyDown = TRUE) Rectangle(hDC,0,0,300,200);TextOut(hD
18、C,0,0,cShift_B,strlen(cShift_B);nShiftBKeyDown = FALSE;nShiftKeyDown = FALSE;else if(nShiftBKeyDown = FALSE&nShiftKeyDown = TRUE)Rectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift,strlen(cShift);nShiftKeyDown = FALSE;else;/刪除畫筆和畫刷刪除畫筆和畫刷DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd,&ps);break
19、;case WM_DESTROY:PostQuitMessage(0);return 0;default: return(DefWindowProc(hWnd,iMessage,wParam,lParam);return 0;用戶窗口區(qū)輸入用戶窗口區(qū)輸入“這是一這是一個(gè)有關(guān)鍵盤操作的示例程個(gè)有關(guān)鍵盤操作的示例程序序”的字符串的字符串程序中緩沖區(qū)大小只設(shè)程序中緩沖區(qū)大小只設(shè)30個(gè)字符,當(dāng)緩沖區(qū)滿時(shí)若個(gè)字符,當(dāng)緩沖區(qū)滿時(shí)若再輸入任何字符,就出現(xiàn)再輸入任何字符,就出現(xiàn)(1)號(hào)錯(cuò)誤提示號(hào)錯(cuò)誤提示用戶按下左箭頭鍵直至光用戶按下左箭頭鍵直至光標(biāo)到達(dá)本行起始位置時(shí),標(biāo)到達(dá)本行起始位置時(shí),就無法再往左移動(dòng),則
20、出就無法再往左移動(dòng),則出現(xiàn)現(xiàn)(2)號(hào)錯(cuò)誤信息號(hào)錯(cuò)誤信息若此時(shí)您按下若此時(shí)您按下Esc鍵,就出現(xiàn)鍵,就出現(xiàn)(3)號(hào)錯(cuò)號(hào)錯(cuò)誤提示信息誤提示信息若當(dāng)前光標(biāo)位置處于本行的起若當(dāng)前光標(biāo)位置處于本行的起始位置,此時(shí)按下回退鍵始位置,此時(shí)按下回退鍵(BackSpace),則出現(xiàn)編號(hào)為,則出現(xiàn)編號(hào)為(4)的錯(cuò)誤提示信息的錯(cuò)誤提示信息若字符緩沖區(qū)中已沒有任若字符緩沖區(qū)中已沒有任何字符,此時(shí)按下了何字符,此時(shí)按下了Delete鍵,則出現(xiàn)鍵,則出現(xiàn)(5)號(hào)錯(cuò)號(hào)錯(cuò)誤提示信息誤提示信息6.2 鍵盤操作鍵盤操作應(yīng)用舉例應(yīng)用舉例【例例6-2本例演示鍵盤輸入時(shí)所產(chǎn)生的消息序列并在本例演示鍵盤輸入時(shí)所產(chǎn)生的消息序列并在窗口的客
21、戶區(qū)顯示對(duì)應(yīng)的字符窗口的客戶區(qū)顯示對(duì)應(yīng)的字符long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) #define BufSize 15#define BufSize 15/設(shè)置存放字符的緩沖區(qū)大小設(shè)置存放字符的緩沖區(qū)大小static char cCharBufBufSize;static char cCharBufBufSize;/設(shè)置靜態(tài)字符數(shù)組,存放輸入的字符,設(shè)置靜態(tài)字符
22、數(shù)組,存放輸入的字符,字符個(gè)數(shù)不能超出緩沖區(qū)大小字符個(gè)數(shù)不能超出緩沖區(qū)大小static int nNumChar=0;static int nNumChar=0;/現(xiàn)有字符個(gè)數(shù)現(xiàn)有字符個(gè)數(shù)static int nArrayPos=0;static int nArrayPos=0;/字符的位置字符的位置static int nLnHeight;static int nLnHeight;static int nCharWidth;static int nCharWidth;int x;int x;HDC hDC;HDC hDC;TEXTMETRIC tm;TEXTMETRIC tm;PAINTST
23、RUCT PtStr; /定義指向包含繪圖信息的結(jié)構(gòu)體變量定義指向包含繪圖信息的結(jié)構(gòu)體變量 switch(iMessage) switch(iMessage) /處理消息處理消息case WM_CHAR:case WM_CHAR: /遇到非系統(tǒng)字符所作的處理遇到非系統(tǒng)字符所作的處理if(wParam=VK_BACK) if(wParam=VK_BACK) /處理處理“遇到回退鍵的消息遇到回退鍵的消息”if(nArrayPos=0) if(nArrayPos=0) /若若已在一行文字的開始處,則提示用戶已在一行文字的開始處,則提示用戶 不能回退不能回退 MessageBox(hWnd, Mess
24、ageBox(hWnd,當(dāng)前位置是文本的起始位置,不能回退當(dāng)前位置是文本的起始位置,不能回退,NULL,MB_OK);,NULL,MB_OK); else else nArrayPos=nArrayPos-1; nArrayPos=nArrayPos-1; /每按一次回退鍵就回退一個(gè)字符的位置每按一次回退鍵就回退一個(gè)字符的位置 nNumChar=nNumChar-1;nNumChar=nNumChar-1;/對(duì)現(xiàn)有字符總數(shù)進(jìn)行計(jì)數(shù)對(duì)現(xiàn)有字符總數(shù)進(jìn)行計(jì)數(shù) InvalidateRect(hWnd,NULL,TRUE);InvalidateRect(hWnd,NULL,TRUE); /刷新用戶區(qū),并
25、序發(fā)送刷新用戶區(qū),并序發(fā)送WM_PAINTWM_PAINT消息消息 break; break; if(wParam=VK_ESCAPE) if(wParam=VK_ESCAPE) /處理按下處理按下EscapeEscape鍵消息鍵消息MessageBox(hWnd,MessageBox(hWnd,您現(xiàn)在不能按您現(xiàn)在不能按ESCESC鍵,請(qǐng)繼續(xù)其它操作鍵,請(qǐng)繼續(xù)其它操作,NULL,MB_OK);,NULL,MB_OK);break;break; if(nNumChar=BufSize) if(nNumChar=BufSize) /如果寫入的字符數(shù)超過緩沖區(qū)大小,則報(bào)警如果寫入的字符數(shù)超過緩沖區(qū)大
26、小,則報(bào)警MessageBox(hWnd,MessageBox(hWnd,緩沖區(qū)已滿,不能再輸入字符了緩沖區(qū)已滿,不能再輸入字符了nn若需要?jiǎng)h除字符,若需要?jiǎng)h除字符,請(qǐng)用請(qǐng)用BackSpaceBackSpace鍵鍵,NULL,MB_OK);,NULL,MB_OK);break;break; for(x=nNumChar;xnArrayPos;x=x-1)for(x=nNumChar;xnArrayPos;x=x-1)cCharBufx=cCharBufx-1;cCharBufx=cCharBufx-1;cCharBufnArrayPos=(unsigned char)wParam;cCharB
27、ufnArrayPos=(unsigned char)wParam;nArrayPos=nArrayPos+1;nArrayPos=nArrayPos+1;nNumChar=nNumChar+1;nNumChar=nNumChar+1;InvalidateRect(hWnd,NULL,TRUE);InvalidateRect(hWnd,NULL,TRUE); break; case WM_CREATE: case WM_CREATE: /處理窗口創(chuàng)建消息處理窗口創(chuàng)建消息 hDC=GetDC(hWnd); hDC=GetDC(hWnd); GetTextMetrics(hDC,&tm); Get
28、TextMetrics(hDC,&tm); /獲取字體信息獲取字體信息 nLnHeight=tm.tmHeight+tm.tmExternalLeading;nLnHeight=tm.tmHeight+tm.tmExternalLeading; nCharWidth=tm.tmAveCharWidth; nCharWidth=tm.tmAveCharWidth; ReleaseDC(hWnd,hDC); ReleaseDC(hWnd,hDC); break; break;case WM_KEYDOWN: case WM_KEYDOWN: /處理按下鍵消息處理按下鍵消息switch(wParam
29、)switch(wParam) case VK_END: case VK_END: /處理按下鍵為處理按下鍵為EndEnd時(shí)的消息時(shí)的消息nArrayPos=nNumChar;nArrayPos=nNumChar;/輸入位置從本行的末尾開始輸入位置從本行的末尾開始break;break; case VK_HOME: case VK_HOME:/處理按下鍵為處理按下鍵為HomeHome時(shí)的消息時(shí)的消息nArrayPos=0;nArrayPos=0;/輸入位置為本行的起始位置輸入位置為本行的起始位置break;break;case VK_DELETE:/處理按下鍵為處理按下鍵為Delete時(shí)的消息
30、時(shí)的消息 if(nArrayPos=nNumChar) /輸入位置處于本行的末尾輸入位置處于本行的末尾 MessageBox(hWnd,緩沖區(qū)已空,沒有字符可供刪除緩沖區(qū)已空,沒有字符可供刪除,NULL,MB_OK); else for(x=nArrayPos;x0) nArrayPos=nArrayPos-1; /當(dāng)前輸入位置往前移一個(gè)位置當(dāng)前輸入位置往前移一個(gè)位置 else MessageBox(hWnd,您已經(jīng)移動(dòng)到起始位置,不能再往左移動(dòng)了您已經(jīng)移動(dòng)到起始位置,不能再往左移動(dòng)了,NULL,MB_OK); break;case VK_RIGHT:/處理按下右方向鍵時(shí)的消息處理按下右方向鍵
31、時(shí)的消息 if(nArrayPosnNumChar)/若當(dāng)前位置未到緩沖區(qū)的末尾,可向右移動(dòng)若當(dāng)前位置未到緩沖區(qū)的末尾,可向右移動(dòng) nArrayPos=nArrayPos+1; else MessageBox(hWnd,已經(jīng)到緩沖區(qū)的末尾已經(jīng)到緩沖區(qū)的末尾,不能再向右移動(dòng)了不能再向右移動(dòng)了,NULL,MB_OK); break; break; case WM_PAINT: /處理重畫消息處理重畫消息 hDC=BeginPaint(hWnd,&PtStr); TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar); /輸出文本輸出文本 EndPai
32、nt(hWnd,&PtStr); break;case WM_DESTROY: /處理結(jié)束應(yīng)用程序消息處理結(jié)束應(yīng)用程序消息 PostQuitMessage(0);/結(jié)束應(yīng)用程序結(jié)束應(yīng)用程序 break;default:/其他消息處理程序其他消息處理程序 return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; return 0;6.3 6.3 鼠標(biāo)在應(yīng)用程序中的應(yīng)用鼠標(biāo)在應(yīng)用程序中的應(yīng)用鼠標(biāo)作為定位輸入設(shè)備,通過鼠標(biāo)單擊、雙擊和拖動(dòng)功能,用戶可以鼠標(biāo)作為定位輸入設(shè)備,通過鼠標(biāo)單擊、雙擊和拖動(dòng)功能,用戶可以很容易地操作基于很容易地操作基于Window
33、s圖形界面的應(yīng)用程序。圖形界面的應(yīng)用程序。代表預(yù)定義光標(biāo)的常量代表預(yù)定義光標(biāo)的常量光標(biāo)屬性描述光標(biāo)屬性描述IDC_ARROW箭頭光標(biāo)箭頭光標(biāo)IDC_CROSS十字光標(biāo)十字光標(biāo)IDC_IBEAMI 形文本光標(biāo)形文本光標(biāo)IDC_ICON空?qǐng)D標(biāo)空?qǐng)D標(biāo)IDC_SIZEALL十字箭頭光標(biāo)十字箭頭光標(biāo)IDC_SIZENESW帶有指向東北方和西南方箭頭的光標(biāo)帶有指向東北方和西南方箭頭的光標(biāo)IDC_SIZENS帶有指向北方和南方箭頭的光標(biāo)帶有指向北方和南方箭頭的光標(biāo)IDC_SIZENWSE帶有指向西北方和東南方箭頭的光標(biāo)帶有指向西北方和東南方箭頭的光標(biāo)ISC_SIZEWE帶有指向東方和西方箭頭的光標(biāo)帶有指向東
34、方和西方箭頭的光標(biāo)IDC_UPARROW垂直箭頭光標(biāo)垂直箭頭光標(biāo)IDC_WAIT計(jì)時(shí)光標(biāo)計(jì)時(shí)光標(biāo)(也稱沙漏光標(biāo)也稱沙漏光標(biāo))Windows中通過光標(biāo)來指示當(dāng)前鼠標(biāo)的位置,在中通過光標(biāo)來指示當(dāng)前鼠標(biāo)的位置,在Windows操作系統(tǒng)中操作系統(tǒng)中預(yù)定義了幾種光標(biāo),并在預(yù)定義了幾種光標(biāo),并在Windows.h頭文件中加以定義,頭文件中加以定義,例如,下面的語(yǔ)句為窗口類例如,下面的語(yǔ)句為窗口類wndclassWNDCLASS wndclassWNDCLASS wndclass;wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);wndclass.hCurs
35、or=LoadCursor (hThislnst, IDC_WAIT);此外,還可在應(yīng)用程序中調(diào)用此外,還可在應(yīng)用程序中調(diào)用LoadCursoLoadCursor函數(shù)改變光標(biāo)形式函數(shù)改變光標(biāo)形式用戶自定義光標(biāo)用戶自定義光標(biāo) 自定義光標(biāo)保存在擴(kuò)展名為自定義光標(biāo)保存在擴(kuò)展名為.cur的文件中的文件中 光標(biāo)名光標(biāo)名 CURSOR CURSOR 光標(biāo)文件光標(biāo)文件(.cur)(.cur)采用自定義光標(biāo)采用自定義光標(biāo)時(shí),需在資源文時(shí),需在資源文件中定義光標(biāo)資源件中定義光標(biāo)資源加載光標(biāo)資源加載光標(biāo)資源(常在定義窗口類時(shí)進(jìn)行常在定義窗口類時(shí)進(jìn)行) LoadCursor(hThisInst,lpszCursor
36、name)LoadCursor(hThisInst,lpszCursorname)當(dāng)前實(shí)例句柄當(dāng)前實(shí)例句柄當(dāng)前光標(biāo)當(dāng)前光標(biāo)值值含含義義MK_CONTROL按按下下鍵鍵按按上上的的 Ctrl 鍵鍵MK_LBUTTON按按下下了了鼠鼠標(biāo)標(biāo)左左鍵鍵,等等同同與與 WM_LBUTTONDOWNMK_MBUTTON按按下下了了鼠鼠標(biāo)標(biāo)中中鍵鍵,等等同同與與 WM_MBUTTONDOWNMK_RBUTTON按按下下了了鼠鼠標(biāo)標(biāo)右右鍵鍵,等等同同與與 WM_RBUTTONDOWNMK_SHIFT按按下下鍵鍵盤盤上上的的 Shift 鍵鍵鼠標(biāo)鼠標(biāo)消息消息lParam包含了鼠標(biāo)位置包含了鼠標(biāo)位置低位包含鼠標(biāo)位置
37、的低位包含鼠標(biāo)位置的x坐標(biāo)值坐標(biāo)值高位包含鼠標(biāo)位置的高位包含鼠標(biāo)位置的y坐標(biāo)坐標(biāo)wParam包含了指示各種虛鍵狀態(tài)的值包含了指示各種虛鍵狀態(tài)的值相當(dāng)于窗口的左上相當(dāng)于窗口的左上角為原點(diǎn)的坐標(biāo)值角為原點(diǎn)的坐標(biāo)值對(duì)于鼠標(biāo)消息對(duì)于鼠標(biāo)消息的處理的處理要對(duì)要對(duì)Shift和和Ctrl鍵進(jìn)行監(jiān)測(cè)鍵進(jìn)行監(jiān)測(cè)case WM_LBUTTONDOWN: /case WM_LBUTTONDOWN: /按下鼠標(biāo)左鍵按下鼠標(biāo)左鍵 if(wParam&MK_CONTROL)&(wParam&MK_SHIFT)if(wParam&MK_CONTROL)&(wParam&MK_SHIFT) /Shift/Shift和和Ctr
38、lCtrl鍵都被按下鍵都被按下 break;break;case WM_LBUTTONUP:case WM_LBUTTONUP:/釋放鼠標(biāo)左鍵釋放鼠標(biāo)左鍵 break; break; case WM_LBUTTONDOWN: /case WM_LBUTTONDOWN: /按下鼠標(biāo)左鍵按下鼠標(biāo)左鍵 break; break;case WM_LBUTTONUP:case WM_LBUTTONUP:/釋放鼠標(biāo)左鍵釋放鼠標(biāo)左鍵 break; break; 不監(jiān)測(cè)不監(jiān)測(cè)Windows系統(tǒng)默認(rèn)的時(shí)間間隔為系統(tǒng)默認(rèn)的時(shí)間間隔為0.5秒,也可以調(diào)用秒,也可以調(diào)用SetDoubleClickTime()重新設(shè)定
39、間隔值重新設(shè)定間隔值若窗口不包含上述屬性的定義,即使進(jìn)行了雙擊操作,該窗若窗口不包含上述屬性的定義,即使進(jìn)行了雙擊操作,該窗口也只能接收到兩條口也只能接收到兩條WM_BUTTONDOWNWM_BUTTONDOWN消息或兩條消息或兩條WN_BUTTONUPWN_BUTTONUP消息。消息。鼠標(biāo)雙擊鼠標(biāo)雙擊wndclass.stylewndclass.style=CS_HEADRAW|CS_VERDRAW|=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKSCS_DBLCLKS; ;要使窗口函數(shù)能接收要使窗口函數(shù)能接收鼠標(biāo)雙擊產(chǎn)生的消息鼠標(biāo)雙擊產(chǎn)生的消息在注冊(cè)窗口類時(shí)必須在注冊(cè)窗口類
40、時(shí)必須具有具有CS_DBLCLKSCS_DBLCLKS屬性屬性 由于鼠標(biāo)移動(dòng)的隨機(jī)性,如果要使某一個(gè)窗口能不間斷地由于鼠標(biāo)移動(dòng)的隨機(jī)性,如果要使某一個(gè)窗口能不間斷地捕捕獲鼠標(biāo)獲鼠標(biāo)消息,就必須對(duì)消息,就必須對(duì)鼠標(biāo)加以捕獲鼠標(biāo)加以捕獲SetCapture(hWnd):可以向句柄為可以向句柄為hWnd的窗口發(fā)送所有的鼠標(biāo)消息的窗口發(fā)送所有的鼠標(biāo)消息調(diào)用調(diào)用SetCapture()函數(shù)函數(shù)一旦從窗口捕獲了鼠標(biāo),一旦從窗口捕獲了鼠標(biāo),系統(tǒng)的鍵盤功能就暫時(shí)失系統(tǒng)的鍵盤功能就暫時(shí)失效,其它窗口也無法得到效,其它窗口也無法得到鼠標(biāo)消息鼠標(biāo)消息當(dāng)該窗口不再需要捕獲鼠標(biāo)消息時(shí),應(yīng)及時(shí)調(diào)用當(dāng)該窗口不再需要捕獲鼠標(biāo)
41、消息時(shí),應(yīng)及時(shí)調(diào)用ReleaseCapture()以釋以釋放鼠標(biāo),否則,其他窗口無法接收鼠標(biāo)信息。放鼠標(biāo),否則,其他窗口無法接收鼠標(biāo)信息。菜單、滾動(dòng)條菜單、滾動(dòng)條工具條和標(biāo)題條等處工具條和標(biāo)題條等處不由應(yīng)用程序處理不由應(yīng)用程序處理而是送往函數(shù)而是送往函數(shù)DefWindowProc用戶區(qū)以外用戶區(qū)以外的地方產(chǎn)生的地方產(chǎn)生的鼠標(biāo)事件的鼠標(biāo)事件產(chǎn)生一個(gè)產(chǎn)生一個(gè)非用戶區(qū)非用戶區(qū)鼠標(biāo)消息鼠標(biāo)消息6.4 鼠標(biāo)應(yīng)用程序?qū)嵗髽?biāo)應(yīng)用程序?qū)嵗纠?-3】鼠標(biāo)輸入鼠標(biāo)輸入示范程序,本例介示范程序,本例介紹如何響應(yīng)鼠標(biāo)信紹如何響應(yīng)鼠標(biāo)信息、并改變光標(biāo)形息、并改變光標(biāo)形狀等用法,用戶在狀等用法,用戶在窗口的不同區(qū)域
42、移窗口的不同區(qū)域移動(dòng)鼠標(biāo)時(shí),光標(biāo)將動(dòng)鼠標(biāo)時(shí),光標(biāo)將顯示如下圖所標(biāo)識(shí)顯示如下圖所標(biāo)識(shí)的不同箭頭的形狀的不同箭頭的形狀#include#include#include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)int WINAPI WinMain
43、( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow) HWND hwnd; HWND hwnd;MSG Msg;MSG Msg; WNDCLASS wndclass; WNDCLASS wndclass; char lpszClassName= char lpszClassName=窗口窗口; char lpszTitle=My_Windows; char lpszTitle=My_Windows; wndclass.style=0; wndclass.style=0; wndclass.lpszCl
44、assName=lpszClassName; wndclass.lpszClassName=lpszClassName; if(!RegisterClass(&wndclass) if(!RegisterClass(&wndclass) MessageBeep(0); MessageBeep(0); return FALSE; return FALSE; hwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBhwnd=CreateWindow(lpszClassName,lpszTitle,WS_
45、VISIBLE|WS_SYSMENU|WS_MINIMIZEBOX,50,50,450,450,NULL,NULL,hInstance,NULL);OX,50,50,450,450,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,nCmdShow); ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); UpdateWindow(hwnd); while(GetMessage(&Msg,NULL,0,0) while(GetMessage(&Msg,NULL,0,0) TranslateMessage(&Msg);
46、TranslateMessage(&Msg); DispatchMessage(&Msg);DispatchMessage(&Msg);return Msg.wParam;return Msg.wParam; LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)lParam) PAINTSTRUCT ps;PAINTSTRUCT ps;HDC hdc;HDC
47、hdc;TEXTMETRIC tm;TEXTMETRIC tm;HBRUSH hbrush;HBRUSH hbrush;HPEN hpen;HPEN hpen;HCURSOR hcursor;HCURSOR hcursor;char str15;char str15;static int x,y;static int x,y;switch(message)switch(message) case WM_MOUSEMOVE:case WM_MOUSEMOVE:x=LOWORD(lParam);x=LOWORD(lParam);y=HIWORD(lParam);y=HIWORD(lParam);i
48、f(x50&x50&y50&x50&y150&x50&y150&x50&y250&x50&y250&x50&y50&x150&y50&x150&y50&x250&y50&x250&y150&x150&y150&x150&y250&x150&y250&x150&y150&x250&y150&x250&y250&x250&y250&x250&y350) hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor); hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor); / /南北向箭頭南北向箭
49、頭hdc=GetDC(hwnd);hdc=GetDC(hwnd);GetTextMetrics(hdc,&tm);GetTextMetrics(hdc,&tm);hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);hbrush=(HBRUSH)GetStockObject(WHITE_BRUSH);SelectObject(hdc,hbrush);SelectObject(hdc,hbrush);hpen=(HPEN)GetStockObject(WHITE_PEN);hpen=(HPEN)GetStockObject(WHITE_PEN);SelectObj
50、ect(hdc,hpen);SelectObject(hdc,hpen);Rectangle(hdc,5,5,tm.tmAveCharWidthRectangle(hdc,5,5,tm.tmAveCharWidth* *8,tm.tmHeight+3);8,tm.tmHeight+3);sprintf(str,%d,%d0,x,y);sprintf(str,%d,%d0,x,y);TextOut(hdc,5,5,str,lstrlen(str);TextOut(hdc,5,5,str,lstrlen(str);EndPaint(hwnd,&ps);EndPaint(hwnd,&ps);brea
51、k;break;case WM_PAINT:case WM_PAINT:hdc=BeginPaint(hwnd,&ps);hdc=BeginPaint(hwnd,&ps);hpen=(HPEN)GetStockObject(BLACK_PEN);hpen=(HPEN)GetStockObject(BLACK_PEN);SelectObject(hdc,hpen);SelectObject(hdc,hpen);Rectangle(hdc,50,50,350,350);Rectangle(hdc,50,50,350,350);MoveToEx(hdc,50,150,NULL);MoveToEx(h
52、dc,50,150,NULL);LineTo(hdc,350,150);LineTo(hdc,350,150);MoveToEx(hdc,50,250,NULL);MoveToEx(hdc,50,250,NULL);LineTo(hdc,350,250);LineTo(hdc,350,250);MoveToEx(hdc,150,50,NULL);MoveToEx(hdc,150,50,NULL);LineTo(hdc,150,350);LineTo(hdc,150,350);MoveToEx(hdc,250,50,NULL);MoveToEx(hdc,250,50,NULL);LineTo(h
53、dc,250,350);LineTo(hdc,250,350);EndPaint(hwnd,&ps);EndPaint(hwnd,&ps);break;break;case WM_DESTROY:case WM_DESTROY:PostQuitMessage(0);PostQuitMessage(0);default: return DefWindowProc(hwnd,message,wParam,lParam);default: return DefWindowProc(hwnd,message,wParam,lParam); return(0);return(0); 【6-46-4】編寫
54、一個(gè)鼠標(biāo)應(yīng)用程序,按下鼠標(biāo)左鍵在窗口中移動(dòng)時(shí),將按下左鍵時(shí)所在點(diǎn)編寫一個(gè)鼠標(biāo)應(yīng)用程序,按下鼠標(biāo)左鍵在窗口中移動(dòng)時(shí),將按下左鍵時(shí)所在點(diǎn)和當(dāng)前點(diǎn)所形成的矩形涂成灰色,此時(shí)光標(biāo)為十字型。當(dāng)抬起鼠標(biāo)左鍵時(shí),將前面所繪和當(dāng)前點(diǎn)所形成的矩形涂成灰色,此時(shí)光標(biāo)為十字型。當(dāng)抬起鼠標(biāo)左鍵時(shí),將前面所繪制度矩形拉伸到整個(gè)窗口,拉伸過程中將光標(biāo)設(shè)置為沙漏型。然后,若雙擊鼠標(biāo)的左鍵,制度矩形拉伸到整個(gè)窗口,拉伸過程中將光標(biāo)設(shè)置為沙漏型。然后,若雙擊鼠標(biāo)的左鍵,則灰色消失,窗口恢復(fù)到初始狀態(tài)。則灰色消失,窗口恢復(fù)到初始狀態(tài)。void InvertBlock (HWND hwnd, POINT ptBeg, POINT
55、ptEnd) HDC hdc ; hdc = CreateDC (DISPLAY, NULL, NULL, NULL) ; ClientToScreen (hwnd, &ptBeg) ;/轉(zhuǎn)換指定窗口的客戶區(qū)內(nèi)的點(diǎn)的坐標(biāo)轉(zhuǎn)換指定窗口的客戶區(qū)內(nèi)的點(diǎn)的坐標(biāo) ClientToScreen (hwnd, &ptEnd) ; PatBlt (hdc, ptBeg.x, ptBeg.y, ptEnd.x - ptBeg.x, ptEnd.y - ptBeg.y,DSTINVERT) ;/這個(gè)函數(shù)在矩形區(qū)內(nèi)用當(dāng)前的畫筆重畫背景和前景這個(gè)函數(shù)在矩形區(qū)內(nèi)用當(dāng)前的畫筆重畫背景和前景*/ DeleteDC (hdc) ; LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) static BOOL operate=FALSE,r
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度航空運(yùn)輸貨物代理委托及質(zhì)量控制合同3篇
- 2024離婚財(cái)產(chǎn)分割協(xié)議公證與投資分割
- 2024版軟件許可與技術(shù)支持合同
- 二零二五年度股權(quán)激勵(lì)與員工離職補(bǔ)償合同樣本3篇
- 年度飛機(jī)碳剎車預(yù)制件戰(zhàn)略市場(chǎng)規(guī)劃報(bào)告
- 高校二零二五年度實(shí)驗(yàn)室科研人員聘用合同2篇
- 針對(duì)2025年度環(huán)保項(xiàng)目的技術(shù)研發(fā)合作合同3篇
- 2024-2025學(xué)年高中語(yǔ)文第三課神奇的漢字3方塊的奧妙-漢字的結(jié)構(gòu)練習(xí)含解析新人教版選修語(yǔ)言文字應(yīng)用
- 2024-2025學(xué)年高中政治第三單元思想方法與創(chuàng)新意識(shí)第9課第2框用對(duì)立統(tǒng)一的觀點(diǎn)看問題訓(xùn)練含解析新人教版必修4
- 2025年度特色餐飲業(yè)司爐員綜合管理服務(wù)合同3篇
- GB/T 11072-1989銻化銦多晶、單晶及切割片
- GB 15831-2006鋼管腳手架扣件
- 有機(jī)化學(xué)機(jī)理題(福山)
- 醫(yī)學(xué)會(huì)自律規(guī)范
- 商務(wù)溝通第二版第4章書面溝通
- 950項(xiàng)機(jī)電安裝施工工藝標(biāo)準(zhǔn)合集(含管線套管、支吊架、風(fēng)口安裝)
- 微生物學(xué)與免疫學(xué)-11免疫分子課件
- 《動(dòng)物遺傳育種學(xué)》動(dòng)物醫(yī)學(xué)全套教學(xué)課件
- 弱電工程自檢報(bào)告
- 民法案例分析教程(第五版)完整版課件全套ppt教學(xué)教程最全電子教案
- 7.6用銳角三角函數(shù)解決問題 (2)
評(píng)論
0/150
提交評(píng)論