VB6.0用掲示板の過去のログ(No.2)−VBレスキュー(花ちゃん)
[記事リスト] [新規投稿] [新着記事] [ワード検索] [管理用]

投稿日: 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"


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -