windows程序設(shè)計案例6分析_第1頁
windows程序設(shè)計案例6分析_第2頁
windows程序設(shè)計案例6分析_第3頁
windows程序設(shè)計案例6分析_第4頁
windows程序設(shè)計案例6分析_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第六章第六章 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)識系統(tǒng)定義的與設(shè)備無關(guān)的鍵的標(biāo)識 由于鍵盤的輸入由于鍵盤的輸入 產(chǎn)生一條產(chǎn)生一條 消息消息 掃描碼、虛擬碼以及其他與擊鍵有關(guān)的掃描碼、虛擬碼以及其他與擊鍵有關(guān)的消息消息 設(shè)備驅(qū)動程序設(shè)備驅(qū)動程序 截取鍵的掃描碼截取鍵的掃描碼 翻譯翻譯 虛擬碼虛擬碼 它含它含 鍵盤上的鍵鍵盤上的鍵 對應(yīng)對應(yīng) 一個唯

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

3、碼參數(shù)中,用以標(biāo)識哪一個鍵被按下或釋放,最常用的虛擬碼 已經(jīng)在已經(jīng)在Windows.h中定義,中定義, 操作系統(tǒng)在接收到鍵盤輸入后操作系統(tǒng)在接收到鍵盤輸入后 把消息發(fā)送給具有把消息發(fā)送給具有“輸入焦點(diǎn)輸入焦點(diǎn)(input focus)的)的窗口窗口 應(yīng)用程序一般有幾個窗應(yīng)用程序一般有幾個窗 口,但當(dāng)按下某一個鍵口,但當(dāng)按下某一個鍵 時,只有一個窗口能接時,只有一個窗口能接 收到該鍵盤消息,接收收到該鍵盤消息,接收 這個鍵盤消息的窗口稱這個鍵盤消息的窗口稱 為有為有“輸入焦點(diǎn)輸入焦點(diǎn)”的窗口的窗口 有有“輸入焦點(diǎn)輸入焦點(diǎn)” 的窗口應(yīng)是活的窗口應(yīng)是活 動窗口或者活動窗口或者活 動窗口的子窗口動窗口

4、的子窗口 窗口正在接窗口正在接 收輸入焦點(diǎn)收輸入焦點(diǎn) 窗口函數(shù)通過捕獲窗口函數(shù)通過捕獲WM_SETFOCUS和和WM_KILLFOCUS消息確消息確 定當(dāng)前窗口是否具有輸入焦點(diǎn)。定當(dāng)前窗口是否具有輸入焦點(diǎn)。 窗口失去窗口失去 輸入焦點(diǎn)輸入焦點(diǎn) 鍵盤消息鍵盤消息 按鍵消息按鍵消息 字符消息字符消息 按下或松開一個鍵時按下或松開一個鍵時 就產(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)輸入鍵

5、的組合 產(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) 用用DefWindowsProcDefWindowsProc()()函函 數(shù),以便不影響系統(tǒng)對數(shù),以便不影響系統(tǒng)對 它們的處理它們的處理 不使用不使用Alt鍵組合鍵組合 的的按鍵消息的的按鍵消息 消消 息息類類 型型含含 義義 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)松

6、松 開開 了了 非非 系系 統(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) 鍵鍵 消消 息息 按鍵消息的按鍵消息的 兩個變量兩個變量 wParam lParam 32位的變量位的變量 重復(fù)計數(shù)位(重復(fù)計數(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)換狀態(tài)(31位)位) 包含了

7、識別按下的鍵的虛鍵碼,包含了識別按下的鍵的虛鍵碼, 如果是數(shù)字或字母健,則是如果是數(shù)字或字母健,則是ASCII碼碼 在在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 C

8、H 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)消息On some non-U.S. English key

9、boards, certain keys are defined to add a diacritic(音調(diào)) to a letter. These are called dead keys because they dont generate characters by themselves. The Caret Functions(插入符函數(shù))(插入符函數(shù)) CreateCaret :Creates a caret associated with a window. SetCaretPos :Sets the position of the caret within the window.

