《windows程序設(shè)計08》由會員分享,可在線閱讀,更多相關(guān)《windows程序設(shè)計08(17頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,*,*,第,4,章 鍵盤及鼠標的消息響應(yīng),董本志,主要內(nèi)容,鍵盤輸入的響應(yīng),鼠標消息的響應(yīng),鍵盤與鼠標的組合輸入,一、鍵盤輸入的響應(yīng),1,、程序?qū)嵗?2,、,Windows,程序是如何獲得鍵盤輸入的,鍵盤輸入以,消息,的形式傳遞給程序的窗口消息處理程序。,Windows,用八種不同的消息來傳遞不同的鍵盤事件。程序可以忽略其中至少一半的消息而不會有任何問題。并且,在大多數(shù)情況下,這些消息中包含的鍵盤信息會多于程序所需要的。處理鍵盤的部分工作就是識別出哪些消息是重要的,哪些是不重要的。,3,、鍵盤消息,3.1
2、WM_KEYDOWN,和,WM_KEYUP,LRESULT CALLBACK,WindowProc,(HWND,hwnd,/handle to window,UINT,uMsg,/WM_KEYDOWN WM_KEYUP,WPARAM,wParam,/virtual-key code VK_F1,LPARAM,lParam,/key data,);,消息的處理過程主要是根據(jù),wParam,中的鍵碼進行處理。,例,:,switch(,uMsg,),case WM_KEYDOWN:,switch(wParam,),case VK_LEFT:,/,動作;,return 0,;,VK_LEFT 25 L
3、EFT ARROW key,VK_UP 26 UP ARROW key,VK_RIGHT 27 RIGHT ARROW key,VK_DOWN 28 DOWN ARROW key,(,1,)虛擬鍵碼的定義,虛擬鍵碼保存在,WM_KEYDOWN,、,WM_KEYUP,、,WM_SYSKEYDOWN,和,WM_SYSKEYUP,消息的,wParam,參數(shù)中。此代碼標識按下或釋放的鍵。,(,2,),lParam,信息,在按鍵消息,WM_KEYDOWN,、,WM_KEYUP,中,,wParam,消息參數(shù)含有上面所討論的虛擬鍵碼,而,lParam,消息參數(shù)則含有對了解按鍵非常有用的其它信息。,lPara
4、m,的,32,位分為,6,個字段,如圖所示。,(,3,)切換鍵信息,在處理按鍵消息時,可能需要知道是否按下了轉(zhuǎn)換鍵(,Shift,、,Ctrl,和,Alt,)或開關(guān)鍵(,Caps Lock,、,Num Lock,和,Scroll Lock,)。通過調(diào)用,GetKeyState,函數(shù),就能獲得此信息。,SHORT,GetKeyState,(,int,nVirtKey,);,/virtual-key code,nVirtKey,VK_SHIFT shift,鍵,VK_CONTROL CTRL,鍵,VK_MENU ALT,鍵,VK_CAPITAL,CapsLock,鍵,VK_LSHIFT,左,shi
5、ft,鍵,VK_RSHIFT,右,shift,鍵,VK_LCONTROL,VK_RCONTROL,VK_LMENU,VK_RMENU,3.2,字符消息,WM_CHAR,(,1,)消息順序,因為,TranslateMessage,函數(shù)從,WM_KEYDOWN,和,WM_SYSKEYDOWN,消息產(chǎn)生了字符消息,所以字符消息是夾在按鍵消息之間傳遞給窗口消息處理程序的。例如,如果,Caps Lock,未打開,而使用者按下再釋放,A,鍵,則窗口消息處理程序?qū)⒔邮盏饺缦卤硭镜娜齻€消息:,如果按下,Shift,鍵,再按下,A,鍵,然后釋放,A,鍵,再釋放,Shift,鍵,就會輸入大寫的,A,,而窗口消息
6、處理程序會接收到五個消息,如下表所示:,注意:,Shift,鍵本身不產(chǎn)生字符消息。,(,2,),WM_CHAR,消息,LRESULT CALLBACK,WindowProc,(HWND,hwnd,/handle to window,UINT,uMsg,/WM_CHAR,WPARAM,wParam,/character code(TCHAR),LPARAM,lParam,/key data,);,參數(shù),wParam,不是虛擬鍵碼。實際上,它是,ANSI,或,Unicode,字符代碼。例:,case WM_CHAR:,switch(wParam,),case a:,/,處理代碼;,break;,d
7、efault:,return 0;,二、鼠標輸入的響應(yīng),當,Windows,使用者移動鼠標時,,Windows,在顯示器上移動一個稱為鼠標光標的小位圖。鼠標光標有一個指向顯示器上精確位置的單圖素熱點。當提到鼠標光標在屏幕上的位置時,指的是熱點的位置。,Windows,支持幾種預(yù)先定義的鼠標光標,程序可以使用這些光標。,IDC_ARROW,的斜箭頭(在,WINUSER.H,中定義)。熱點在箭頭的頂端。,IDC_CROSS,光標(在本章后面的,BLOKOUT,程序中有用到)的熱點在十字交叉線的中心。,IDC_WAIT,光標是一個沙漏,通常用于指示程序正在執(zhí)行。,程序員也可以設(shè)計自己的光標。,wnd
8、class.hCursor,=,LoadCursor,(NULL,IDC_ARROW);,下面是一些描述鼠標按鍵動作的術(shù)語:,Clicking,按下并放開一個鼠標按鍵。,Double-clicking,快速按下并放開鼠標按鍵兩次。,Dragging,按住鼠標按鍵并移動鼠標。,對三鍵鼠標來說,三個鍵分別稱為左鍵、中鍵、右鍵。在,Windows,表頭文件中定義的與鼠標有關(guān)的標識符使用縮寫,LBUTTON,、,MBUTTON,和,RBUTTON,。雙鍵鼠標只有左鍵與右鍵,單鍵鼠標只有一個左鍵,。,2.1,、顯示區(qū)域鼠標消息,當鼠標移過窗口的顯示區(qū)域時,窗口消息處理程序收到,WM_MOUSEMOVE,
9、消息。當在窗口的顯示區(qū)域中按下或者釋放一個鼠標按鍵時,窗口消息處理程序會接收到下面這些消息:,對于所有這些消息來說,其,lParam,值均含有鼠標的位置:低字節(jié)為,x,坐標,高字節(jié)為,y,坐標,這兩個坐標是相對于窗口顯示區(qū)域左上角的位置。您可以用,LOWORD,和,HIWORD,宏來提取這些值:,x=LOWORD(,lParam,);y=HIWORD(,lParam,);,wParam,的值指示鼠標按鍵以及,Shift,和,Ctrl,鍵的狀態(tài)。,例如,如果收到了,WM_LBUTTONDOWN,消息,而且值,wparam,&MK_SHIFT,是,TRUE,(非,0,),就知道當左鍵按下時也按下了
10、,Shift,鍵。,鼠標消息響應(yīng)實例:,switch(message),case WM_LBUTTONDOWN:,/,處理程序,return 0;,case WM_MOUSEMOVE:,if(,wParam,&MK_LBUTTON)/,左鍵按下同時移動鼠標,/,處理程序,return 0;,case WM_LBUTTONUP:,/,處理程序,return 0;,鼠標雙擊消息,雙擊鼠標按鍵是指在短時間內(nèi)單擊兩次。要確定為雙擊,則這兩次單擊必須發(fā)生在其相距的實際位置十分接近的狀況下(內(nèi)定范圍是一個平均系統(tǒng)字體字符的寬,半個字符的高),并且發(fā)生在指定的時間間隔(稱為雙擊速度)內(nèi)。您可以在控制臺中改變
11、時間間隔。,如果希望您的窗口消息處理程序能夠收到雙按鍵的鼠標消息,那么在調(diào)用,RegisterClass,初始化窗口類別結(jié)構(gòu)時,必須在窗口風(fēng)格中包含,CS_DBLCLKS,標識符:,wndclass.style,=CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS;,如果在窗口風(fēng)格中未包含,CS_DBLCLKS,,而使用者在短時間內(nèi)雙擊了鼠標按鍵,那么窗口消息處理程序會接收到下面這些消息:,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDOWN,WM_LBUTTONUP,鼠標雙擊消息,如果您的窗口類別風(fēng)格中包含了,CS_DBLCLKS,,那么雙擊時窗口消息處理程序?qū)⑹盏饺缦孪ⅲ?WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONDBLCLK,WM_LBUTTONUP,WM_LBUTTONDBLCLK,消息簡單地替換了第二個,WM_LBUTTONDOWN,消息。,