NonSoft

MSFLXGRDのマウスホイールによる
スクロールのサンプル(VB6)


 サンプル(ソース/コード)
<このサンプルの概要>
MSFLXGRD.OCXは、Windows 2000やXPの標準ではマウスホイールによるスクロールが出来ま
せん。色々調べましたがどうやらIntelliPointのバージョンを4.12に下げるとスクロール
するようです。VB6のコード編集ウィンドウも同様のようです。しかし、その為にバー
ジョンを下げるのも怖いので自力でスクロールする処理を考えてみました。

仕様としては、マウスホイールのイベントを取得して、MSFLXGRDコントロールにスクロー
ルのイベント(メッセージ)送信するというものです。マウスホイールのイベントの取得
はDirectXEvent8を使用しています。MSFLXGRDコントロールにSendMessageを使用していま
す。

このサンプルでは、「このプログラムでマウスホイール制御するかどうか」と「スクロー
ル行数」の設定をするフォームも付いています。このプログラムは「テキスト差分表示ツ
ール」と「フォルダ内のファイル比較ツール」で使用されています。

★MSFLXGRDのマウスホイールによるスクロールのサンプル(MouseWheel.frm)
'**********************************************************************
' 機能名    : マウスホイールによるスクロール
'
' 機能説明  : マウスホイールによるスクロールが出来無いコントロールをス
'           : クロール制御する
'
' 備考      : MSFLXGRD.OCXをマウスホイールによりスクロールするために作
'           : 成しました。通常は、IntelliPoint4.12等をインストールして
'           : スクロール出来るようにすべきなのかもしれません。
'
' 著作権    : Copyright(C) 2007 のん All right reserved
'           : このプログラムは、日本国著作権法および国際条約により保護
'           : されています。このプログラムの全部または一部を無断で複製
'           : したり、無断で複製物を頒布すると、著作権の侵害となります
'           : のでご注意ください。
'           : ただし、個人使用目的に限りカスタマイズ可能とします。
'**********************************************************************
' API定義--------------------------------------------------------------
Private Declare Function GetPrivateProfileString Lib _
    "kernel32.dll" Alias "GetPrivateProfileStringA" ( _
    ByVal lpSectName As String, ByVal lpKeyName As Any, _
    ByVal lpDefault As String, ByVal lpReturnedString As String, _
    ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function GetActiveWindow Lib "USER32" () As Long
Private Const WM_VSCROLL = 277
Private Const SB_LINEUP = 0
Private Const SB_LINEDOWN = 1
Private Declare Function SendMessage Lib _
    "USER32" Alias "SendMessageA" ( _
    ByVal hWnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long

' DirectX定義----------------------------------------------------------
Implements DirectXEvent8
Private ObjDx As DirectX8
Private ObjDi As DxVBLibA.DirectInput8
Private ObjDiD As DxVBLibA.DirectInputDevice8
Private EventI As Long

' その他の定義---------------------------------------------------------
Private CtrlHWnd As Long
Private FormHWnd As Long
Private IniFilePath As String
Private WheelEnable As Long
Private WheelLine As Long

' ---------------------------------------------------------------------
' 関数名    : Initialize
' 返り値    : 無し
' 引き数    : 無し
' 機能説明  : マウスホイール処理初期化
' 著作権    : Copyright(C) 2006 のん All right reserved
Public Sub Initialize()
    On Error Resume Next
    ApplyIniInfo
    If WheelEnable = 0 Then
        Exit Sub
    End If
    
    Set ObjDx = New DxVBLibA.DirectX8
    Set ObjDi = ObjDx.DirectInputCreate()
    If ObjDi Is Nothing Then
        Exit Sub
    End If
    Set ObjDiD = ObjDi.CreateDevice("guid_SysMouse")
    If ObjDiD Is Nothing Then
        Exit Sub
    End If
    ObjDiD.SetCommonDataFormat DIFORMAT_MOUSE2
    ObjDiD.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
    Dim dip As DxVBLibA.DIPROPLONG
    dip.lHow = DIPH_DEVICE
    dip.lData = 10
    dip.lObj = 0
    ObjDiD.SetProperty "DIPROP_BUFFERSIZE", dip
    EventI = ObjDx.CreateEvent(Me)
    ObjDiD.SetEventNotification EventI
    ObjDiD.Acquire
End Sub

' 関数名    : Destroy
' 返り値    : 無し
' 引き数    : 無し
' 機能説明  : マウスホイール処理破棄
' 著作権    : Copyright(C) 2006 のん All right reserved
Public Sub Destroy()
    On Error Resume Next
    If ObjDiD Is Nothing = False Then
        ObjDiD.Unacquire
    End If
    Set ObjDiD = Nothing
    Set ObjDi = Nothing
    Set ObjDx = Nothing
End Sub

' 関数名    : StartWheel
' 返り値    : 無し
' 引き数    : fHWnd(i) : マウスホイールするウィンドウ
'           : cHWnd(i) : マウスホイールするコントロール
' 機能説明  : マウスホイール開始
' 著作権    : Copyright(C) 2006 のん All right reserved
Public Sub StartWheel(ByVal fHWnd As Long, ByVal cHWnd As Long)
    On Error Resume Next
    If fHWnd <> 0 Then
        FormHWnd = fHWnd
    End If
    If cHWnd <> 0 Then
        CtrlHWnd = cHWnd
    End If
    If WheelEnable <> 0 Then
        If ObjDiD Is Nothing = False Then
            ObjDiD.Acquire
        End If
    End If
End Sub

' 関数名    : EndWheel
' 返り値    : 無し
' 引き数    : 無し
' 機能説明  : マウスホイール終了
' 著作権    : Copyright(C) 2006 のん All right reserved
Public Sub EndWheel()
    On Error Resume Next
    CtrlHWnd = 0
    If ObjDiD Is Nothing = False Then
        ObjDiD.Unacquire
    End If
End Sub

' 関数名    : DirectXEvent8_DXCallback
' 返り値    : 無し
' 引き数    : evId(i) : イベントID
' 機能説明  : マウスイベントコールバック処理
' 著作権    : Copyright(C) 2006 のん All right reserved
Private Sub DirectXEvent8_DXCallback(ByVal evId As Long)
    On Error Resume Next
    Dim dev(9) As DxVBLibA.DIDEVICEOBJECTDATA
    Dim i, j, c As Long
    If FormHWnd <> GetActiveWindow Or CtrlHWnd = 0 Then
        Exit Sub
    End If
    If EventI <> evId Then
        Exit Sub
    End If
    c = ObjDiD.GetDeviceData(dev, DIGDD_DEFAULT)
    If c = 0 Or Err Then
        ObjDiD.Acquire
        Exit Sub
    End If
    For i = 0 To c - 1
        If dev(i).lOfs = DIMOFS_Z Then
            For j = 1 To WheelLine
                If dev(i).lData < 0 Then
                    SendMessage CtrlHWnd, WM_VSCROLL, SB_LINEDOWN, ByVal 0
                Else
                    SendMessage CtrlHWnd, WM_VSCROLL, SB_LINEUP, ByVal 0
                End If
            Next j
        End If
    Next i
End Sub

' 関数名    : ApplyIniInfo
' 返り値    : 無し
' 引き数    : 無し
' 機能説明  : iniファイルの情報を適用する
' 著作権    : Copyright(C) 2006 のん All right reserved
Private Sub ApplyIniInfo()
    On Error Resume Next
    Dim sBuf As String
    Dim lRes As Long
    IniFilePath = App.Path & "\" & App.EXEName & ".ini"
    sBuf = Space(1024 + 1)
    lRes = GetPrivateProfileString("MouseWheel", "Enable", "0", sBuf, 1024, IniFilePath)
    WheelEnable = StrConv(LeftB$(StrConv(sBuf, vbFromUnicode), lRes), vbUnicode)
    lRes = GetPrivateProfileString("MouseWheel", "Line", "2", sBuf, 1024, IniFilePath)
    WheelLine = StrConv(LeftB$(StrConv(sBuf, vbFromUnicode), lRes), vbUnicode)
End Sub

★MSFLXGRDのマウスホイールによるスクロールのサンプル(MouseWheelD.frm) MSFLXGRDのマウスホイールによるスクロールのサンプル
'**********************************************************************
' 機能名    : マウスホイールによるスクロール設定画面
'
' 機能説明  : マウスホイールによるスクロール制御の有無やスクロール行数
'           : を設定する画面です。
'
' 著作権    : Copyright(C) 2007 のん All right reserved
'           : このプログラムは、日本国著作権法および国際条約により保護
'           : されています。このプログラムの全部または一部を無断で複製
'           : したり、無断で複製物を頒布すると、著作権の侵害となります
'           : のでご注意ください。
'           : ただし、個人使用目的に限りカスタマイズ可能とします。
'**********************************************************************
' API定義--------------------------------------------------------------
Private Declare Function GetPrivateProfileString Lib _
    "kernel32.dll" Alias "GetPrivateProfileStringA" ( _
    ByVal lpSectName As String, ByVal lpKeyName As Any, _
    ByVal lpDefault As String, ByVal lpReturnedString As String, _
    ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function SetPrivateProfileString Lib _
    "kernel32.dll" Alias "WritePrivateProfileStringA" ( _
    ByVal lpSection As String, ByVal lpKeyName As String, _
    ByVal lpValue As String, ByVal lpFileName As String) As Long

' その他の定義---------------------------------------------------------
Private IniFilePath As String

' ---------------------------------------------------------------------
' 関数名    : Form_Load
' 返り値    : 無し
' 引き数    : 無し
' 機能説明  : フォームロード時の処理
' 著作権    : Copyright(C) 2006 のん All right reserved
Private Sub Form_Load()
    On Error Resume Next
    Dim sBuf As String
    Dim lRes As Long
    IniFilePath = App.Path & "\" & App.EXEName & ".ini"
    sBuf = Space(1024 + 1)
    lRes = GetPrivateProfileString("MouseWheel", "Enable", "0", sBuf, 1024, IniFilePath)
    Chk_MouseWheel.Value = StrConv(LeftB$(StrConv(sBuf, vbFromUnicode), lRes), vbUnicode)
    lRes = GetPrivateProfileString("MouseWheel", "Line", "2", sBuf, 1024, IniFilePath)
    Cmb_WheelLine.Text = StrConv(LeftB$(StrConv(sBuf, vbFromUnicode), lRes), vbUnicode)
End Sub

' 関数名    : Btn_Ok_Click
' 返り値    : 無し
' 引き数    : 無し
' 機能説明  : 設定ボタンクリック時の処理
' 著作権    : Copyright(C) 2006 のん All right reserved
Private Sub Btn_Ok_Click()
    On Error Resume Next
    Me.Visible = False
    DoEvents
    SetPrivateProfileString "MouseWheel", "Enable", Chk_MouseWheel.Value, IniFilePath
    SetPrivateProfileString "MouseWheel", "Line", Cmb_WheelLine.Text, IniFilePath
    If Chk_MouseWheel.Value <> 0 Then
        MouseWheel.Initialize
    Else
        MouseWheel.Destroy
    End If
    Unload Me
End Sub

' 関数名    : Form_Unload
' 返り値    : 無し
' 引き数    : Cancel(i) : キャンセル=1
' 機能説明  : フォームアンロード時の処理
' 著作権    : Copyright(C) 2006 のん All right reserved
Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    Me.Visible = False
End Sub