OVH Cloud OVH Cloud

Ascenseur dans ListBox : on sèche ?

7 réponses
Avatar
Gloops
Bonjour tout le monde,

Bon alors concernant le contrôle ListBox traditionnel, personne n'a
proposé de moyen d'y faire apparaître un ascenseur horizontal.

ça laisse donc entendre que ça n'est pas possible ?

7 réponses

Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:4170fac6$0$27890$
Bonjour tout le monde,

Bon alors concernant le contrôle ListBox traditionnel, personne n'a
proposé de moyen d'y faire apparaître un ascenseur horizontal.

ça laisse donc entendre que ça n'est pas possible ?



Hello,

je ne me suis jamais penché sur la question plus que ça en fait.
Quand je dois utiliser ce genre de choses, je prends un listView,
qui est plus général.

--
Jean-marc
"There are only 10 kind of people
those who understand binary and those who don't."
Avatar
François Picalausa
Hello,

Il faut que la listbox ait le style WS_HSCROLL.
Il faut ensuite envoyer un message à la listbox pour lui dire de combien
elle peut "scroller"
Et enfin, rafraichir le contrôle pour que l'affichage corresponde.
Voici un exemple:

Option Explicit

'Apis pour définir le style
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)
Private Const WS_HSCROLL = &H100000

Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) _
As Long
Private Declare Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long _
) _
As Long

'Apis pour définir la zone qui peut-être "défilée"
Private Const LB_SETHORIZONTALEXTENT = &H194

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

'Apis pour afficher les modifications
Private Declare Function SetWindowPos _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) _
As Long
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOOWNERZORDER = &H200

Private Sub SetListBoxScroll(List As ListBox, ScrollWidth As Long)
SetStyle List.hwnd, WS_HSCROLL, 1

'wParam : Specifies the number of pixels
'by which the list box can be scrolled.
SendMessage List.hwnd, LB_SETHORIZONTALEXTENT, ScrollWidth, ByVal 0&

'SetWindowPos permet de rafraichir le contrôle
SetWindowPos List.hwnd, 0, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_FRAMECHANGED Or SWP_NOOWNERZORDER
End Sub

'State :
' 0 : désactive le Style
' 1 : active le Style
' 2 : inverse l'état du Style
Private Sub SetStyle(hwnd As Long, Style As Long, State As Byte)
Dim lngCurrentStyle As Long

lngCurrentStyle = GetWindowLong(hwnd, GWL_STYLE)

Select Case State
Case 0 'Désactiver
lngCurrentStyle = lngCurrentStyle And Not Style
Case 2 'Inverser
lngCurrentStyle = lngCurrentStyle Xor Style
Case 1 'Activer
lngCurrentStyle = lngCurrentStyle Or Style
End Select

SetWindowLong hwnd, GWL_STYLE, lngCurrentStyle
End Sub

Private Sub Form_Load()
SetListBoxScroll List1, 550
List1.AddItem
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
End Sub


--
François Picalausa

"Gloops" a écrit dans le message de news:
4170fac6$0$27890$
Bonjour tout le monde,

Bon alors concernant le contrôle ListBox traditionnel, personne n'a
proposé de moyen d'y faire apparaître un ascenseur horizontal.

ça laisse donc entendre que ça n'est pas possible ?


Avatar
dav
François Picalausa a écrit :

Hello,

Il faut que la listbox ait le style WS_HSCROLL.
Il faut ensuite envoyer un message à la listbox pour lui dire de combien
elle peut "scroller"
Et enfin, rafraichir le contrôle pour que l'affichage corresponde.
Voici un exemple:

Option Explicit

'Apis pour définir le style
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)
Private Const WS_HSCROLL = &H100000

Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) _
As Long
Private Declare Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long _
) _
As Long

'Apis pour définir la zone qui peut-être "défilée"
Private Const LB_SETHORIZONTALEXTENT = &H194

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

'Apis pour afficher les modifications
Private Declare Function SetWindowPos _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) _
As Long
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOOWNERZORDER = &H200

Private Sub SetListBoxScroll(List As ListBox, ScrollWidth As Long)
SetStyle List.hwnd, WS_HSCROLL, 1

'wParam : Specifies the number of pixels
'by which the list box can be scrolled.
SendMessage List.hwnd, LB_SETHORIZONTALEXTENT, ScrollWidth, ByVal 0&

'SetWindowPos permet de rafraichir le contrôle
SetWindowPos List.hwnd, 0, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_FRAMECHANGED Or SWP_NOOWNERZORDER
End Sub

'State :
' 0 : désactive le Style
' 1 : active le Style
' 2 : inverse l'état du Style
Private Sub SetStyle(hwnd As Long, Style As Long, State As Byte)
Dim lngCurrentStyle As Long

lngCurrentStyle = GetWindowLong(hwnd, GWL_STYLE)

Select Case State
Case 0 'Désactiver
lngCurrentStyle = lngCurrentStyle And Not Style
Case 2 'Inverser
lngCurrentStyle = lngCurrentStyle Xor Style
Case 1 'Activer
lngCurrentStyle = lngCurrentStyle Or Style
End Select

SetWindowLong hwnd, GWL_STYLE, lngCurrentStyle
End Sub

Private Sub Form_Load()
SetListBoxScroll List1, 550
List1.AddItem
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
End Sub




ouh la !!!!!! merci infiniement, y'a vraiment rien de plus simple.
je pensais qu'avec les propriétés ListIndex et List on aurait pu faire
ça.....
enfin, c'est sympa...je vais m'y mettre et tester...
dav
Avatar
Gloops
Ah, ben voilà ...

Merci beaucoup, j'essaie un de ces quatre.
_________________________________________________
François Picalausa a écrit, le 16/10/2004 13:56 :
Hello,

Il faut que la listbox ait le style WS_HSCROLL.
Il faut ensuite envoyer un message à la listbox pour lui dire de combien
elle peut "scroller"
Et enfin, rafraichir le contrôle pour que l'affichage corresponde.
Voici un exemple:

Option Explicit

'Apis pour définir le style
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)
Private Const WS_HSCROLL = &H100000

Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) _
As Long
Private Declare Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long _
) _
As Long

'Apis pour définir la zone qui peut-être "défilée"
Private Const LB_SETHORIZONTALEXTENT = &H194

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

'Apis pour afficher les modifications
Private Declare Function SetWindowPos _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) _
As Long
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOOWNERZORDER = &H200

Private Sub SetListBoxScroll(List As ListBox, ScrollWidth As Long)
SetStyle List.hwnd, WS_HSCROLL, 1

'wParam : Specifies the number of pixels
'by which the list box can be scrolled.
SendMessage List.hwnd, LB_SETHORIZONTALEXTENT, ScrollWidth, ByVal 0&

'SetWindowPos permet de rafraichir le contrôle
SetWindowPos List.hwnd, 0, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_FRAMECHANGED Or SWP_NOOWNERZORDER
End Sub

'State :
' 0 : désactive le Style
' 1 : active le Style
' 2 : inverse l'état du Style
Private Sub SetStyle(hwnd As Long, Style As Long, State As Byte)
Dim lngCurrentStyle As Long

lngCurrentStyle = GetWindowLong(hwnd, GWL_STYLE)

Select Case State
Case 0 'Désactiver
lngCurrentStyle = lngCurrentStyle And Not Style
Case 2 'Inverser
lngCurrentStyle = lngCurrentStyle Xor Style
Case 1 'Activer
lngCurrentStyle = lngCurrentStyle Or Style
End Select

SetWindowLong hwnd, GWL_STYLE, lngCurrentStyle
End Sub

Private Sub Form_Load()
SetListBoxScroll List1, 550
List1.AddItem
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
End Sub




Avatar
Gloops
Salut,

ListIndex retourne le numéro de l'enregistrement sélectionné. C'est donc
une sélection verticale :)

List, peut-être ... sélectionner les champs à faire apparaître dans la
liste, c'est une autre façon de voir. Après il reste à re-sélectionner
l'enregistrement en cours. Avec ListIndex justement -ah oui tiens le
revoilà dans le circuit.