10、 ShowCaret :Shows the caret. HideCaret :Hides the caret. DestroyCaret :Destroys the caret. 各函數(shù)的具體使用請參考MSDN或API手冊! 【6-1】 設(shè)計一個窗口,在該窗口中練習(xí)鍵盤的響應(yīng),要求如下:設(shè)計一個窗口,在該窗口中練習(xí)鍵盤的響應(yīng),要求如下: (1) 單擊鍵盤上的向上箭頭時,窗口中顯示單擊鍵盤上的向上箭頭時,窗口中顯示“You had hitted the up key” (2) 單擊單擊鍵時,窗口中顯示鍵時,窗口中顯示“You had hitted the SHIFT key” (3) 單擊單擊

11、鍵時,窗口中顯示鍵時,窗口中顯示“You had hitted the CTRL key” (4) 單擊單擊鍵時,窗口中顯示鍵時,窗口中顯示“You had hitted the CTRL A key” (5) 單擊單擊鍵時,窗口中顯示鍵時,窗口中顯示“You had hitted the SHIFT B 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)體變量

12、HPEN hPen;/定義畫筆句柄。定義畫筆句柄。 HBRUSH hBrush;/定義畫刷句柄定義畫刷句柄 /以下定義輸出的字符串。以下定義輸出的字符串。 static char cUp=You had hitted the UP key; static char cCtrl=You had hitted the 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 hit

13、ted the SHIFT B key; /下面定義并初始化按鍵標(biāo)志變量。下面定義并初始化按鍵標(biāo)志變量。 static BOOL nUpKeyDown=FALSE, nShiftKeyDown=FALSE, nCtrlKeyDown=FALSE, nCtrlAKeyDown=FALSE, nShiftBKeyDown=FALSE; switch(iMessage) case WM_KEYDOWN: switch(wParam) case VK_UP:/當(dāng)按上箭頭鍵時,變量置為真。當(dāng)按上箭頭鍵時,變量置為真。 nUpKeyDown = TRUE; break; case VK_SHIFT:/當(dāng)按

