版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、基本輸入鍵盤(pán)和鼠標(biāo)消息第二篇VC常用類、控件、資源篇第4章基本輸入鍵盤(pán)和鼠標(biāo)消息Windows采用的是事件驅(qū)動(dòng)機(jī)制,因此要讓程序完成一定功能,很多情況下用戶必須進(jìn)行干預(yù),告訴程序要干什么,這就要求用戶通過(guò)某種手段與計(jì)算機(jī)進(jìn)行交互。鼠標(biāo)和鍵盤(pán)是用戶與Windows應(yīng)用程序交換的最主要的交換設(shè)備。Windows預(yù)先定義了大量的鼠標(biāo)消息和鍵盤(pán)消息,而MFC也對(duì)其中的常用消息進(jìn)行了封裝。本章主要介紹在MFC應(yīng)用程序中,鍵盤(pán)和鼠標(biāo)消息的響應(yīng)與處理。4.1 鍵盤(pán)消息及其處理在Windows中,鍵盤(pán)輸入以消息的形式傳遞給程序的視窗消息處理程序。按下或釋放一個(gè)鍵均會(huì)產(chǎn)生一條消息,系統(tǒng)將其放到與鍵盤(pán)輸入窗口相對(duì)
2、應(yīng)的線程消息隊(duì)列中。4.1.1 鍵盤(pán)消息鍵盤(pán)消息有三種:鍵盤(pán)被按下、鍵盤(pán)被松開(kāi)(彈起、輸入字符。其中,輸入字符相當(dāng)于直接得到用戶輸入的字符,這在不需要處理按鍵細(xì)節(jié)時(shí)使用;而鍵盤(pán)被按下、松開(kāi)在按鍵狀態(tài)改變時(shí)發(fā)送。MFC對(duì)鍵盤(pán)的這三種鍵盤(pán)消息進(jìn)行了封裝,如表4.1所示。按鍵和釋放鍵消息通常是成對(duì)出現(xiàn)的,但如果用戶按住鍵到一定的時(shí)間就啟動(dòng)了鍵盤(pán)的自動(dòng)重復(fù)特性,系統(tǒng)就會(huì)產(chǎn)生一系列的WM_KEYDOWN消息,在用戶釋放一個(gè)鍵時(shí),才產(chǎn)生一條WM_KEYUP消息。4.1.2 鍵盤(pán)消息的處理一般來(lái)講,用戶輸入消息,如菜單選擇、鼠標(biāo)、鍵盤(pán)等,多在文檔/視圖結(jié)構(gòu)的應(yīng)用程序中使用。在MFC應(yīng)用程序開(kāi)發(fā)中,可以使用C
3、lassWizard為鍵盤(pán)消息和鼠標(biāo)消息添加消息映射和消息處理函數(shù)。在MFC文檔/視圖結(jié)構(gòu)的應(yīng)用程序中,視圖窗口和框架窗口均能處理鍵盤(pán)和鼠標(biāo)消息。當(dāng)有鍵盤(pán)或鼠標(biāo)消息產(chǎn)生時(shí),系統(tǒng)會(huì)先將消息發(fā)往視圖窗口,如果視圖類中沒(méi)有發(fā)現(xiàn)相應(yīng)的消息映射和處理函數(shù),就將該消息再發(fā)往框架窗口。所以在使用ClassWizard為鍵盤(pán)消息定義消息映射時(shí),定義在視圖71勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息表4.1 MFC中封裝的鍵盤(pán)消息鍵盤(pán)消息描述WM_KEYDOWN鍵盤(pán)按下WM_KEYUP鍵盤(pán)抬起WM_CHAR可打印字符鍵按下并抬起,輸入了一個(gè)字符類中就可以了。如果一個(gè)應(yīng)用同時(shí)擁有多個(gè)視圖,而當(dāng)前活動(dòng)
4、沒(méi)有對(duì)消息進(jìn)行處理,則消息會(huì)發(fā)往框架窗口。下面通過(guò)具體的實(shí)例講解鍵盤(pán)消息的映射及處理。4.1.3 按鍵消息的處理當(dāng)按下一個(gè)鍵或松開(kāi)一個(gè)鍵時(shí),將產(chǎn)生一個(gè)按鍵消息。在MFC中,WM_KEYDOWN和WM_KEYUP消息分別在按下一個(gè)鍵和松開(kāi)一個(gè)鍵時(shí)被激發(fā)。本節(jié)將創(chuàng)建一個(gè)單文檔應(yīng)用程序,當(dāng)用戶按下任意一個(gè)鍵時(shí),彈出對(duì)話框顯示相應(yīng)的提示信息。具體實(shí)現(xiàn)過(guò)程如下。1,使用MFC AppWizard創(chuàng)建SDI工程啟動(dòng)Visual C+6.0,執(zhí)行“File”“New”菜單命令,在“Projects”選項(xiàng)卡中,創(chuàng)建一個(gè)MFCAppWizardexe工程,工程名為“Ch5Demo1”,如圖4.1所示。單擊“OK
5、”按鈕,在“MFC AppWizard Step 1”對(duì)話框中,選中“Single document”,即基于單文檔的MFC工程,其余的幾步向?qū)?duì)話框均采用默認(rèn)設(shè)置。2,添加WM_KEYDOWN消息映射和響應(yīng)函數(shù)執(zhí)行“View”“ClassWizard”菜單命令,或者使用【Ctrl+W】快捷鍵,打開(kāi)“MFCClassWizard”對(duì)話框。在“Message Maps”選項(xiàng)卡的“Class name”列表框中選擇要響應(yīng)鍵盤(pán)消息的類“CCh5Demo1View”,在“Object IDs”列表框中選擇“CCh5Demo1View”,在“Messages”列表框中選擇“WM_KEYDOWN”按鍵消息
6、。單擊“Add Function”按鈕,ClassWizard自動(dòng)為WM_KEYDOWN添加了ON_ WM_KEYDOWN消息映射宏和OnKeyDown(消息處理函數(shù),如圖4.2所示。此時(shí),在“Ch5Demo1View.cpp”資源文件的開(kāi)始部分會(huì)發(fā)現(xiàn)自動(dòng)添加的消息映射代碼:BEGIN_MESSAGE_MAP(CCh5Demo1View,CView/AFX_MSG_MAP(CCh5Demo1ViewON_WM_KEYDOWN( /消息映射代碼/AFX_MSG_MAP72勵(lì)志照亮人生編程改變命運(yùn)零基礎(chǔ)學(xué)Visual C+圖4.1,New”對(duì)話框圖4.2,MFC ClassWizard”對(duì)話框/
7、Standard printing commandsEND_MESSAGE_MAP(在“Ch5Demo1View.h”頭文件,自動(dòng)添加了消息處理函數(shù)OnKeyDown(的聲明代碼如下:protected:/AFX_MSG(CCh5Demo1Viewafx_msg void OnKeyDown(UINT nChar,UINTnRepCnt,UINT nFlags;/AFX_MSG3,手工添加函數(shù)的實(shí)現(xiàn)代碼在ClassWizard對(duì)話框(圖4.2中,單擊“Edit Code”按鈕,在工作區(qū)中,即跳轉(zhuǎn)至新增函數(shù)代碼的定義處。這時(shí),需要手工添加OnDrawcircle(函數(shù)的實(shí)現(xiàn)代碼,如下:void
8、CCh5Demo1View:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags/ TODO,Add your message handler code here and/or call defaultAfxMessageBox("用戶按下了鍵!" /彈出提示對(duì)話框CView:OnKeyDown(nChar,nRepCnt,nFlags;這里只添加了一行代碼,實(shí)現(xiàn)彈出提示對(duì)話框。編譯運(yùn)行程序后,若用戶按下鍵盤(pán)的任意鍵,就會(huì)彈出提示對(duì)話框,如圖4.3所示。WM_KEYUP消息的消息映射和處理過(guò)程與WM_KEYDOWN的完全相同。4.1.4
9、 按鍵消息處理函數(shù)從上一節(jié)實(shí)例可見(jiàn),MFC會(huì)將WM_KEYDOWN消息映射為ON_WM_KEYDOWN,而對(duì)應(yīng)的處理函數(shù)為OnKeyDown(。同樣,WM_KEYUP消息對(duì)應(yīng)的處理函數(shù)為OnKeyUp(。它們具有完全相同的參數(shù),聲明如下:void OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags;void OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags;參數(shù)nChar表示按鍵的虛擬鍵碼。如“VK_ALT”,表示按下的鍵為【Alt】鍵,“VK_CONTROL”表示按下的鍵為【Ctrl】鍵。Windows中常用的虛擬
10、鍵碼及其對(duì)應(yīng)的按鍵如表4.2所示。表4.2 Windows常用的虛擬鍵碼及其對(duì)應(yīng)的按鍵虛擬鍵碼數(shù)值對(duì)應(yīng)的鍵虛擬鍵碼數(shù)值對(duì)應(yīng)的鍵VK_LBUTTON 1鼠標(biāo)左鍵VK_BACK 8退格鍵VK_RBUTTON 2鼠標(biāo)右鍵VK_TAB 9制表鍵VK_MBUTTON 4鼠標(biāo)中鍵VK_RETURN 13回車(chē)鍵VK_SHIFT 16 Shift鍵VK_CONTROL 17 Ctrl鍵73勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息圖4.3 程序運(yùn)行結(jié)果(續(xù)虛擬鍵碼數(shù)值對(duì)應(yīng)的鍵虛擬鍵碼數(shù)值對(duì)應(yīng)的鍵VK_MENU 18 Alt鍵VK_PAUSE 19 Pause鍵VK_CAPTIAL 20 Caplo
11、ck鍵VK_ESCAPE 27 Esc鍵VK_PRIOR 33 Page Up鍵VK_NEXT 34 Page Down鍵VK_END 35 End鍵VK_HOME 36 Home鍵VK_LEFT 37左箭頭鍵VK_RIGHT 39右箭頭鍵VK_UP 38上箭頭鍵VK_DOWN 40下箭頭鍵48?57 0?9鍵65?90 A?Z鍵VK_SPACE 32空格鍵VK_SNAPSHOT 44 Print Screen鍵VK_INSERT 45 Insert鍵VK_DELETE 46 Delete鍵112?135功能鍵F1?F24 VK_NUMLOCK 144 NumLock鍵使用虛擬鍵碼時(shí),可以使用
12、鍵碼也可以直接使用其數(shù)值。如判斷按鍵是否為回車(chē)鍵時(shí),可以采用“if(nChar = VK_RETURN”語(yǔ)句,也可采用“if(nChar = 13”語(yǔ)句。說(shuō)明虛擬鍵碼是Windows內(nèi)部建立的設(shè)備無(wú)關(guān)的鍵盤(pán)代碼。在Windows中不論使用什么類型的鍵盤(pán),都將掃描代碼翻譯成同一的虛擬鍵碼,這樣應(yīng)用程序就不用直接同硬盤(pán)硬件打交道。參數(shù)nRepCnt表示按鍵的重復(fù)次數(shù),即長(zhǎng)時(shí)間按住一個(gè)鍵時(shí),相當(dāng)于按鍵的次數(shù)。參數(shù)nFlags中的不同位代表不同的含義,包括鍵盤(pán)掃描碼、擴(kuò)展鍵盤(pán)標(biāo)志、描述碼、鍵的先前狀態(tài)和轉(zhuǎn)換狀態(tài)標(biāo)志等,一般很少用到。根據(jù)按鍵消息響應(yīng)函數(shù)各參數(shù)的值,可以判斷按鍵的相關(guān)信息,便于進(jìn)行靈活的
13、程序開(kāi)發(fā)。下面給出一個(gè)具體應(yīng)用實(shí)例。實(shí)例功能:當(dāng)用戶同時(shí)按住【Ctrl】鍵和【F8】鍵時(shí),激發(fā)某一操作,即彈出提示對(duì)話框。實(shí)現(xiàn)過(guò)程如下。1,使用MFC AppWizard創(chuàng)建SDI工程按照4.1.3節(jié)介紹的“Ch5Demo1”工程的創(chuàng)建過(guò)程,創(chuàng)建MFC SDI工程“Ch5Demo2”。2,添加WM_KEYDOWN和WM_UP消息映射和響應(yīng)函數(shù)同樣,利用ClassWizard,分別為視圖類CCh5Demo2View添加WM_KEYDOWN、WM_UP消息映射和消息處理函數(shù)。3,手工添加實(shí)現(xiàn)代碼(1在視圖類CCh5Demo2View的頭文件“Ch5Demo2View.h”中,定義兩個(gè)布爾變量,分別
14、用于記錄【Ctrl】鍵和【F8】鍵的狀態(tài):按下時(shí)為“true”,釋放后為“false”。代碼如下:public:BOOL b_Ctrldown,b_F8down;(2在CCh5Demo2View類的構(gòu)造函數(shù)中,初始化變量為“false”。代碼如下:CCh5Demo2View:CCh5Demo2View(74勵(lì)志照亮人生編程改變命運(yùn)零基礎(chǔ)學(xué)Visual C+/ TODO,add construction code hereb_Ctrldown=false; /初始化b_F8down=false; /初始化(3在WM_KEYDOWN消息響應(yīng)函數(shù)onkeyDown(中,實(shí)現(xiàn)按鍵狀態(tài)的賦值,并在滿足條
15、件的情況下,彈出提示對(duì)話框。代碼如下:void CCh5Demo2View:OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags/ TODO,Add your message handler code here and/or call defaultif(nChar=VK_CONTROL /如果按下了【Ctrl】鍵b_Ctrldown=true;if(nChar=VK_F8 /如果按下了【F8】鍵b_F8down=true;if(b_Ctrldown&&b_F8down /同時(shí)按下了【Ctrl】鍵和【F8】鍵b_Ctrldown=false
16、;b_F8down=false;AfxMessageBox("同時(shí)按下了Ctrl鍵和F8鍵" /彈出提示框CView:OnKeyDown(nChar,nRepCnt,nFlags;(4在WM_KEYUP消息響應(yīng)函數(shù)Onkeyup(中,實(shí)現(xiàn)按鍵狀態(tài)的賦值。代碼如下:void CCh5Demo2View:OnKeyUp(UINT nChar,UINT nRepCnt,UINT nFlags/ TODO,Add your message handler code here and/or call defaultif(nChar=VK_CONTROL /如果釋放了【Ctrl】鍵b_
17、Ctrldown=false;if(nChar=VK_F8 /如果釋放了【F8】鍵b_F8down=false;CView:OnKeyUp(nChar,nRepCnt,nFlags;所示。75勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息圖4.4 程序運(yùn)行結(jié)果4.1.5 字符消息的處理當(dāng)按下一個(gè)可顯示的字符(數(shù)字、字母、標(biāo)點(diǎn)等的鍵時(shí),除了產(chǎn)生按下鍵消息WM_KEYDOWN外,還將產(chǎn)生一個(gè)字符消息WM_CHAR。當(dāng)然,如果釋放該鍵,還將產(chǎn)生WM_KEYUP消息。用戶敲擊一個(gè)一個(gè)字符鍵后,其產(chǎn)生的消息及處理函數(shù)的執(zhí)行順序如圖4.5所示。圖4.5 鍵盤(pán)消息的處理過(guò)程MFC將WM_CHAR消息
18、映射為ON_WM_CHAR,其對(duì)應(yīng)的處理函數(shù)為OnChar(。函數(shù)OnChar(的定義如下:void OnChar(UINT nChar,UINT nRepCnt,UINT nFlags其中參數(shù)nRepCnt和nFlags的含義與4.1.3節(jié)介紹的OnKeyDown函數(shù)的完全相同。而參數(shù)nChar存放的不再是按鍵的虛擬鍵碼,而是Windows字符集的字符代碼,默認(rèn)為ASCII碼。鍵盤(pán)上常見(jiàn)的字符及其ASCII碼值如表4.3所示。表4.3 常見(jiàn)的字符及其ASCII碼值字符符號(hào)ASCII碼值字符符號(hào)ASCII碼值字符符號(hào)ASCII碼值!33 "34 # 35$36 % 7 & 8
19、'39 (40 41*42 + 3,-45,46 / 4776勵(lì)志照亮人生編程改變命運(yùn)零基礎(chǔ)學(xué)Visual C+E用戶敲擊字符按鍵處理函數(shù)鍵盤(pán)消息(續(xù)字符符號(hào)ASCII碼值字符符號(hào)ASCII碼值字符符號(hào)ASCII 碼值09 4857,58 ; 596263 64 AZ 659091 92 9394 _ 5 6az 97122 123 | 124 125 126如果nChar取值為64,則表示按鍵字符為“”。下面給出一個(gè)在視圖窗口中,顯示鍵盤(pán)輸入字符的實(shí)例。該實(shí)例實(shí)現(xiàn)的功能是在單文檔應(yīng)用程序界面中,當(dāng)用戶通過(guò)鍵盤(pán)鍵入字符時(shí),在視圖窗口依次顯示鍵入的字符。當(dāng)用戶按下【Enter】鍵時(shí),進(jìn)行
20、換行輸出。具體實(shí)現(xiàn)過(guò)程如下。1,使用MFC AppWizard創(chuàng)建SDI工程按照4.1.3節(jié)介紹的“Ch5Demo1”工程的創(chuàng)建過(guò)程,創(chuàng)建MFC SDI工程“Ch5Demo3”。2,添加WM_CHAR消息映射和響應(yīng)函數(shù)執(zhí)行“View”“ClassWizard”菜單命令,或者使用【Ctrl+W】快捷鍵,打開(kāi)“MFCClassWizard”對(duì)話框。在“Message Maps”選項(xiàng)卡的“Class name”列表框中選擇要響應(yīng)鍵盤(pán)消息的類“CCh5Demo3View”,在“Object IDs”列表框中選擇“CCh5Demo3View”,在“Messages”列表框中選擇“WM_CHAR”字符按鍵
21、消息。單擊“Add Function”按鈕,ClassWizard自動(dòng)為WM_CHAR 添加了ON_ WM_CHAR消息映射宏和OnChar(消息處理函數(shù),如圖4.6所示。圖4.6,MFC ClassWizard”對(duì)話框77勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息3,手工添加實(shí)現(xiàn)代碼(1在視圖類CCh5Demo3View的頭文件“Ch5Demo3View.h”中,定義CPoint型變量,用于記錄字符在視圖窗口中的輸出位置。代碼如下:public:CPoint ptCharacter; /記錄字符位置(2在CCh5Demo3View類的構(gòu)造函數(shù)中,初始化ptCharacter位置為
22、(0,0。代碼如下:CCh5Demo3View:CCh5Demo3View(/ TODO,add construction code here/初始位置設(shè)置在(0,0ptCharacter.x=0;ptCharacter.y=0;(3在WM_CHAR消息響應(yīng)函數(shù)OnChar(中,實(shí)現(xiàn)字符的顯示以及換行。代碼如下:void CCh5Demo3View:OnChar(UINT nChar,UINT nRepCnt,UINT nFlags/ TODO,Add your message handler code here and/or call defaultif(nChar=13 /按下了回車(chē)鍵/換
23、行ptCharacter.x=0;ptCharacter.y=ptCharacter.y+25;elseCClientDC dc(this;dc.TextOut(ptCharacter.x,ptCharacter.y,(LPCTSTR&nCh ar; /輸出顯示字符CSize textsize;textsize=dc.GetTextExtent(LPCTSTR&nChar; /獲取當(dāng)前字符大小/前進(jìn)到下一個(gè)字符位置ptCharacter.x=ptCharacter.x+textsize.cx;CView:OnChar(nChar,nRepCnt,nFlags;編譯運(yùn)行程序后,當(dāng)
24、用戶通過(guò)鍵盤(pán)鍵入字符時(shí),即會(huì)在視圖窗口輸出顯示。如果按下了【Ente】鍵,將換行輸出,如圖4.7所示。說(shuō)明本程序只是簡(jiǎn)單演示了WM_CHAR消息響應(yīng)和按鍵字符的顯示操作,并沒(méi)有實(shí)現(xiàn)窗口的重繪。另外,實(shí)際程序如果涉及文本輸入、編輯操作,則是通過(guò)Edit控件和CEditView視圖來(lái)實(shí)現(xiàn)的。78勵(lì)志照亮人生編程改變命運(yùn)零基礎(chǔ)學(xué)Visual C+圖4.7 程序運(yùn)行結(jié)果4.1.6 創(chuàng)建鍵盤(pán)插入符鍵盤(pán)插入符(Caret是一個(gè)閃爍的位圖(通常是一個(gè)細(xì)的垂直杠,它可使用戶知道在窗口何處可進(jìn)行有效的鍵盤(pán)輸入。CWnd類提供了8個(gè)創(chuàng)建和管理鍵盤(pán)插入符的成員函數(shù),如表4.4所示。Windows總是把鍵盤(pán)消息送到擁
25、有輸入焦點(diǎn)的窗口。一般情況下,一個(gè)應(yīng)用程序有多個(gè)窗口,而鍵盤(pán)消息只能被一個(gè)窗口接收,接收鍵盤(pán)消息的窗口稱為有“輸入焦點(diǎn)”的窗口,具有輸入焦點(diǎn)的窗口稱為活動(dòng)窗口。當(dāng)某一個(gè)窗口成為活動(dòng)窗口時(shí),Windows會(huì)加亮顯示其標(biāo)題欄或窗口邊框。Windows用WM_SETFOCUS和WM_KILLFOCUS消息通知即將通知接收或失去輸入焦點(diǎn)的窗口。MFC分別對(duì)這兩個(gè)消息進(jìn)行了封裝。在窗口獲得鍵盤(pán)焦點(diǎn)時(shí),就可以創(chuàng)建插入符了,若窗口沒(méi)有焦點(diǎn),就不能進(jìn)行鍵盤(pán)輸入。另外,插入符一旦創(chuàng)建起來(lái),還要在窗口中對(duì)其進(jìn)行定位和顯示。下面通過(guò)具體的實(shí)例講解插入符的使用。下面在4.1.5節(jié)創(chuàng)建的“CCh5Demo3”實(shí)例的基礎(chǔ)
26、上,在字符將要顯示的位置顯示插入符。其具體實(shí)現(xiàn)過(guò)程如下?!癈h5Demo3”工程文件“Ch5Demo3.dsw”。2,添加WM_SETFOCUS消息映射和響應(yīng)函數(shù)執(zhí)行“View”“ClassWizard”菜單命令,或者使用【Ctrl+W】快捷鍵,打開(kāi)“MFCClassWizard”對(duì)話框。在“Message Maps”選項(xiàng)卡中的“Class name”列表框中選擇要響應(yīng)捕獲窗口消息的類“CCh5Demo3View”,在“Object IDs”列表框中選擇“CCh5Demo3View”,在“Messages”列表框中選擇“WM_SETFOCUS”捕獲窗口消息。單擊“Add Function”按鈕
27、,ClassWizard自動(dòng)為WM_SETFOCUS添加了ON_WM_SETFOCUS消息映射宏和OnSetFocus(消息處理函數(shù),如圖4.8所示。3,手工添加實(shí)現(xiàn)代碼(1在WM_SETFOCUS消息響應(yīng)函數(shù)OnSetFocus(中,實(shí)現(xiàn)插入符的創(chuàng)建與顯示。代碼如下:void CCh5Demo3View:OnSetFocus(CWnd* pOldWnd79勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息表4.4 創(chuàng)建和管理鍵盤(pán)插入符的CWnd成員函數(shù)函數(shù)功能CreateCaret使用用戶提供的位圖創(chuàng)建插入符CreateGrayCaret創(chuàng)建用戶定義大小的實(shí)心灰色插入符CreateSol
28、idCaret創(chuàng)建用戶定義大小的實(shí)心黑色插入符DestoryCaret銷毀插入符ShowCaret顯示插入符HideCaret隱藏插入符GetCaretPos返回插入符的位置SetCaretPos移動(dòng)插入符到窗口的某一位置圖4.8,MFC ClassWizard”對(duì)話框CView:OnSetFocus(pOldWnd;/ TODO,Add your message handler code here CreateSolidCaret(4,20; /創(chuàng)建插入符SetCaretPos (ptCharacter; /將插入符移到當(dāng)前字符輸入點(diǎn)ShowCaret (; /顯示插入符(2修改OnChar
29、(函數(shù),在適當(dāng)?shù)臅r(shí)機(jī)顯示、隱藏插入符。代碼如下:void CCh5Demo3View:OnChar(UINT nChar,UINTnRepCnt,UINT nFlags/ TODO,Add your message handler code here and/or call defaultif(nChar=13 /按下了回車(chē)鍵/換行ptCharacter.x=0;ptCharacter.y=ptCharacter.y+25;SetCaretPos (ptCharacter; /將插入符移到鍵入點(diǎn)ShowCaret (; /顯示插入符elseCClientDC dc(this;HideCaret
30、 (; /隱藏插入符dc.TextOut(ptCharacter.x,ptCharacter.y,(LPCTSTR&nCh ar;/顯示字符CSize textsize;textsize=dc.GetTextExtent(LPCTSTR&nChar; /獲取當(dāng)前字符大小/前進(jìn)到下一個(gè)字符位置ptCharacter.x=ptCharacter.x+textsize.cx;SetCaretPos (ptCharacter; /將插入符移到鍵入點(diǎn)ShowCaret (; /顯示插入符CView:OnChar(nChar,nRepCnt,nFlags;編譯運(yùn)行程序后,會(huì)發(fā)現(xiàn)與原程序相比
31、,在字符的輸入位置增加了插入符,如圖4.9所示。圖4.9 程序運(yùn)行結(jié)果80勵(lì)志照亮人生編程改變命運(yùn)零基礎(chǔ)學(xué)Visual C+4.2 鼠標(biāo)消息及其處理鼠標(biāo)消息是應(yīng)用程序開(kāi)發(fā)中常需要處理的消息,當(dāng)鼠標(biāo)移動(dòng)、左鍵(右鍵的按下或者松開(kāi)、雙擊操作等都可以產(chǎn)生相應(yīng)的鼠標(biāo)消息。4.2.1 鼠標(biāo)消息在Windows中,鼠標(biāo)消息分為兩類:客戶區(qū)鼠標(biāo)消息和非客戶區(qū)鼠標(biāo)消息,其中包含了大量的鼠標(biāo)消息。而在MFC中,只對(duì)其中常用的幾種鼠標(biāo)消息進(jìn)行了封裝,如表4.5所示。利用ClassWizard可以輕松地為這些消息添加消息映射和消息處理函數(shù)。4.2.2 鼠標(biāo)消息處理函數(shù)與鍵盤(pán)消息相同,當(dāng)使用ClassWizard為鼠
32、標(biāo)消息添加消息映射時(shí),系統(tǒng)自動(dòng)為其添加了處理函數(shù)。消息處理函數(shù)就是在消息名前去除“WM_”前綴,換成“on”前綴,如對(duì)消息WM_LBUTTONDOWN,消息映射宏的處理函數(shù)為OnLButtonDown(,其聲明如下: afx_msg void OnLButtonDown(UINT nFlags,CPoint point ; 參數(shù)nFlags表明了當(dāng)前一些按鍵的消息,其可取值如表4.6所示??梢酝ㄟ^(guò)“位與”操作進(jìn)行相關(guān)檢測(cè)。在實(shí)際編程中,常使用nFlags參數(shù)指出消息生成時(shí)的鼠標(biāo)鍵以及【Shift】鍵和【Ctrl】鍵的狀態(tài),如當(dāng)按下鼠標(biāo)左鍵時(shí),同時(shí)檢測(cè)【Shift】鍵和【Ctrl】鍵的狀態(tài),可采
33、用下面的代碼:void OnLButtonDown(UINT nFlags,CPoint point /按下了鼠標(biāo)左鍵if(nFlags &MK_CONTROL&&( nFlags &MK_SHIFT /【Shift】和【Ctrl】鍵都被按下.參數(shù)point表示當(dāng)前鼠標(biāo)的設(shè)備坐標(biāo),坐標(biāo)原點(diǎn)對(duì)應(yīng)屏幕左上角。通過(guò)point參數(shù)可以將鼠標(biāo)操作與屏幕顯示對(duì)應(yīng)起來(lái)。而其他鼠標(biāo)消息處理函數(shù)的參數(shù)及含義與OnLButtonDown(函數(shù)完全相同。4.2.3 鼠標(biāo)消息處理實(shí)例本節(jié)將通過(guò)一個(gè)具體的實(shí)例講解程序設(shè)計(jì)中鼠標(biāo)的使用。實(shí)例實(shí)現(xiàn)的功能為當(dāng)用戶在視圖窗口中按下鼠標(biāo)左鍵,拖動(dòng)鼠
34、標(biāo)時(shí),在窗口中繪制一個(gè)隨鼠標(biāo)位置變化的矩形,當(dāng)釋放鼠標(biāo)鍵時(shí),停止矩形繪制。具體開(kāi)發(fā)過(guò)程如下。81勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息表4.5 MFC封裝的鼠標(biāo)消息及處理函數(shù)鼠標(biāo)消息描述WM_LBUTTONDOWN按下鼠標(biāo)左鍵WM_LBUTTONUP松開(kāi)鼠標(biāo)左鍵WM_LBUTTONDBLCLK雙擊鼠標(biāo)左鍵WM_RBUTTONDOWN按下鼠標(biāo)右鍵WM_RBUTTONUP松開(kāi)鼠標(biāo)右鍵WM_RBUTTONDBLCLK雙擊鼠標(biāo)右鍵WM_MOUSEMOVE鼠標(biāo)移動(dòng)WM_MOUSEWHEEL鼠標(biāo)滾輪滾動(dòng)表4.6 nFlags參數(shù)的可能取值及含義鼠標(biāo)消息描述MK_LBUTTON按下了鼠標(biāo)的左
35、鍵MK_MBUTTON按下了鼠標(biāo)的中鍵MK_RBUTTON按下了鼠標(biāo)的右鍵MK_CONTROL按下了鍵盤(pán)上的【Ctrl】鍵MK_SHIFT按下了鍵盤(pán)上的【Shift】鍵WM_RBUTTONDBLCLK雙擊鼠標(biāo)右鍵1,使用MFC AppWizard創(chuàng)建SDI工程啟動(dòng)Visual C+6.0,執(zhí)行“File”“New”菜單命令,在“Project”選項(xiàng)卡中,創(chuàng)建一個(gè)MFCAppWizardEXE工程,工程名為“Ch5Demo4”。在“MFC AppWizard Step 1”對(duì)話框中,選中“Single document”,即基于單文檔的MFC工程,其余的幾步向?qū)?duì)話框均采用默認(rèn)設(shè)置。2,添加鼠標(biāo)
36、消息映射和響應(yīng)函數(shù)執(zhí)行“View”“ClassWizard”菜單命令項(xiàng),或者使用【Ctrl+W】快捷鍵,打開(kāi)“MFC ClassWizard”對(duì)話框。在對(duì)話框的“Message Maps”選項(xiàng)卡中的“Class name”列表框中選擇要響應(yīng)鼠標(biāo)消息的類“CCh5Demo4View”,在“Object IDs”列表框中選擇“CCh5Demo4View”,在“Messages”列表框中選擇“WM_LBUTTONDOWN”鼠標(biāo)消息,如圖4.10所示。圖4.10,MFC ClassWizard”對(duì)話框單擊“Add Function”按鈕,即在視圖類“CCh5Demo4View”中添加了消息處理函數(shù)On
37、LButtonDown(。用同樣的方法,添加WM_LBUTTONUP和On_MouseMove(消息映射和消息處理函數(shù)。3,為CCh5Demo4View類添加成員函數(shù)在工作區(qū)窗口的“ClassView”標(biāo)簽欄中,右擊“CCh5Demo4View”,在彈出菜單中執(zhí)行“AddMember Function”命令,如圖4.11所示。在彈出的“Add Member Function”對(duì)話框中,輸入函數(shù)的類型、名稱等信息,如圖4.12所示。單擊“OK”按鈕,即在視圖類“CCh5Demo4View”中添加一個(gè)成員函數(shù)DrawRect(。82勵(lì)志照亮人生編程改變命運(yùn)零基礎(chǔ)學(xué)Visual C+圖4.11 執(zhí)行
38、添加成員變量命令4,手工添加實(shí)現(xiàn)代碼(1在視圖類CCh5Demo4View的頭文件“Ch5Demo4View.h”中,定義三個(gè)變量,記錄相應(yīng)的狀態(tài)。代碼如下:public:BOOL fDowned; /是否在拉動(dòng)CPoint ptDown; /鼠標(biāo)左鍵按下位置CPoint ptUp; /鼠標(biāo)左鍵松開(kāi)位置(2在CCh5Demo4View類的構(gòu)造函數(shù)中,初始化變量。代碼如下:CCh5Demo4View:CCh5Demo4View(/ TODO,add construction code here/初始化定義的變量fDowned=false;ptDown.x=0;ptDown.y=0;ptUp.x=
39、0;ptUp.y=0;(3分別添加DrawRect(、OnLButtonDown(、OnLButtonUp(和OnMouseMove(函數(shù)的實(shí)現(xiàn)代碼。如下: void CCh5Demo4View:DrawRect(CClientDC dc(this; /獲取DCCRect rect;GetClientRect(rect; /獲取客戶窗口區(qū)域CBrush brush(RGB(255,255,255;dc.FillRect(rect,&brush; /填充背景色為白色dc.Rectangle(ptDown.x,ptDown.y,ptUp.x,ptUp.y; /繪制矩形void CCh5De
40、mo4View:OnLButtonDown(UINTnFlags,CPoint point/ TODO,Add your message handler code here and/or call defaultfDowned=TRUE;ptUp=ptDown=point;CView:OnLButtonDown(nFlags,point;void CCh5Demo4View:OnLButtonUp(UINT nFlags,CPoint point/ TODO,Add your message handler code here and/or call defaultif(fDownedptUp
41、=point;DrawRect(; /畫(huà)新矩形fDowned=FALSE;83勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息圖4.12 添加成員函數(shù)CView:OnLButtonUp(nFlags,point;void CCh5Demo4View:OnMouseMove(UINTnFlags,CPoint point/ TODO,Add your message handler code here and/or call defaultif(fDownedptUp=point;DrawRect(; /畫(huà)新矩形CView:OnMouseMove(nFlags,point;編譯運(yùn)行程序,按
42、下鼠標(biāo)左鍵,拖動(dòng)鼠標(biāo)就可以實(shí)現(xiàn)繪制矩形,如圖4.13所示。圖4.13 程序運(yùn)行結(jié)果4.2.4 鼠標(biāo)光標(biāo)的創(chuàng)建與使用鼠標(biāo)光標(biāo)(Cursor是鼠標(biāo)與用戶之間的接口,它指示鼠標(biāo)的位置,隨鼠標(biāo)移動(dòng)而移動(dòng),是鼠標(biāo)的屏幕映像。在Visual C+創(chuàng)建的應(yīng)用程序中,鼠標(biāo)都采用系統(tǒng)默認(rèn)的光標(biāo),當(dāng)然用戶也可以通過(guò)編程使用自己的光標(biāo)。光標(biāo)的使用主要有兩個(gè)步驟:創(chuàng)建光標(biāo)和設(shè)置光標(biāo)。1,創(chuàng)建光標(biāo)Window系統(tǒng)提供了十幾種標(biāo)準(zhǔn)光標(biāo),如IDC_APPSTARTING、IDC_ARROW、IDC_CROSS、IDC_WAIT等等。一般情況下,使用這些光標(biāo)就足以滿足程序的需要。當(dāng)然,用戶也可以自己創(chuàng)建光標(biāo)。在Visual
43、C+中,執(zhí)行“Insert”“Resource”菜單命令,在彈出的“Insert Resource”對(duì)話框中,選擇“Cursor”選項(xiàng),單擊“New”按鈕,即進(jìn)入光標(biāo)的編輯窗口,如圖4.14所示。在光標(biāo)編輯窗口中,可以繪制需要的光標(biāo)圖形。在繪制窗口中,有一個(gè)熱點(diǎn)設(shè)置按鈕,在它旁邊顯示熱點(diǎn)設(shè)置的坐標(biāo)。單擊這個(gè)按鈕,在光標(biāo)編輯器中出現(xiàn)一個(gè)十字光標(biāo),將十字中心放在需要設(shè)定的熱點(diǎn)位置,單擊鼠標(biāo)左鍵即可,如圖4.15所示。84勵(lì)志照亮人生編程改變命運(yùn)零基礎(chǔ)學(xué)Visual C+2,設(shè)置光標(biāo)使用API函數(shù)SetCursor(可以設(shè)置當(dāng)前使用的光標(biāo)資源。如果要采用Window系統(tǒng)提供的標(biāo)準(zhǔn)光標(biāo)資源,首先需要使
44、用函數(shù)LoadStandardCursor(載入系統(tǒng)標(biāo)準(zhǔn)光標(biāo)資源。如:HCURSORcusor=AfxGetApp(->LoadStandardCursor(IDC_SIZENS; /獲取系統(tǒng)標(biāo)準(zhǔn)光標(biāo)SetCursor(cusor; /設(shè)置光標(biāo)如果要載入用戶繪制的光標(biāo)資源,則需要在PreCreateWindow(函數(shù)中,通過(guò)API函數(shù)LoadImage(函數(shù)將光標(biāo)載入程序,而后在需要時(shí)通過(guò)函數(shù)SetCursor(設(shè)置光標(biāo)。首先需要聲明一個(gè)HCURSOR變量,如下:HCURSOR m_cursor;在PreCreateWindow(函數(shù)中,將自定義的光標(biāo)賦予m_cursor:m_curso
45、r=(HCURSOR:LoadImage(cs.hInstance,MAKEI NTRESOURCE(IDC_CURSOR1,IMAGE_CURSOR,32,32,LR_CREATEDIBSECTION;其中,IDC_CURSOR1為創(chuàng)建的光標(biāo)資源的資源ID。在需要使用該光標(biāo)的時(shí)候,就可以使用下面語(yǔ)句調(diào)用該光標(biāo): SetCursor(m_cursor;技巧在實(shí)際編程中,用戶需要使光標(biāo)“消失”,即隱藏光標(biāo),這時(shí)候使用ShowCursor(false語(yǔ)句實(shí)現(xiàn)。下面在4.2.3節(jié)創(chuàng)建的“Ch5Demo4”實(shí)例中,實(shí)現(xiàn)當(dāng)拖動(dòng)鼠標(biāo)繪制矩形時(shí),更改鼠標(biāo)光標(biāo)為十字光標(biāo)。此時(shí),只需在OnMouseMove(函
46、數(shù)中實(shí)現(xiàn)新的光標(biāo)的創(chuàng)建與顯示即可。代碼如下:void CCh5Demo4View:OnMouseMove(UINTnFlags,CPoint point/ TODO,Add your message handler code here and/or call defaultif(fDownedHCURSORcusor=AfxGetApp( ->LoadStandardCursor(IDC_CROSS; /獲取系統(tǒng)標(biāo)準(zhǔn)光標(biāo)SetCursor(cusor; /設(shè)置光標(biāo)ptUp=point;DrawRect(; /畫(huà)新矩形85勵(lì)志照亮人生編程改變命運(yùn)第5 章基本輸入鍵盤(pán)和鼠標(biāo)消息圖4.14,Insert Resource”對(duì)話框圖4.15 編輯設(shè)計(jì)光標(biāo)窗口CView:OnMouseMove(nFlags,point;此時(shí),編譯運(yùn)行程序,當(dāng)繪制矩形時(shí),鼠標(biāo)光標(biāo)如圖4.16所示。4.2.5 捕捉鼠標(biāo)在前面開(kāi)發(fā)的“CCh5Demo4”中, 當(dāng)按下鼠標(biāo) 左鍵, 拖動(dòng)鼠標(biāo)到視圖窗口以外后,再釋放鼠標(biāo)左鍵,此時(shí)釋放左 鍵的消息在 CCh5Demo4View 類中無(wú)法捕捉到。 因此雖然已 經(jīng)釋放了
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 施工組織設(shè)計(jì)b課程設(shè)計(jì)
- 鄉(xiāng)村小學(xué)無(wú)人機(jī)課程設(shè)計(jì)
- 支板課程設(shè)計(jì)裝
- 突堤式碼頭課程設(shè)計(jì)
- 2024陜西省安全員B證考試題庫(kù)
- 智能化制造機(jī)理課程設(shè)計(jì)
- 紡織廠固廢課程設(shè)計(jì)
- 籃球比分課程設(shè)計(jì)
- 機(jī)構(gòu)引流課程設(shè)計(jì)
- 2024年終止橋梁工程承包協(xié)議書(shū)樣本3篇
- 2024年香港中旅國(guó)際投資有限公司招聘筆試參考題庫(kù)含答案解析
- 公交調(diào)度培訓(xùn)課件
- 倫理學(xué)全套課件
- Zippo-2024年美版年冊(cè)集合
- 畫(huà)法幾何及機(jī)械制圖課件
- 新產(chǎn)品、新技術(shù)、新工藝、新材料的應(yīng)用
- 棋牌游戲自審自查報(bào)告
- JJF 2088-2023大型蒸汽滅菌器溫度、壓力、時(shí)間參數(shù)校準(zhǔn)規(guī)范
- 電磁彈射技術(shù)
- 讀后續(xù)寫(xiě)微技能Toshownottotell課件高三英語(yǔ)一輪復(fù)習(xí)寫(xiě)作專項(xiàng)
- 幼兒園食堂食品安全主體責(zé)任風(fēng)險(xiǎn)管控清單(日管控)
評(píng)論
0/150
提交評(píng)論