第6章Windows應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng)ppt課件_第1頁
第6章Windows應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng)ppt課件_第2頁
第6章Windows應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng)ppt課件_第3頁
第6章Windows應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng)ppt課件_第4頁
第6章Windows應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng)ppt課件_第5頁
已閱讀5頁,還剩32頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第第6 6章章 WindowsWindows應(yīng)用程序應(yīng)用程序?qū)︽I盤與鼠標(biāo)的響應(yīng)對鍵盤與鼠標(biāo)的響應(yīng) 掃描碼是依賴于具體設(shè)備的,為達(dá)到設(shè)備無關(guān)性的要求,往往使用掃描碼是依賴于具體設(shè)備的,為達(dá)到設(shè)備無關(guān)性的要求,往往使用與具體設(shè)備無關(guān)的虛擬碼,虛擬碼是由與具體設(shè)備無關(guān)的虛擬碼,虛擬碼是由Windows系統(tǒng)定義的與設(shè)備無系統(tǒng)定義的與設(shè)備無關(guān)的鍵的標(biāo)識關(guān)的鍵的標(biāo)識由于鍵盤的輸入由于鍵盤的輸入產(chǎn)生一條產(chǎn)生一條消息消息掃描碼、虛擬碼以及其他與擊鍵有關(guān)的消息掃描碼、虛擬碼以及其他與擊鍵有關(guān)的消息設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序截取鍵的掃描碼截取鍵的掃描碼翻譯翻譯虛擬碼虛擬碼它含它含鍵盤上的鍵鍵盤上的鍵對應(yīng)對應(yīng)一個(gè)唯一

2、的標(biāo)識值一個(gè)唯一的標(biāo)識值(掃描碼掃描碼)按下或釋放某鍵時(shí)按下或釋放某鍵時(shí)產(chǎn)產(chǎn)生生取出鍵盤消息進(jìn)行處理取出鍵盤消息進(jìn)行處理消息消息設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序把消息放到系統(tǒng)的把消息放到系統(tǒng)的消息隊(duì)列中消息隊(duì)列中Windows從系統(tǒng)消息隊(duì)從系統(tǒng)消息隊(duì)列中取出消息列中取出消息發(fā)送到相應(yīng)的線程消息隊(duì)列中發(fā)送到相應(yīng)的線程消息隊(duì)列中窗口過程窗口過程6.1 鍵盤在應(yīng)用程序中的應(yīng)用鍵盤在應(yīng)用程序中的應(yīng)用 虛擬碼是一種與設(shè)備無關(guān)的鍵盤編碼,它的值存放在鍵盤消息的虛擬碼是一種與設(shè)備無關(guān)的鍵盤編碼,它的值存放在鍵盤消息的wParam參數(shù)中,用以標(biāo)識哪一個(gè)鍵被按下或釋放,最常用的虛擬碼參數(shù)中,用以標(biāo)識哪一個(gè)鍵被按下或釋放

3、,最常用的虛擬碼已經(jīng)在已經(jīng)在Windows.h中定義。中定義。常用的虛擬碼符符號號常常量量名名稱稱等等價(jià)價(jià)的的鍵鍵盤盤鍵鍵或或鼠鼠標(biāo)標(biā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_ESCAPEEs

4、c 鍵鍵VK_PRIORPage 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è)窗口能接收到該鍵盤消息,接收收到該鍵盤消息,接收

5、這個(gè)鍵盤消息的窗口稱這個(gè)鍵盤消息的窗口稱為有為有“輸入焦點(diǎn)的窗口輸入焦點(diǎn)的窗口有有“輸入焦點(diǎn)輸入焦點(diǎn)”的窗口應(yīng)是活的窗口應(yī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è)可以顯示的字

6、符時(shí),就產(chǎn)生了一個(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()函函數(shù),以便不影響系統(tǒng)對數(shù),以便不影響系統(tǒng)對它們的處理它們的處理不使用不使用Alt鍵組合鍵組合的的按鍵消息的的按鍵消息消消 息息類類 型型含含 義義W M _K E Y D O W N非非 系系 統(tǒng)統(tǒng)按按 下下 了了

7、非非 系系 統(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è)變量兩個(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位)位)鍵的先前狀態(tài)位鍵的先前狀態(tài)位30)轉(zhuǎn)換狀態(tài)轉(zhuǎn)換