14、當(dāng)按shift鍵時,變量置為真。鍵時,變量置為真。 nShiftKeyDown = TRUE; break; case VK_CONTROL:/當(dāng)按當(dāng)按control鍵時,變量置為真鍵時,變量置為真 nCtrlKeyDown = TRUE; break; default: break; break; case WM_KEYUP: InvalidateRect(hWnd,NULL,FALSE);break; case WM_CHAR: if(wParam=(65nCtrlKeyDown = FALSE; else if(wParam=98|wParam=66)/當(dāng)按下當(dāng)按下b鍵時鍵時 if(nS

15、hiftKeyDown = TRUE)/檢查檢查shift鍵是否處于按下狀態(tài)。鍵是否處于按下狀態(tài)。 nShiftBKeyDown = TRUE;/當(dāng)當(dāng)SHIFT鍵按下時,變量置為真鍵按下時,變量置為真 nShiftKeyDown = FALSE; break; case WM_PAINT:/處理繪圖消息處理繪圖消息. hDC=BeginPaint(hWnd, hBrush = (HBRUSH)GetStockObject(WHITE_BRUSH); /創(chuàng)建創(chuàng)建 白畫刷。白畫刷。 hPen = (HPEN)GetStockObject(WHITE_PEN);/創(chuàng)建白畫筆。創(chuàng)建白畫筆。 Selec

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

17、hDC,0,100,cCtrl_A,strlen(cCtrl_A); nCtrlAKeyDown = FALSE; nCtrlKeyDown = FALSE; else if(nCtrlAKeyDown = TRUE) else if(nCtrlKeyDown = TRUE 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);

18、nShiftBKeyDown = FALSE; nShiftKeyDown = FALSE; else if(nShiftBKeyDown = FALSE TextOut(hDC,0,0,cShift,strlen(cShift); nShiftKeyDown = FALSE; else; /刪除畫筆和畫刷刪除畫筆和畫刷 DeleteObject(hPen); DeleteObject(hBrush); EndPaint(hWnd, break; case WM_DESTROY: PostQuitMessage(0);return 0; default: return(DefWindowPro

19、c(hWnd,iMessage,wParam,lParam); return 0; 用戶窗口區(qū)輸入用戶窗口區(qū)輸入“這是一這是一 個有關(guān)鍵盤操作的示例程個有關(guān)鍵盤操作的示例程 序序”的字符串的字符串 程序中緩沖區(qū)大小只設(shè)程序中緩沖區(qū)大小只設(shè)30 個字符,當(dāng)緩沖區(qū)滿時若個字符,當(dāng)緩沖區(qū)滿時若 再輸入任何字符,就出現(xiàn)再輸入任何字符,就出現(xiàn)(1) 號錯誤提示號錯誤提示 用戶按下左箭頭鍵直至光用戶按下左箭頭鍵直至光 標(biāo)到達(dá)本行起始位置時,標(biāo)到達(dá)本行起始位置時, 就無法再往左移動,則出就無法再往左移動,則出 現(xiàn)現(xiàn)(2)號錯誤信息號錯誤信息 若此時您按下若此時您按下Esc 鍵,就出現(xiàn)鍵,就出現(xiàn)(3)號錯號錯

20、 誤提示信息誤提示信息 若當(dāng)前光標(biāo)位置處于本行的起若當(dāng)前光標(biāo)位置處于本行的起 始位置,此時按下回退鍵始位置,此時按下回退鍵 (BackSpace),則出現(xiàn)編號為,則出現(xiàn)編號為(4) 的錯誤提示信息的錯誤提示信息 若字符緩沖區(qū)中已沒有任若字符緩沖區(qū)中已沒有任 何字符,此時按下了何字符,此時按下了 Delete鍵,則出現(xiàn)鍵,則出現(xiàn)(5)號錯號錯 誤提示信息誤提示信息 6.2 鍵盤操作鍵盤操作 應(yīng)用舉例應(yīng)用舉例 【例【例6-2本例演示鍵盤輸入時所產(chǎn)生的消息序列并在本例演示鍵盤輸入時所產(chǎn)生的消息序列并在 窗口的客戶區(qū)顯示對應(yīng)的字符窗口的客戶區(qū)顯示對應(yīng)的字符 #include#include #incl

21、udestdlib.h#include #include#include void WINAPI CaretPos(int void WINAPI CaretPos(int * *xCaret,int xCaret,int * *yCaretyCaret);); long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParamlong WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);); BOOL InitWindowsClass(HINSTAN

22、CE hInstanceBOOL InitWindowsClass(HINSTANCE hInstance);); BOOL InitWindows(HINSTANCE hInstance,int nCmdShowBOOL InitWindows(HINSTANCE hInstance,int nCmdShow);); HWND hWndMainHWND hWndMain; ; long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParamlong WINAPI WndProc(HWND hWnd,UINT iMessag

23、e,UINT wParam,LONG lParam) ) #define BufSize#define BufSize 30 30/設(shè)置存放字符的緩沖區(qū)大小設(shè)置存放字符的緩沖區(qū)大小 static char cCharBufBufSizestatic char cCharBufBufSize;/設(shè)置靜態(tài)字符數(shù)組,設(shè)置靜態(tài)字符數(shù)組, /存放輸入的字符,字符個數(shù)不能超出緩沖區(qū)大小存放輸入的字符,字符個數(shù)不能超出緩沖區(qū)大小 static int nNumCharstatic int nNumChar=0;=0;/現(xiàn)有字符個數(shù)現(xiàn)有字符個數(shù) static int nArrayPosstatic int n

24、ArrayPos=0;=0;/字符的位置字符的位置 static int nLnHeightstatic int nLnHeight; ; static int nCharWidth static int 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)體變量定義指向包含繪圖信息

25、的結(jié)構(gòu)體變量 switch(iMessageswitch(iMessage) ) /處理消息處理消息 case WM_CHAR: case WM_CHAR: /遇到非系統(tǒng)字符所作的處理遇到非系統(tǒng)字符所作的處理 if(wParam=VK_BACK) / if(wParam=VK_BACK) /處理處理“遇到回退鍵的消息遇到回退鍵的消息” if(nArrayPosif(nArrayPos=0) =0) /若若已在一行文字的開始處,則提示已在一行文字的開始處,則提示 不能回退不能回退 MessageBox(hWnd MessageBox(hWnd, ,“當(dāng)前位置是文本的起始位置,不能回退當(dāng)前位置是文

26、本的起始位置,不能回退 ,NULL,MB_OK);,NULL,MB_OK); else else nArrayPos nArrayPos=nArrayPos-1; /=nArrayPos-1; /按一次回退鍵就回退一字符位置按一次回退鍵就回退一字符位置 CaretPos(); nNumChar nNumChar=nNumChar-1;=nNumChar-1;/對現(xiàn)有字符總數(shù)進(jìn)行計數(shù)對現(xiàn)有字符總數(shù)進(jìn)行計數(shù) InvalidateRect(hWnd,NULL,TRUEInvalidateRect(hWnd,NULL,TRUE);/);/刷新并發(fā)送刷新并發(fā)送WM_PAINTWM_PAINT消息消息 b

27、reak; break; if(wParamif(wParam=VK_ESCAPE) /=VK_ESCAPE) /處理按下處理按下EscapeEscape鍵消息鍵消息 MessageBox(hWnd MessageBox(hWnd,“,“您現(xiàn)在不能按您現(xiàn)在不能按ESCESC鍵,請繼續(xù)其它操作鍵,請繼續(xù)其它操作,NULL,MB_OK,NULL,MB_OK);); break; break; if(nNumChar=BufSizeif(nNumChar=BufSize) ) /如寫入的字符數(shù)超過緩沖區(qū)大小,則報警如寫入的字符數(shù)超過緩沖區(qū)大小,則報警 MessageBox(hWnd MessageB

28、ox(hWnd,“,“緩沖區(qū)已滿,不能再輸入字符了緩沖區(qū)已滿,不能再輸入字符了nn 若需要刪除字符,請用若需要刪除字符,請用BackSpaceBackSpace鍵鍵,NULL,MB_OK,NULL,MB_OK);); break; break; for(x=nNumChar;xnArrayPos;xfor(x=nNumChar;xnArrayPos;x=x-1)=x-1) cCharBufxcCharBufx=cCharBufx-1;=cCharBufx-1; cCharBufnArrayPos=(unsigned char)wParamcCharBufnArrayPos=(unsigned

29、char)wParam; ; nArrayPos=nArrayPos+1; nNumChar nArrayPos=nArrayPos+1; nNumChar=nNumChar+1;=nNumChar+1; CaretPos(); InvalidateRect(hWnd,NULL,TRUE InvalidateRect(hWnd,NULL,TRUE);); break; break; case WM_CREATE: /case WM_CREATE: /處理窗口創(chuàng)建消息處理窗口創(chuàng)建消息 hDC=GetDC(hWndhDC=GetDC(hWnd);); GetTextMetrics(hDC, /);

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

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

32、處理按下鍵消息處理按下鍵消息 switch(wParam)switch(wParam) case VK_END: case VK_END: /處理按下鍵為處理按下鍵為EndEnd時的消息時的消息 nArrayPos=nNumCharnArrayPos=nNumChar; ;/輸入位置從本行的末尾開始輸入位置從本行的末尾開始 CaretPos(); break;break; case VK_HOME:case VK_HOME:/處理按下鍵為處理按下鍵為HomeHome時的消息時的消息 nArrayPosnArrayPos=0;=0;/輸入位置為本行的起始位置輸入位置為本行的起始位置 CaretP

33、os(); break;break; case VK_DELETE:/case VK_DELETE:/處理按下鍵為處理按下鍵為DeleteDelete時的消息時的消息 if(nArrayPos=nNumCharif(nArrayPos=nNumChar) /) /輸入位置處于本行的末尾輸入位置處于本行的末尾 MessageBox(hWndMessageBox(hWnd,緩沖區(qū)已空,沒有字符可供刪除緩沖區(qū)已空,沒有字符可供刪除,NULL,MB_OK);,NULL,MB_OK); else else for(x=nArrayPos;xnNumChar;x for(x=nArrayPos;x0)0)

34、 nArrayPos nArrayPos=nArrayPos-1; /=nArrayPos-1; /當(dāng)前輸入位置往前移一個位當(dāng)前輸入位置往前移一個位 置,再輸入字符時,等于插入字符置,再輸入字符時,等于插入字符 CaretPos(); else else/已經(jīng)移到起始輸入位置,不能再往前了已經(jīng)移到起始輸入位置,不能再往前了 MessageBox(hWndMessageBox(hWnd,“,“您已經(jīng)移動到起始位置,不能再往左移動了您已經(jīng)移動到起始位置,不能再往左移動了 ,NULL,MB_OK,NULL,MB_OK);); break; break; case VK_RIGHT:case VK_R

35、IGHT:/ / 處理按下右方向鍵時的消息處理按下右方向鍵時的消息 if(nArrayPosnNumCharif(nArrayPosnNumChar) /) /如果當(dāng)前位置沒有到緩沖區(qū)的最后位置,還能向右移動如果當(dāng)前位置沒有到緩沖區(qū)的最后位置,還能向右移動 nArrayPos=nArrayPos+1; CaretPos( CaretPos( ); else else MessageBox(hWnd MessageBox(hWnd,“,“已經(jīng)到緩沖區(qū)的末尾已經(jīng)到緩沖區(qū)的末尾, ,不能再向右移動了不能再向右移動了,NULL,MB_OK,NULL,MB_OK);); break; break; br

36、eak;break; case WM_PAINT: /case WM_PAINT: /處理重畫消息處理重畫消息 hDC=BeginPaint(hWnd,); TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar TextOut(hDC,nCharWidth,nLnHeight,cCharBuf,nNumChar); /); /輸出緩沖區(qū)中文本輸出緩沖區(qū)中文本 EndPaint(hWnd,); break;break; case WM_DESTROY:case WM_DESTROY: PostQuitMessage(0);PostQuitMessa

37、ge(0);break;break; default: return(DefWindowProc(hWnd,iMessage,wParam,lParamdefault: return(DefWindowProc(hWnd,iMessage,wParam,lParam) ;) ; return 0; return 0; BOOL InitWindowsClass(HINSTANCE hInstanceBOOL InitWindowsClass(HINSTANCE hInstance)/)/初始化窗口類初始化窗口類 WNDCLASS WndClassWNDCLASS WndClass; ; Wnd

38、Class.cbClsExtraWndClass.cbClsExtra=0;=0; . WndClass.styleWndClass.style=CS_HREDRAW|CS_VREDRAW;=CS_HREDRAW|CS_VREDRAW; return RegisterClass(); BOOL InitWindows(HINSTANCE hInstance,int nCmdShowBOOL InitWindows(HINSTANCE hInstance,int nCmdShow)/)/初始化窗口初始化窗口 HWND hWnd HWND hWnd; ; hWnd=CreateWindowhWnd

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

40、Caret,int * *yCaretyCaret) )/處理插字符位置的函數(shù)處理插字符位置的函數(shù) SetCaretPos(SetCaretPos(* *xCaret,xCaret,* *yCaretyCaret); ); /設(shè)置插字符位置坐標(biāo)設(shè)置插字符位置坐標(biāo) 6.3 6.3 鼠標(biāo)在應(yīng)用程序中的應(yīng)用鼠標(biāo)在應(yīng)用程序中的應(yīng)用 鼠標(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)屬性描述

41、 IDC_ARROW箭頭光標(biāo)箭頭光標(biāo) IDC_CROSS十字光標(biāo)十字光標(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計時

42、光標(biāo)計時光標(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頭文件中加以定義,頭文件中加以定義, 例如,下面的語句為窗口類例如,下面的語句為窗口類wndclass WNDCLASS wndclassWNDCLASS wndclass; wndclass.hCursor=LoadCursor (hThislnstwndclass.hCursor=LoadCursor (hThislnst, IDC_WAIT);, IDC_WAIT);

43、此外,還可在應(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) 時,需在資源文時,需在資源文 件中定義光標(biāo)資源件中定義光標(biāo)資源 加載光標(biāo)資源加載光標(biāo)資源(常在定義窗口類時進(jìn)行常在定義窗口類時進(jìn)行) LoadCursor(hThisInst,lpszCursornameLoadCursor(hThisInst,lpszCu

44、rsorname) ) 當(dāng)前實(shí)例句柄當(dāng)前實(shí)例句柄 當(dāng)前光標(biāo)當(dāng)前光標(biāo) 值值含義含義 MK_CONTROL按下鍵按上的按下鍵按上的 Ctrl 鍵鍵 MK_LBUTTON按下了鼠標(biāo)左鍵,等同與按下了鼠標(biāo)左鍵,等同與 WM_LBUTTONDOWN MK_MBUTTON按下了鼠標(biāo)中鍵,等同與按下了鼠標(biāo)中鍵,等同與 WM_MBUTTONDOWN MK_RBUTTON按下了鼠標(biāo)右鍵,等同與按下了鼠標(biāo)右鍵,等同與 WM_RBUTTONDOWN MK_SHIFT按下鍵盤上的按下鍵盤上的 Shift 鍵鍵 鼠標(biāo)鼠標(biāo) 消息消息 lParam包含了鼠標(biāo)位置包含了鼠標(biāo)位置 低位包含鼠標(biāo)位置的低位包含鼠標(biāo)位置的x坐標(biāo)值坐

45、標(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_LBUTTONDOWN: /按下鼠標(biāo)左鍵按下鼠標(biāo)左鍵 if(wParambreak; case WM_LBUTTONUP:case WM_LBUTTONUP:/釋放鼠標(biāo)左鍵釋放鼠標(biāo)左鍵 break; break; case WM_LBUTTONDOWN: /c

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

47、條消息或兩條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)生的消息 在注冊窗口類時必須在注冊窗口類時必須 具有具有CS_DBLCLKSCS_DBLCLKS屬性屬性 由于鼠標(biāo)移動的隨機(jī)性,如果要使某一個窗口能不間斷地由于鼠標(biāo)移動的隨機(jī)性,如果要使某一個窗口能不間斷地捕捕 獲鼠標(biāo)獲鼠標(biāo)消息,就必須對消息,就必

48、須對鼠標(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)的鍵盤功能就暫時失系統(tǒng)的鍵盤功能就暫時失 效,其它窗口也無法得到效,其它窗口也無法得到 鼠標(biāo)消息鼠標(biāo)消息 當(dāng)該窗口不再需要捕獲鼠標(biāo)消息時,應(yīng)及時調(diào)用當(dāng)該窗口不再需要捕獲鼠標(biāo)消息時,應(yīng)及時調(diào)用ReleaseCapture()以釋以釋 放鼠標(biāo),否則,其他窗口無法接收鼠標(biāo)信息。放鼠標(biāo),否則,其他窗口無法接收鼠標(biāo)信息。 菜單、滾動條菜單、滾動條 工具條和標(biāo)題條等處工具

49、條和標(biāo)題條等處 不由應(yīng)用程序處理不由應(yīng)用程序處理 而是送往函數(shù)而是送往函數(shù) DefWindowProc 用戶區(qū)以外用戶區(qū)以外 的地方產(chǎn)生的地方產(chǎn)生 的鼠標(biāo)事件的鼠標(biāo)事件 產(chǎn)生一個產(chǎn)生一個 非用戶區(qū)非用戶區(qū) 鼠標(biāo)消息鼠標(biāo)消息 6.4 鼠標(biāo)應(yīng)用程序?qū)嵗髽?biāo)應(yīng)用程序?qū)嵗?【例【例6-3】鼠標(biāo)輸入】鼠標(biāo)輸入 示范程序,本例介示范程序,本例介 紹如何響應(yīng)鼠標(biāo)信紹如何響應(yīng)鼠標(biāo)信 息、并改變光標(biāo)形息、并改變光標(biāo)形 狀等用法,用戶在狀等用法,用戶在 窗口的不同區(qū)域移窗口的不同區(qū)域移 動鼠標(biāo)時,光標(biāo)將動鼠標(biāo)時,光標(biāo)將 顯示如下圖所標(biāo)識顯示如下圖所標(biāo)識 的不同箭頭的形狀的不同箭頭的形狀 #include#incl

50、ude #include stdio.h#include LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAMLRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);); int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShowint WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,in

51、t nCmdShow) ) HWND hwnd; HWND hwnd;MSG MsgMSG Msg; ; WNDCLASS wndclass WNDCLASS wndclass; ; char lpszClassName char lpszClassName=窗口窗口; char lpszTitle char lpszTitle=My_Windows;=My_Windows; wndclass.style wndclass.style=0;=0; wndclass.lpszClassName=lpszClassName wndclass.lpszClassName=lpszClassName;

52、 ; if(!RegisterClass( MessageBeep(0); return FALSE; return FALSE; hwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEBhwnd=CreateWindow(lpszClassName,lpszTitle,WS_VISIBLE|WS_SYSMENU|WS_MINIMIZEB OX,50,50,450,450,NULL,NULL,hInstance,NULL);OX,50,50,450,450,NULL,NULL,hInstance,N

53、ULL); ShowWindow(hwnd,nCmdShow ShowWindow(hwnd,nCmdShow);); UpdateWindow(hwnd UpdateWindow(hwnd);); while(GetMessage( TranslateMessage( DispatchMessage(); return Msg.wParamreturn Msg.wParam; ; LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM LRESULT CALLBACK WndProc(HWND hwnd,UIN

54、T message,WPARAM wParam,LPARAM lParamlParam) ) PAINTSTRUCT psPAINTSTRUCT ps; ; HDC hdcHDC hdc; ; TEXTMETRIC tm;TEXTMETRIC tm; HBRUSH hbrushHBRUSH hbrush; ; HPEN hpenHPEN hpen; ; HCURSOR hcursorHCURSOR hcursor; ; char str15;char str15; static intstatic int x,y; x,y; switch(message)switch(message) cas

55、e WM_MOUSEMOVE:case WM_MOUSEMOVE: x=LOWORD(lParamx=LOWORD(lParam);); y=HIWORD(lParamy=HIWORD(lParam);); if(x50SetCursor(hcursor hcursor=LoadCursor(NULL,IDC_SIZENS);SetCursor(hcursor);); / /南北向箭頭南北向箭頭 hdc=GetDC(hwndhdc=GetDC(hwnd);); GetTextMetrics(hdc,); hbrush=(HBRUSH)GetStockObject(WHITE_BRUSHhbru

56、sh=(HBRUSH)GetStockObject(WHITE_BRUSH);); SelectObject(hdc,hbrushSelectObject(hdc,hbrush);); hpen=(HPEN)GetStockObject(WHITE_PENhpen=(HPEN)GetStockObject(WHITE_PEN);); SelectObject(hdc,hpenSelectObject(hdc,hpen);); Rectangle(hdc,5,5,tm.tmAveCharWidthRectangle(hdc,5,5,tm.tmAveCharWidth* *8,tm.tmHeigh

57、t+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,); break;break; case WM_PAINT:case WM_PAINT: hdc=BeginPaint(hwnd,); hpen=(HPEN)GetStockObject(BLACK_PENhpen=(HPEN)GetStockObject(BLACK_PEN);); Sele

58、ctObject(hdc,hpenSelectObject(hdc,hpen);); Rectangle(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

59、,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(hdc,250,350);LineTo(hdc,250,350); EndPaint(hwnd,); break;break; case WM_DESTROY:case WM_DESTROY: PostQuitMessage(0);PostQuitMessage(0); default: return DefWindo

60、wProc(hwnd,message,wParam,lParamdefault: return DefWindowProc(hwnd,message,wParam,lParam);); return(0);return(0); 【6-46-4】編寫一個鼠標(biāo)應(yīng)用程序,按下鼠標(biāo)左鍵在窗口中移動時,將按下左鍵時所在點(diǎn)】編寫一個鼠標(biāo)應(yīng)用程序,按下鼠標(biāo)左鍵在窗口中移動時,將按下左鍵時所在點(diǎn) 和當(dāng)前點(diǎn)所形成的矩形涂成灰色,此時光標(biāo)為十字型。當(dāng)抬起鼠標(biāo)左鍵時,將前面所繪和當(dāng)前點(diǎn)所形成的矩形涂成灰色,此時光標(biāo)為十字型。當(dāng)抬起鼠標(biāo)左鍵時,將前面所繪 制度矩形拉伸到整個窗口,拉伸過程中將光標(biāo)設(shè)置為沙漏型。然后,若

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論