Je crois que je vais d'abord essayer la recette de François.
__________________________________
dav a écrit, le 16/10/2004 16:24 :


ouh la !!!!!! merci infiniement, y'a vraiment rien de plus simple.
je pensais qu'avec les propriétés ListIndex et List on aurait pu faire
ça.....
enfin, c'est sympa...je vais m'y mettre et tester...
dav



Avatar
Gloops
Salut,

Bon alors j'ai copié le code dans le module du formulaire.
J'ai supprimé SendMessage parce que je l'avais déjà mis donc il était en
doublon (ça servait pour créer des colonnes).
Pour Form.Load j'ai gardé les instructions indiquées, en essayant au
début ou à la fin de la procédure.
J'ai doublé le texte test pour qu'il dépasse la largeur de la liste.

Et puis j'ai lancé. Pas de changement, sinon que les séparateurs de
colonnes ont disparu. Les tabulations fonctionnent toujours mais les
colonnes ne sont plus séparées par des traits verticaux. Bon ça ça ne me
torture pas trop, mais apparemment il y a autre chose que j'aurais dû
faire pour gérer le défilement horizontal dans la liste.

Est-ce qu'il n'y aurait pas incompatibilité avec la gestion des colonnes ?
Private Const LB_SETTABSTOPS As Long = &H192&
Call SendMessage(List1.hwnd, LB_SETTABSTOPS, 3&, TabStops(0))

ça serait un peu embêtant, parce que tant qu'à défiler horizontalement,
autant avoir des colonnes bien séparées ...

Pas besoin d'être administrateur, des fois ?


_________________________________________________
François Picalausa a écrit, le 16/10/2004 13:56 :

Hello,

Il faut que la listbox ait le style WS_HSCROLL.
Il faut ensuite envoyer un message à la listbox pour lui dire de combien
elle peut "scroller"
Et enfin, rafraichir le contrôle pour que l'affichage corresponde.
Voici un exemple:

Option Explicit

'Apis pour définir le style
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)
Private Const WS_HSCROLL = &H100000

Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) _
As Long
Private Declare Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long _
) _
As Long

'Apis pour définir la zone qui peut-être "défilée"
Private Const LB_SETHORIZONTALEXTENT = &H194

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

'Apis pour afficher les modifications
Private Declare Function SetWindowPos _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) _
As Long
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOOWNERZORDER = &H200

Private Sub SetListBoxScroll(List As ListBox, ScrollWidth As Long)
SetStyle List.hwnd, WS_HSCROLL, 1

'wParam : Specifies the number of pixels
'by which the list box can be scrolled.
SendMessage List.hwnd, LB_SETHORIZONTALEXTENT, ScrollWidth, ByVal 0&

'SetWindowPos permet de rafraichir le contrôle
SetWindowPos List.hwnd, 0, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_FRAMECHANGED Or SWP_NOOWNERZORDER
End Sub

'State :
' 0 : désactive le Style
' 1 : active le Style
' 2 : inverse l'état du Style
Private Sub SetStyle(hwnd As Long, Style As Long, State As Byte)
Dim lngCurrentStyle As Long

lngCurrentStyle = GetWindowLong(hwnd, GWL_STYLE)

Select Case State
Case 0 'Désactiver
lngCurrentStyle = lngCurrentStyle And Not Style
Case 2 'Inverser
lngCurrentStyle = lngCurrentStyle Xor Style
Case 1 'Activer
lngCurrentStyle = lngCurrentStyle Or Style
End Select

SetWindowLong hwnd, GWL_STYLE, lngCurrentStyle
End Sub

Private Sub Form_Load()
SetListBoxScroll List1, 550
List1.AddItem
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"
End Sub




Avatar
Gloops
Autant pour moi, j'ai joué neuneu.

Il fallait augmenter le deuxième argument de SetListBoxScroll.

Impec, ça commence à avoir de l'allure.

Merci.
_____________________________________
Gloops a écrit, le 18/10/2004 04:23 :

Salut,

