一、提出問題
自從1996年微軟推出Intellimouse滑鼠後,帶滾輪的滑鼠開始大行其道,支援滑鼠滾輪的應用軟體也越來越多。但我感到奇怪,為什麼VB到6.0本身仍然不支援滑鼠滾輪,VF可是從5.0就提供MouseWheel事件了。
如何讓VB應用程式支援滑鼠滾輪?MSDN上有一篇解決VB下應用Intellimouse滑鼠的文章,它解決這一問題的方法是透過一個幾十K的第三方控件實現的,可惜該控件沒有源代碼。況且為了支援滑鼠滾輪使用一個第三方控件,好像有點得不償失。本文給出用純VB實現這一功能的方法。
二、解決問題
我們知道VB應用程式響應的Windows傳來的消息,需要透過VB解釋。可是很不幸,雖然VB解釋所有得消息,卻隻讓用戶程式在事件中處理部分消息,VB自己處理其他的消息,或者忽略這些消息。
在VB5.0以前應用程式無法越過VB直接處理消息,微軟從VB5.0開始提供AddressOf 運算符,該運算符可以讓用戶程式將函數或者過程的地址傳遞給一個API函數。這樣我們就可以在VB應用程式中編寫自己的窗口處理函數,透過AddressOf 運算符將在VB中定義的窗口地址傳遞給窗口處理函數,從而繞過VB的解釋器,自己處理消息。事實上,該方法可用於在VB中處理任何消息。
實現應用程式支援滑鼠滾輪的關鍵是,捕穫滑鼠滾輪的消息 MSH_MOUSEWHEEL、WM_MOUSEWHEEL。其中MSH_MOUSEWHEEL是為95準備的,需要Intellimouse驅動程式,而WM_MOUSEWHEEL是目前各版本Windows(98/NT40/2000)內置的消息。本文主要處理WM_MOUSEWHEEL消息。下面是WM_MOUSEWHEEL的語法。
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、滑鼠鍵(左、中、右、附加)按下,允許複合。zDelta傳遞滾輪卷動的快慢,該值小於零表示滾輪向後卷動(朝用戶方向),大於零表示滾輪向前卷動(朝顯示器方向)。lParam指出滑鼠指針相對螢幕左上的x、y軸坐標。
滾輪按鈕相當於普通的三鍵滑鼠的中鍵,根據滾輪按鈕的動作,Windows分別發出WM_MBUTTONUP、WM_MBUTTONDOWN、WM_MBUTTONDBLCLK消息,這些消息VB已經在滑鼠事件中支援。
三、實際應用 根據上述原理,給出一個資料庫應用的典型例子。
1.戶介面如圖1所示。該例是班級和學生一對多的查詢,當用戶在學生網格以外卷動滑鼠滾輪,班級主表前後移動;用戶在網格以內卷動滑鼠學生明細表垂直移動;如果在網格以內按住滑鼠滾輪鍵並且卷動滑鼠,學生明細表水平移動。
2.Form1上ADO Data 控件對象datPrimaryRS的 ConnectionString為"PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;dsn=SCHOOL;uid=;pwd=;", RecordSelectors 屬性的SQL命令文本為"SHAPE {select * from 班級} AS ParentCMD APPEND ({select * from 學生 } AS ChildCMD RELATE 班級名稱 TO 班級名稱) AS ChildCMD"。
3.TextBox的DataSource均為datPrimaryRS,DataFiled如圖所示。
4.窗口下部的網格是DataGrid控件,名稱為grdDataGrid。
5.表單From1.frm的清單如下:
Private Sub Form_Load()
Set grdDataGrid.DataSource = datPrimaryRS.Recordset("ChildCMD").UnderlyingValue Hook Me.hWnd
End Sub
Private Sub Form_Unload(Cancel As Integer) UnHook Me.hWnd End Sub |
文章定位: