投稿日 | : 2005/06/03(Fri) 19:07 |
投稿者 | : ダンボ |
URL | : |
タイトル | : hWndからコントロールを知る方法 |
皆さんこんにちは。
VB6で作成したAPPにマウスホィール機能を付けるためにサブタスク化しています。
下記のコード(主要部のみ断片)で、多種類のコントロールに対しては対処しているのですが、
複数のコントロールに対しては使えません。(CNTがひとつしかないから)
これを改善しようとしていますが、SubClassProcにメッセージが来たときにわかるのはコントロールのhWnd。
そのhWndから対応するコントロールオブジェクトを引っ張り出す方法がわかりません。
メッセージの度に、そのフォームの全コントロールを調べてhWndの一致するものを選ぶというのも何だし。
もっとスマートな方法があると思うのですが。
Dim CNT As Control
Public Function WheelOpen(usrCNT As Control) As Long
Dim p_hWnd As Long 'original Handle
Set CNT = usrCNT
p_hWnd = SetWindowLong(usrCNT.hWnd, GWL_WNDPROC, AddressOf SubClassProc)
rc = SetWindowLong(usrCNT.hWnd, GWL_USERDATA, p_hWnd)
WheelOpen = p_hWnd
End Function
Private Function SubClassProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long,
ByVal lParam As Long) As Long
Select Case uMsg
Case WM_MOUSEWHEEL
If wParam < 0 Then
WheelUp
Else
WheelDown
End If
Case Else
SubClassProc = CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, uMsg,
wParam, lParam)
End Select
End Function
Private Sub WheelUp()
With CNT
Select Case TypeName(CNT)
Case "MSFlexGrid"
If .Rows > 1 Then
If .Rows <= .TopRow + 1 Then
If .Rows - 3 < 0 Then
.TopRow = 1
Else
.TopRow = .TopRow - 3
End If
Else
.TopRow = .TopRow + 1
End If
End If
Case "ListBox"
Case "PictureBox"