讓VB應(yīng)用程序支持鼠標(biāo)滾輪

字號(hào):

---- 一、提出問(wèn)題
    ---- 自從1996年微軟推出Intellimouse鼠標(biāo)后,帶滾輪的鼠標(biāo)開(kāi)始大行其道,支持鼠標(biāo)滾輪的應(yīng)用軟件也越來(lái)越多。但我感到奇怪,為什么VB到6.0本身仍然不支持鼠標(biāo)滾輪,VF可是從5.0就提供MouseWheel事件了。
    ---- 如何讓VB應(yīng)用程序支持鼠標(biāo)滾輪?MSDN上有一篇解決VB下應(yīng)用Intellimouse鼠標(biāo)的文章,它解決這一問(wèn)題的方法是通過(guò)一個(gè)幾十K的第三方控件實(shí)現(xiàn)的,可惜該控件沒(méi)有源代碼。況且為了支持鼠標(biāo)滾輪使用一個(gè)第三方控件,好像有點(diǎn)得不償失。本文給出用純VB實(shí)現(xiàn)這一功能的方法。
    ---- 二、解決問(wèn)題
    ---- 我們知道VB應(yīng)用程序響應(yīng)的Windows傳來(lái)的消息,需要通過(guò)VB解釋。可是很不幸,雖然VB解釋所有得消息,卻只讓用戶程序在事件中處理部分消息,VB自己處理其他的消息,或者忽略這些消息。
    ---- 在VB5.0以前應(yīng)用程序無(wú)法越過(guò)VB直接處理消息,微軟從VB5.0開(kāi)始提供AddressOf 運(yùn)算符,該運(yùn)算符可以讓用戶程序?qū)⒑瘮?shù)或者過(guò)程的地址傳遞給一個(gè)API函數(shù)。這樣我們就可以在VB應(yīng)用程序中編寫(xiě)自己的窗口處理函數(shù),通過(guò)AddressOf 運(yùn)算符將在VB中定義的窗口地址傳遞給窗口處理函數(shù),從而繞過(guò)VB的解釋器,自己處理消息。事實(shí)上,該方法可用于在VB中處理任何消息。
    ---- 實(shí)現(xiàn)應(yīng)用程序支持鼠標(biāo)滾輪的關(guān)鍵是,捕獲鼠標(biāo)滾輪的消息 MSH_MOUSEWHEEL、WM_MOUSEWHEEL。其中MSH_MOUSEWHEEL是為95準(zhǔn)備的,需要Intellimouse驅(qū)動(dòng)程序,而WM_MOUSEWHEEL是目前各版本W(wǎng)indows(98/NT40/2000)內(nèi)置的消息。本文主要處理WM_MOUSEWHEEL消息。下面是WM_MOUSEWHEEL的語(yǔ)法。
     WM_MOUSEWHEEL
     fwKeys = LOWORD(wParam); /* key flags */
     zDelta = (short) HIWORD(wParam);
     /* wheel rotation */
     xPos = (short) LOWORD(lParam);
     /* horizontal position of pointer */
     yPos = (short) HIWORD(lParam);
     /* vertical position of pointer */
    ---- 其中:fwKeys指出是否有CTRL、SHIFT、鼠標(biāo)鍵(左、中、右、附加)按下,允許復(fù)合。zDelta傳遞滾輪滾動(dòng)的快慢,該值小于零表示滾輪向后滾動(dòng)(朝用戶方向),大于零表示滾輪向前滾動(dòng)(朝顯示器方向)。lParam指出鼠標(biāo)指針相對(duì)屏幕左上的x、y軸坐標(biāo)。
    ---- 滾輪按鈕相當(dāng)于普通的三鍵鼠標(biāo)的中鍵,根據(jù)滾輪按鈕的動(dòng)作,Windows分別發(fā)出WM_MBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONDBLCLK消息,這些消息VB已經(jīng)在鼠標(biāo)事件中支持。