8、狀態(tài)31位)位)包含了識別按下包含了識別按下的鍵的虛鍵碼的鍵的虛鍵碼 在在WinMain函數(shù)的消息循環(huán)中包含了函數(shù)的消息循環(huán)中包含了TranslateMessage函數(shù),函數(shù),其功能是把按鍵消息轉(zhuǎn)化為字符消息,但只有當(dāng)鍵盤驅(qū)動程序把鍵其功能是把按鍵消息轉(zhuǎn)化為字符消息,但只有當(dāng)鍵盤驅(qū)動程序把鍵盤字符映射成盤字符映射成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 HA AR R 非非 系系 統(tǒng)統(tǒng) 非非 系系

9、 統(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è)窗口,在該窗口中練習(xí)鍵盤的響應(yīng),要求如下

10、:(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 key”long WINAPI WndP

11、roc(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 the Ctrl key; static char c

12、Shift=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, nShiftBKeyDown=FALSE; switch(iMessage)

13、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_KEYUP:InvalidateRect(hWnd,NULL,F

14、ALSE);break; case WM_CHAR: if(wParam=(65&VK_CONTROL) if(nCtrlKeyDown = TRUE) nCtrlAKeyDown = TRUE;nCtrlKeyDown = FALSE; else if(wParam=98|wParam=66)/當(dāng)按下當(dāng)按下b鍵時(shí)鍵時(shí) if(nShiftKeyDown = TRUE)/檢查檢查Shift鍵是否處于按下狀態(tài)。鍵是否處于按下狀態(tài)。nShiftBKeyDown = TRUE;/當(dāng)當(dāng)Shift鍵按下時(shí),變量置為真鍵按下時(shí),變量置為真 nShiftKeyDown = FALSE; break;case

15、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,hBrush);/選入白畫筆選入白畫筆SetTextColor(hDC,RGB(255,0,0);/設(shè)置字體顏色為紅色。設(shè)置字體顏色為紅色。/輸出信息。輸出信息。if(nUpKe

16、yDown = TRUE) Rectangle(hDC,0,0,300,200); TextOut(hDC,0,0,cUp,strlen(cUp); nUpKeyDown = FALSE; else if(nCtrlAKeyDown = TRUE) Rectangle(hDC,0,0,300,200);TextOut(hDC,0,100,cCtrl_A,strlen(cCtrl_A);nCtrlAKeyDown = FALSE;nCtrlKeyDown = FALSE;else if(nCtrlAKeyDown = TRUE) else if(nCtrlKeyDown = TRUE&nCtrl

17、AKeyDown = 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(hDC,0,0,cShift_B,strlen(cShift_B);nShiftBKeyDown = FALSE;nShiftKeyDown = FALSE;else if(nShiftBKeyDown = FALSE&nShiftKeyDown = TRUE)R

18、ectangle(hDC,0,0,300,200);TextOut(hDC,0,0,cShift,strlen(cShift);nShiftKeyDown = FALSE;else;/刪除畫筆和畫刷刪除畫筆和畫刷DeleteObject(hPen);DeleteObject(hBrush);EndPaint(hWnd,&ps);break;case WM_DESTROY:PostQuitMessage(0);return 0;default: return(DefWindowProc(hWnd,iMessage,wParam,lParam);return 0;用戶窗口區(qū)輸入用戶窗口區(qū)輸入“這是

19、這是一個(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)號錯(cuò)誤提示號錯(cuò)誤提示用戶按下左箭頭鍵直至光用戶按下左箭頭鍵直至光標(biāo)到達(dá)本行起始位置時(shí),標(biāo)到達(dá)本行起始位置時(shí),就無法再往左移動,則出就無法再往左移動,則出現(xiàn)現(xiàn)(2)號錯(cuò)誤信息號錯(cuò)誤信息若此時(shí)您按下若此時(shí)您按下Esc鍵,就出現(xiàn)鍵,就出現(xiàn)(3)號錯(cuò)號錯(cuò)誤提示信息誤提示信息若當(dāng)前光標(biāo)位置處于本行的起若當(dāng)前光標(biāo)位置處于本行的起始位置,此時(shí)按下回退鍵始位置,此時(shí)按下回退鍵(BackSpace),則出

20、現(xiàn)編號為,則出現(xiàn)編號為(4)的錯(cuò)誤提示信息的錯(cuò)誤提示信息若字符緩沖區(qū)中已沒有任若字符緩沖區(qū)中已沒有任何字符,此時(shí)按下了何字符,此時(shí)按下了Delete鍵,則出現(xiàn)鍵,則出現(xiàn)(5)號錯(cuò)號錯(cuò)誤提示信息誤提示信息【例【例6-2本例本例演示鍵盤輸演示鍵盤輸入時(shí)所產(chǎn)生入時(shí)所產(chǎn)生的消息序列的消息序列并在窗口的并在窗口的客戶區(qū)顯示客戶區(qū)顯示對應(yīng)的字符對應(yīng)的字符6.2 鍵盤操作應(yīng)用舉例鍵盤操作應(yīng)用舉例#include#include#include#include#include#includevoid WINAPI CaretPos(int void WINAPI CaretPos(int * *xCaret,

21、int xCaret,int * *yCaret);yCaret);long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindowsClass(HINSTANCE hInstance);BOOL InitWindows(HINSTANCE hInstance,int n

22、CmdShow);BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);HWND hWndMain;HWND hWndMain;long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam) #define BufSize 30 #define BufSize 30/設(shè)置存放字符的緩沖區(qū)大小設(shè)置存放字符的緩沖區(qū)大小 static char

23、cCharBufBufSize;static char cCharBufBufSize;/設(shè)置靜態(tài)字符數(shù)組,設(shè)置靜態(tài)字符數(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

24、 nCharWidth; static int xCaret,yCaret; static int xCaret,yCaret; int x; int x; HDC hDC; HDC hDC; TEXTMETRIC tm; TEXTMETRIC tm; PAINTSTRUCT PtStr; / PAINTSTRUCT PtStr; /定義指向包含繪圖信息的結(jié)構(gòu)體變量定義指向包含繪圖信息的結(jié)構(gòu)體變量switch(iMessage) switch(iMessage) /處理消息處理消息case WM_CHAR: case WM_CHAR: /遇到非系統(tǒng)字符所作的處理遇到非系統(tǒng)字符所作的處理 if(

25、wParam=VK_BACK) / if(wParam=VK_BACK) /處理遇到回退鍵的消息處理遇到回退鍵的消息 if(nArrayPos=0) if(nArrayPos=0) /若已在一行文字的開始處,則提示若已在一行文字的開始處,則提示 不能回退不能回退 MessageBox(hWnd,“ MessageBox(hWnd,“當(dāng)前位置是文本的起始位置,不能回退當(dāng)前位置是文本的起始位置,不能回退,NULL,MB_OK);,NULL,MB_OK); else else nArrayPos=nArrayPos-1; / nArrayPos=nArrayPos-1; /按一次回退鍵就回退一字符位

26、置按一次回退鍵就回退一字符位置 CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret); nNumChar=nNumChar-1; nNumChar=nNumChar-1;/對現(xiàn)有字符總數(shù)進(jìn)行計(jì)數(shù)對現(xiàn)有字符總數(shù)進(jìn)行計(jì)數(shù) InvalidateRect(hWnd,NULL,TRUE);/InvalidateRect(hWnd,NULL,TRUE);/刷新并發(fā)送刷新并發(fā)送WM_PAINTWM_PAINT消息消息 break; break; if(wParam=VK_ESCAPE) /if(wParam=VK_ESCAPE) /處理按下處理按下Escap

27、eEscape鍵消息鍵消息 MessageBox(hWnd,“ MessageBox(hWnd,“您現(xiàn)在不能按您現(xiàn)在不能按ESCESC鍵,請繼續(xù)其它操作鍵,請繼續(xù)其它操作,NULL,MB_OK);,NULL,MB_OK); break; break;if(nNumChar=BufSize) if(nNumChar=BufSize) /如寫入的字符數(shù)超過緩沖區(qū)大小,則報(bào)警如寫入的字符數(shù)超過緩沖區(qū)大小,則報(bào)警 MessageBox(hWnd,“ MessageBox(hWnd,“緩沖區(qū)已滿,不能再輸入字符了緩沖區(qū)已滿,不能再輸入字符了nn 若需要?jiǎng)h除字符,請用若需要?jiǎng)h除字符,請用BackSpace

28、BackSpace鍵鍵,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; cCharBufnArrayPos=(unsigned char)wParam; nArrayPos=nArrayPos+1; nNumChar=nNumChar+1; nArrayPos=nA

29、rrayPos+1; nNumChar=nNumChar+1; CaretPos(&xCaret,&yCaret); CaretPos(&xCaret,&yCaret); InvalidateRect(hWnd,NULL,TRUE); InvalidateRect(hWnd,NULL,TRUE); break; break;case WM_CREATE: /case WM_CREATE: /處理窗口創(chuàng)建消息處理窗口創(chuàng)建消息 hDC=GetDC(hWnd);hDC=GetDC(hWnd);GetTextMetrics(hDC,&tm); /GetTextMetrics(hDC,&tm); /獲取

30、字體信息獲取字體信息nLnHeight=tm.tmHeight+tm.tmExternalLeading;nLnHeight=tm.tmHeight+tm.tmExternalLeading;nCharWidth=tm.tmAveCharWidth;nCharWidth=tm.tmAveCharWidth;yCaret=nLnHeight;yCaret=nLnHeight;ReleaseDC(hWnd,hDC);ReleaseDC(hWnd,hDC); break;break;case WM_SETFOCUS: /case WM_SETFOCUS: /處理活動焦點(diǎn)消息處理活動焦點(diǎn)消息 Crea

31、teCaret(hWnd,0,0,nLnHeight); CreateCaret(hWnd,0,0,nLnHeight); CaretPos(&xCaret,&yCaret); CaretPos(&xCaret,&yCaret); ShowCaret(hWnd); / ShowCaret(hWnd); /在活動焦點(diǎn)的窗口中顯示插字符在活動焦點(diǎn)的窗口中顯示插字符 break;break;case WM_KILLFOCUS: case WM_KILLFOCUS: /處理失去焦點(diǎn)消息處理失去焦點(diǎn)消息 DestroyCaret();DestroyCaret(); break; break;case W

32、M_KEYDOWN: case WM_KEYDOWN: /處理按下鍵消息處理按下鍵消息 switch(wParam) switch(wParam) case VK_END: case VK_END: /處理按下鍵為處理按下鍵為EndEnd時(shí)的消息時(shí)的消息nArrayPos=nNumChar;nArrayPos=nNumChar;/輸入位置從本行的末尾開始輸入位置從本行的末尾開始CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret);break;break; case VK_HOME: case VK_HOME:/處理按下鍵為處理按下鍵為HomeH

33、ome時(shí)的消息時(shí)的消息 nArrayPos=0;nArrayPos=0;/輸入位置為本行的起始位置輸入位置為本行的起始位置CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret);break;break;case VK_DELETEcase VK_DELETE處理按下鍵為處理按下鍵為DeleteDelete時(shí)的消息時(shí)的消息 if(nArrayPos=nNumChar) /if(nArrayPos=nNumChar) /輸入位置處于本行的末尾輸入位置處于本行的末尾 MessageBox(hWnd,MessageBox(hWnd,緩沖區(qū)已空,沒有字符可

34、供刪除緩沖區(qū)已空,沒有字符可供刪除,NULL,MB_OK);,NULL,MB_OK); else else for(x=nArrayPos;xnNumChar;x=x+1) for(x=nArrayPos;x0)if(nArrayPos0) nArrayPos=nArrayPos-1; / nArrayPos=nArrayPos-1; /當(dāng)前輸入位置往前移一個(gè)位當(dāng)前輸入位置往前移一個(gè)位 置,再輸入字符時(shí),等于插入字符置,再輸入字符時(shí),等于插入字符 CaretPos(&xCaret,&yCaret);CaretPos(&xCaret,&yCaret); else else/已經(jīng)移到起始輸入位置,

35、不能再往前了已經(jīng)移到起始輸入位置,不能再往前了 MessageBox(hWnd,“MessageBox(hWnd,“您已經(jīng)移動到起始位置,不能再往左移動了您已經(jīng)移動到起始位置,不能再往左移動了,NULL,MB_OK);,NULL,MB_OK); break; break;case VK_RIGHT:case VK_RIGHT:/ / 處理按下右方向鍵時(shí)的消息處理按下右方向鍵時(shí)的消息 if(nArrayPosnNumChar) /if(nArrayPosnNumChar) /如果當(dāng)前位置沒有到緩沖區(qū)的最后位置,還能向如果當(dāng)前位置沒有到緩沖區(qū)的最后位置,還能向右移動右移動 nArrayPos=nA

36、rrayPos+1; CaretPos(&xCaret,&yCaret); nArrayPos=nArrayPos+1; CaretPos(&xCaret,&yCaret); else else MessageBox(hWnd,“ MessageBox(hWnd,“已經(jīng)到緩沖區(qū)的末尾已經(jīng)到緩沖區(qū)的末尾, ,不能再向右移動了不能再向右移動了,NULL,MB_OK);,NULL,MB_OK); break; break; break;break;case WM_PAINT: /case WM_PAINT: /處理重畫消息處理重畫消息 hDC=BeginPaint(hWnd,&PtStr); hDC

37、=BeginPaint(hWnd,&PtStr); TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar); / TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar); /輸出緩沖區(qū)中文本輸出緩沖區(qū)中文本 EndPaint(hWnd,&PtStr);EndPaint(hWnd,&PtStr); break;break;case WM_DESTROY:case WM_DESTROY:PostQuitMessage(0);PostQuitMessage(0);break;break;default:

38、return(DefWindowProc(hWnd,iMessage,wParam,lParam) ;default: return(DefWindowProc(hWnd,iMessage,wParam,lParam) ; return 0; return 0; BOOL InitWindowsClass(HINSTANCE hInstance)/BOOL InitWindowsClass(HINSTANCE hInstance)/初始化窗口類初始化窗口類 WNDCLASS WndClass;WNDCLASS WndClass;WndClass.cbClsExtra=0;WndClass.cb

39、ClsExtra=0;.WndClass.style=CS_HREDRAW|CS_VREDRAW;WndClass.style=CS_HREDRAW|CS_VREDRAW;return RegisterClass(&WndClass);return RegisterClass(&WndClass); BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/BOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/初始化窗口初始化窗口 HWND hWnd; HWND hWnd; hWnd=CreateWin

40、dow(.); hWnd=CreateWindow(.);if(!hWnd)if(!hWnd)return FALSE;return FALSE;hWndMain=hWnd;hWndMain=hWnd;ShowWindow(hWnd,nCmdShow);ShowWindow(hWnd,nCmdShow);/顯示窗口顯示窗口UpdateWindow(hWnd);UpdateWindow(hWnd);/繪制用戶區(qū)繪制用戶區(qū)return TRUE;return TRUE; void WINAPI CaretPos(int void WINAPI CaretPos(int * *xCaret,int

41、xCaret,int * *yCaret)yCaret)/處理插字符位置的函數(shù)處理插字符位置的函數(shù) SetCaretPos( SetCaretPos(* *xCaret,xCaret,* *yCaret); yCaret); /設(shè)置插字符位置坐標(biāo)設(shè)置插字符位置坐標(biāo)鼠標(biāo)作為定位輸入設(shè)備,通過鼠標(biāo)單擊、雙擊和拖動功能,用戶可以鼠標(biāo)作為定位輸入設(shè)備,通過鼠標(biāo)單擊、雙擊和拖動功能,用戶可以很容易地操作基于很容易地操作基于Windows圖形界面的應(yīng)用程序。圖形界面的應(yīng)用程序。代表預(yù)定義光標(biāo)的常量代表預(yù)定義光標(biāo)的常量光標(biāo)屬性描述光標(biāo)屬性描述IDC_ARROW箭頭光標(biāo)箭頭光標(biāo)IDC_CROSS十字光標(biāo)十字光

42、標(biāo)IDC_IBEAMI 形文本光標(biāo)形文本光標(biāo)IDC_ICON空圖標(biāo)空圖標(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)帶有指向東方和西方箭頭的光標(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)的位置,在

43、中通過光標(biāo)來指示當(dāng)前鼠標(biāo)的位置,在Windows操作系統(tǒng)中操作系統(tǒng)中預(yù)定義了幾種光標(biāo),并在預(yù)定義了幾種光標(biāo),并在Windows.h頭文件中加以定義。頭文件中加以定義。6.3 鼠標(biāo)在應(yīng)用程序中的應(yīng)用鼠標(biāo)在應(yīng)用程序中的應(yīng)用例如,下面的語句為窗口類例如,下面的語句為窗口類wndclassWNDCLASS wndclass;wndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);此外,還可在應(yīng)用程序中調(diào)用此外,還可在應(yīng)用程序中調(diào)用LoadCursor函數(shù)改變光標(biāo)形式。函數(shù)改變光標(biāo)形式。用戶自定義光標(biāo)用戶自定義光標(biāo) 自定義光標(biāo)保存在擴(kuò)展名為自定義光標(biāo)保存在擴(kuò)展

44、名為.cur的文件中。的文件中。 光標(biāo)名光標(biāo)名 CURSOR 光標(biāo)文件光標(biāo)文件(.cur)采用自定義光標(biāo)采用自定義光標(biāo)時(shí),需在資源文時(shí),需在資源文件中定義光標(biāo)資源件中定義光標(biāo)資源加載光標(biāo)資源加載光標(biāo)資源(常在定義窗口類時(shí)進(jìn)行常在定義窗口類時(shí)進(jìn)行) 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_M

45、BUTTONDOWNMK_RBUTTON按下了鼠標(biāo)右鍵,等同與按下了鼠標(biāo)右鍵,等同與 WM_RBUTTONDOWNMK_SHIFT按下鍵盤上的按下鍵盤上的 Shift 鍵鍵鼠標(biāo)鼠標(biāo)消息消息lParam包含了鼠標(biāo)位置包含了鼠標(biāo)位置低位包含鼠標(biāo)位置的低位包含鼠標(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)值對于鼠標(biāo)消息對于鼠標(biāo)消息的處理的處理要對要對Shift和和Ctrl鍵進(jìn)行監(jiān)測鍵進(jìn)行監(jiān)測case WM_LBUTTONDOWN: /case WM_L

46、BUTTONDOWN: /按下鼠標(biāo)左鍵按下鼠標(biāo)左鍵 if(wParam&MK_CONTROL)&(wParam&MK_SHIFT)if(wParam&MK_CONTROL)&(wParam&MK_SHIFT) /Shift/Shift和和CtrlCtrl鍵都被按下鍵都被按下 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_LBUTTONU

47、P:case WM_LBUTTONUP:/釋放鼠標(biāo)左鍵釋放鼠標(biāo)左鍵 break; break; 不監(jiān)測不監(jiān)測Windows系統(tǒng)默認(rèn)的時(shí)間間隔為系統(tǒng)默認(rèn)的時(shí)間間隔為0.5秒,也可以調(diào)用秒,也可以調(diào)用SetDoubleClickTime()重新設(shè)定間隔值重新設(shè)定間隔值若窗口不包含上述屬性的定義,即使進(jìn)行了雙擊操作,該窗若窗口不包含上述屬性的定義,即使進(jìn)行了雙擊操作,該窗口也只能接收到兩條口也只能接收到兩條WM_BUTTONDOWN消息或兩條消息或兩條WN_BUTTONUP消息。消息。鼠標(biāo)雙擊鼠標(biāo)雙擊wndclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKS;wn

48、dclass.style=CS_HEADRAW|CS_VERDRAW|CS_DBLCLKS;要使窗口函數(shù)能接收要使窗口函數(shù)能接收鼠標(biāo)雙擊產(chǎn)生的消息鼠標(biāo)雙擊產(chǎn)生的消息在注冊窗口類時(shí)必須在注冊窗口類時(shí)必須具有具有CS_DBLCLKS屬性屬性 由于鼠標(biāo)移動的隨機(jī)性,如果要使某一個(gè)窗口能不間斷地捕由于鼠標(biāo)移動的隨機(jī)性,如果要使某一個(gè)窗口能不間斷地捕獲鼠標(biāo)消息,就必須對鼠標(biāo)加以捕獲獲鼠標(biāo)消息,就必須對鼠標(biāo)加以捕獲SetCapture(hWnd):可以向句柄為:可以向句柄為hWnd的窗口發(fā)送所有的鼠標(biāo)消息的窗口發(fā)送所有的鼠標(biāo)消息調(diào)用調(diào)用SetCapture()函數(shù)函數(shù)一旦從窗口捕獲了鼠標(biāo),一旦從窗口捕獲了

49、鼠標(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)消息時(shí),應(yīng)及時(shí)調(diào)用ReleaseCapture()以釋以釋放鼠標(biāo),否則,其他窗口無法接收鼠標(biāo)信息。放鼠標(biāo),否則,其他窗口無法接收鼠標(biāo)信息。菜單、滾動條菜單、滾動條工具條和標(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-2】鼠標(biāo)輸入】鼠標(biāo)輸入示

50、范程序,本例介示范程序,本例介紹如何響應(yīng)鼠標(biāo)信紹如何響應(yīng)鼠標(biāo)信息、并改變光標(biāo)形息、并改變光標(biāo)形狀等用法,用戶在狀等用法,用戶在窗口的不同區(qū)域移窗口的不同區(qū)域移動鼠標(biāo)時(shí),光標(biāo)將動鼠標(biāo)時(shí),光標(biāo)將顯示如下圖所標(biāo)識顯示如下圖所標(biāo)識的不同箭頭的形狀的不同箭頭的形狀6.4 鼠標(biāo)應(yīng)用程序?qū)嵗髽?biāo)應(yīng)用程序?qū)嵗?include#include#include #include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);int WINAPI WinMain(

