|
Rédacteur/Modérateur
 Francis MILLET Inscription : décembre 2004 Messages : 3 198 Détails du profil  Informations personnelles : Nom :  Francis MILLET Âge : 57 Localisation : France, Haute Savoie (Rhône Alpes) Informations professionnelles :
Secteur : Communication - Médias Informations forums :
Inscription : décembre 2004 Messages : 3 198 Points : 5 110 Points : 5 110
|
Utilisation de la roulette centrale de la souris pour scroller un MSHFlexGrid
Ce petit code permet de faire défiler les lignes d’un MSHFlexGrid à l’aide de la roue de la souris, chose impossible en natif.
Le code comprend 2 gestions distinctes.
Gestion N°1, purement pour l’utilisation de la roulette de souris
Dans le module.Bas, détection des messages générés par la souris et quoi faire si la roue de la souris et mise en rotation. Dans le Form, sub Form_Initialize, Y a t il une roulette disponible ? Dans un module.bas y placer ce
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| Option Explicit
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) As Long
Private Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" ( _
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal Msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Public Declare Function GetProp Lib "user32" Alias "GetPropA" ( _
ByVal hwnd As Long, _
ByVal lpString As String) As Long
Public Declare Function SetProp Lib "user32" Alias "SetPropA" ( _
ByVal hwnd As Long, _
ByVal lpString As String, _
ByVal hData As Long) As Long
Public Declare Function RemoveProp Lib "user32" Alias "RemovePropA" ( _
ByVal hwnd As Long, _
ByVal lpString As String) As Long
Public Declare Function GetSystemMetrics Lib "user32" ( _
ByVal nIndex As Long) As Long
Private Const WM_MOUSEWHEEL = &H20A
Private Const WHEEL_DELTA = 120
'variable qui déterminera si on peut utilisé la roulette de la souris
Public OkRoulette As Boolean
Public Const GWL_WNDPROC = -4
Public Const SM_MOUSEWHEELPRESENT = 75
Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_MOUSEWHEEL Then
If (HiWord(wParam) / WHEEL_DELTA) < 0 Then
If Form1.VScroll1.Value + 1 <= Form1.VScroll1.Max Then Form1.VScroll1.Value = Form1.VScroll1.Value + 1
Else
If Form1.VScroll1.Value - 1 >= Form1.VScroll1.Min Then Form1.VScroll1.Value = Form1.VScroll1.Value - 1
End If
'Passez le message au procédé de fenêtre de défaut et puis sur le parent
DefWindowProc hwnd, uMsg, wParam, lParam
Else
'Message manipulé, n'appelle pas le procédé original de fenêtre
WndProc = CallWindowProc(GetProp(Form1.MSHFlexGrid1.hwnd, "PrevWndProc"), hwnd, uMsg, wParam, lParam)
End If
End Function
Public Function HiWord(dw As Long) As Integer
If dw And &H80000000 Then
HiWord = (dw \ 65535) - 1
Else
HiWord = dw \ 65535
End If
End Function |
Seules les lignes 42 et 44 sont de moi  , le restant a été récupéré il y a un certains temps mais je ne sais plus ou, merci a son auteur.
Gestion N°2, défilement des lignes du MSHFlexGrid Sub ParamScroolFlexGrid
compte les lignes possiblement visibles du MSHFlexGrid suivant sa hauteur de fenêtre,
plus paramétrage du Min et Max du VScrollBar
VScroll1 étant rendu invisible, c’est la fonction WndProc contenu dans le module.Bas
qui incrémente ou décrémente sa valeur Sub VScroll1_Change
assure le défilement des lignes du MSHFlexGrid, soit vers le haut soit vers le bas. Sur un Form, un MSHFlexGrid (Ctrl+T ---> et cocher Microsoft Hierarchical FlexGrid Control 6.0 (OLEDB)), un VScrollBar et 2 CommandButton puis ce
Code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
| Option Explicit
'variables d'usage generales
Dim T As Long
Dim Ldeb As Long, LFin As Long
Dim NbrRowVisibl As Long
' *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* Partie utile pour utilisation de la roulette souris *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Private Sub Form_Initialize()
OkRoulette = False
VScroll1.Visible = False
If GetSystemMetrics(SM_MOUSEWHEELPRESENT) Then
OkRoulette = True
'Crée/enclenche, en tache de fond, la surveillance de la souris
SetProp MSHFlexGrid1.hwnd, "PrevWndProc", SetWindowLong(MSHFlexGrid1.hwnd, GWL_WNDPROC, AddressOf WndProc)
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If OkRoulette = True Then
'pour mettre fin proprement à la routine utilisation de la roulette souris
SetWindowLong MSHFlexGrid1.hwnd, GWL_WNDPROC, GetProp(MSHFlexGrid1.hwnd, "PrevWndProc")
RemoveProp MSHFlexGrid1.hwnd, "PrevWndProc"
Set Form1 = Nothing
End If
End Sub
' *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
'-----------------------------------------Routine ordinaire----------------------------------------
Private Sub Form_Load()
'placement des différents composants
MSHFlexGrid1.Move 540, 120, 2235, 3015
Command1.Left = MSHFlexGrid1.Left
Command1.Height = 555
Command1.Width = (MSHFlexGrid1.Width - 30) / 2
Command1.Caption = "...."
Command1.ToolTipText = "Cliquez moi pour faire perdre le focus de MSHFlexGrid1"
Command2.Left = Command1.Left + Command1.Width + 15
Command2.Height = Command1.Height
Command2.Width = Command1.Width
Command2.Caption = "Remplis le grid"
'Histoire de remplir une première fois le MSHFlexGrid
Ldeb = 47: LFin = 122
MSHFlexGrid1.Rows = (LFin - Ldeb) + 1: MSHFlexGrid1.Cols = 2
For T = Ldeb To LFin
If T = Ldeb Then
MSHFlexGrid1.TextMatrix(T - Ldeb, 0) = "Col1"
MSHFlexGrid1.TextMatrix(T - Ldeb, 1) = "Col2"
Else
MSHFlexGrid1.TextMatrix(T - Ldeb, 0) = T - Ldeb
MSHFlexGrid1.TextMatrix(T - Ldeb, 1) = Chr(T)
End If
Next T
Me.Height = 4470: Me.Width = 3390
'rend le Form visible de façon a donner le focus au grid
Me.Visible = True
MSHFlexGrid1.SetFocus
End Sub
Private Sub Form_Resize()
'pour le cas ou vous désirez redimensionner le MSHFlexGrid
If Me.WindowState <> vbMinimized And Me.Visible = True Then
'redimensionnement du MSHFlexGrid1 et repositionnement des 2 CommandButton
If Me.Height >= 1980 Then
Command1.Top = Me.ScaleHeight - Command1.Height - 90
Command2.Top = Command1.Top
MSHFlexGrid1.Height = Command1.Top - (MSHFlexGrid1.Top + 45)
'il faut donc reparamétrer
ParamScroolFlexGrid MSHFlexGrid1, VScroll1
End If
End If
End Sub
Private Sub ParamScroolFlexGrid(HFlexGridMS As MSHFlexGrid, Vscrol As VScrollBar)
'Comptage du nombre de lignes visibles dans la fenêtre du MSHFlexGrid
Dim Cpt As Long
NbrRowVisibl = -1
For Cpt = 0 To HFlexGridMS.Rows - 1
If NbrRowVisibl = -1 Then
If HFlexGridMS.RowIsVisible(Cpt) = False Then
NbrRowVisibl = Cpt
End If
End If
Next Cpt
'Paramétrage du VScroll
Vscrol.Max = HFlexGridMS.Rows + 1
Vscrol.Min = NbrRowVisibl
Vscrol.Value = (MSHFlexGrid1.TopRow + NbrRowVisibl) - 1
End Sub
Private Sub MSHFlexGrid1_Scroll()
'si NbrRowVisibl = -1 c'est que la fenêtre MSHFlexGrid affiche toutes les lignes,
'donc pas besoin d'actualiser VScroll1.
If NbrRowVisibl = -1 Then Exit Sub
'pour calage/actualisation de VScroll1
VScroll1.Value = (MSHFlexGrid1.TopRow + NbrRowVisibl) - 1
If Me.ActiveControl.Name <> "MSHFlexGrid1" Then
MSHFlexGrid1.SetFocus
End If
End Sub
'Ce qu'il doit se passer quand il y a modification de la valeur du VScrollBar déclenché par la
'la fonction WndProc du module.bas
Private Sub VScroll1_Scroll()
VScroll1_Change
End Sub
Private Sub VScroll1_Change()
'si NbrRowVisibl = -1 c'est que la fenêtre MSHFlexGrid affiche toutes les lignes,
'donc pas besoin d'actualiser VScroll1.
If NbrRowVisibl = -1 Then Exit Sub
'petite assurence, des fois ....
'On Error Resume Next
MSHFlexGrid1.TopRow = (VScroll1.Value - NbrRowVisibl) + 1
End Sub
Private Sub Command2_Click()
'Histoire de remplir le MSHFlexGrid (BIS)
'pour illustrer le reparametrage de VScroll1
Ldeb = 65: LFin = 90
MSHFlexGrid1.Rows = (LFin - Ldeb) + 1
For T = Ldeb To LFin
If T = Ldeb Then
MSHFlexGrid1.TextMatrix(T - Ldeb, 0) = "Col1"
MSHFlexGrid1.TextMatrix(T - Ldeb, 1) = "Col2"
Else
MSHFlexGrid1.TextMatrix(T - Ldeb, 0) = T - Ldeb
MSHFlexGrid1.TextMatrix(T - Ldeb, 1) = Chr(T)
End If
Next T
MSHFlexGrid1.Row = 1: MSHFlexGrid1.TopRow = 1
ParamScroolFlexGrid MSHFlexGrid1, VScroll1
End Sub
'------------------------------------------------------------------------------------------------- |
|