Bon alors j'ai copié le code dans le module du formulaire.
J'ai supprimé SendMessage parce que je l'avais déjà mis donc il était en
doublon (ça servait pour créer des colonnes).
Pour Form.Load j'ai gardé les instructions indiquées, en essayant au
début ou à la fin de la procédure.
J'ai doublé le texte test pour qu'il dépasse la largeur de la liste.

Et puis j'ai lancé. Pas de changement, sinon que les séparateurs de
colonnes ont disparu. Les tabulations fonctionnent toujours mais les
colonnes ne sont plus séparées par des traits verticaux. Bon ça ça ne me
torture pas trop, mais apparemment il y a autre chose que j'aurais dû
faire pour gérer le défilement horizontal dans la liste.

Est-ce qu'il n'y aurait pas incompatibilité avec la gestion des colonnes ?
Private Const LB_SETTABSTOPS As Long = &H192&
Call SendMessage(List1.hwnd, LB_SETTABSTOPS, 3&, TabStops(0))

ça serait un peu embêtant, parce que tant qu'à défiler horizontalement,
autant avoir des colonnes bien séparées ...

Pas besoin d'être administrateur, des fois ?


_________________________________________________
François Picalausa a écrit, le 16/10/2004 13:56 :

Hello,

Il faut que la listbox ait le style WS_HSCROLL.
Il faut ensuite envoyer un message à la listbox pour lui dire de
combien elle peut "scroller"
Et enfin, rafraichir le contrôle pour que l'affichage corresponde.
Voici un exemple:

Option Explicit

'Apis pour définir le style
Private Const GWL_STYLE = (-16)
Private Const GWL_EXSTYLE = (-20)
Private Const WS_HSCROLL = &H100000

Private Declare Function SetWindowLong _
Lib "user32" _
Alias "SetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long _
) _
As Long
Private Declare Function GetWindowLong _
Lib "user32" _
Alias "GetWindowLongA" _
( _
ByVal hwnd As Long, _
ByVal nIndex As Long _
) _
As Long

'Apis pour définir la zone qui peut-être "défilée"
Private Const LB_SETHORIZONTALEXTENT = &H194

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

'Apis pour afficher les modifications
Private Declare Function SetWindowPos _
Lib "user32" _
( _
ByVal hwnd As Long, _
ByVal hWndInsertAfter As Long, _
ByVal x As Long, _
ByVal y As Long, _
ByVal cx As Long, _
ByVal cy As Long, _
ByVal wFlags As Long _
) _
As Long
Private Const SWP_NOSIZE = &H1
Private Const SWP_NOMOVE = &H2
Private Const SWP_FRAMECHANGED = &H20
Private Const SWP_NOOWNERZORDER = &H200

Private Sub SetListBoxScroll(List As ListBox, ScrollWidth As Long)
SetStyle List.hwnd, WS_HSCROLL, 1

'wParam : Specifies the number of pixels
'by which the list box can be scrolled.
SendMessage List.hwnd, LB_SETHORIZONTALEXTENT, ScrollWidth, ByVal 0&

'SetWindowPos permet de rafraichir le contrôle
SetWindowPos List.hwnd, 0, 0, 0, 0, 0, _
SWP_NOSIZE Or SWP_NOMOVE Or SWP_FRAMECHANGED Or SWP_NOOWNERZORDER
End Sub

'State :
' 0 : désactive le Style
' 1 : active le Style
' 2 : inverse l'état du Style
Private Sub SetStyle(hwnd As Long, Style As Long, State As Byte)
Dim lngCurrentStyle As Long

lngCurrentStyle = GetWindowLong(hwnd, GWL_STYLE)

Select Case State
Case 0 'Désactiver
lngCurrentStyle = lngCurrentStyle And Not Style
Case 2 'Inverser
lngCurrentStyle = lngCurrentStyle Xor Style
Case 1 'Activer
lngCurrentStyle = lngCurrentStyle Or Style
End Select

SetWindowLong hwnd, GWL_STYLE, lngCurrentStyle
End Sub

Private Sub Form_Load()
SetListBoxScroll List1, 550
List1.AddItem
"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"

End Sub