51、 HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)lpszCmdLine,int nCmdShow) HWND hwnd; HWND hwnd;MSG Msg;MSG Msg; WNDCLASS wndclass; WNDCLASS wndclass; char lpszClassName= char lpszClassName=窗口窗口; char lpszTitle=

52、My_Windows; char lpszTitle=My_Windows; wndclass.style=0; wndclass.style=0; wndclass.lpszClassName=lpszClassName; wndclass.lpszClassName=lpszClassName; if(!RegisterClass(&wndclass) if(!RegisterClass(&wndclass) MessageBeep(0); MessageBeep(0); return FALSE; return FALSE; hwnd=CreateWindow(lpszClassName

53、,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEhwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEB BOX,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

54、); while(GetMessage(&Msg,NULL,0,0) while(GetMessage(&Msg,NULL,0,0) TranslateMessage(&Msg); 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,

55、UINT message,WPARAM wParam,LPARAM lParam)lParam) PAINTSTRUCT ps;PAINTSTRUCT ps;HDC hdc;HDC 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_MOUSEM

56、OVE:case WM_MOUSEMOVE:x=LOWORD(lParam);x=LOWORD(lParam);y=HIWORD(lParam);y=HIWORD(lParam);if(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_SIZEN

57、S);SetCursor(hcursor); hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor); / /南北向箭頭南北向箭頭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,

58、hbrush);hpen=(HPEN)GetStockObject(WHITE_PEN);hpen=(HPEN)GetStockObject(WHITE_PEN);SelectObject(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,s

59、tr,lstrlen(str);TextOut(hdc,5,5,str,lstrlen(str);EndPaint(hwnd,&ps);EndPaint(hwnd,&ps);break;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);Rec

60、tangle(hdc,50,50,350,350);Rectangle(hdc,50,50,350,350);MoveToEx(hdc,50,150,NULL);MoveToEx(hdc,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(hd

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論