Hallo Werner,
für alles gibt es eine Lösung 
Zur Der Sache mit Mehrfachauswahl in Listboxen.
jede Listbox hat eine Eigenschaft „Multiselect“ Diese ist Standartmaessig auf 0 gestellt. Sprich, nur eine Auswahl zulaessig!
Du kannst aber ihr den Wert 1 oder 2 zuweisen.
Weisst du ihr den Wert 1 zu so wird jedes Element ausgewaehlt was du anklickst!
Bsp.: du klickst auf item 2, so wird es gewaehlt, nun klickst du auf item 5 so wird dies auch gewaehlt!( Also 2 und 5 sind makiert)
Setzt du aber die Eigenschaft Multiselect auf 2 ( Erweitert) so verhaelt sich die Box wie im Explorer.
Klick -> item wird selectiert. Klick aufs naechste item, vorhergehendes Item wird deselectiert und neues Item wird selectiert.
Klick auf item 2 ( item 2 ist selectiert) Weitere Elemente kannst du nur selectieren indem du die STRG oder SHIFT Taste gedrueckt haelst.
Eigentlich eine ganz simple Sache 
So, da du sagst du koenntest auf die Checkboxen verzichten. lade dir mal das Steuerelement MBLISTEX aus dem Netz.
http://cuinl.tripod.com/downloads/activex/MBListEx.zip
Das hat die selbigen Eigenschaften wie eine normale Liste.
Du kannst jedoch aber noch Bilder in die Listen einpflegen und jedem Item verschieden Farben / Schriftarten etc. zuweisen. Hinzufügen tust du ein Eintrag mit
ListEx1.SelBackColor = vbWhite
ListEx1.SelForeColor = vbBlack
ListEx1.AddItem "Eintrag 1", , vbBlue, vbGreen, , , , "Eintrag1", True
ListEx1.AddItem "Eintrag 2", , vbYellow, vbRed, , , , "Eintrag2", True
Wie du siehst kannst du mit leichtigkeit verschiedene Farben zuweisen.
Für jedes sep. item, sowie wenn sie selektiert sind 
Ein sehr starkes Steuerelement was ich immer verwende. Ok es kann noch einiges mehr, aber des ist erstmal unrelevant
Soviel zu dem Thema 
Solltest du dort noch Fragen, so schreib einfach *zwinker*
So zu der Sache mit dem Mousewheel 
Ich weiss nicht was du genau vor hast.
Aber ich habe mal was getippelt. Du kannst so darauf zugreifen wenn das Mausrad gedrueckt wurde und auch wenn es gescrollt wird, so wird ein ereignis ausgelöst. Aus diesen Functionen heraus kannst du dann ja dein programm steuern. Zum beispiel wenn das rad nach unten gescrollt das naechste element aus einer liste x auswaehlen oder.
Die Sache verwendet Subclassing, was bei mir öfters dazu führt das mein VB abschmiert
( Was aber normal ist) Das heisst, vor jedem probelauf dein Project speichern, nicht das dann deine Arbeit umsonst war!
Erstelle einfach ein Modul mit folgendem Code
Public Declare Function SetWindowsHookEx Lib "user32" Alias \_
"SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, \_
ByVal hmod As Long, ByVal dwThreadId As Long) As Long
Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, \_
ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Function UnhookWindowsHookEx Lib "user32" \_
(ByVal hHook As Long) As Long
Public 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" \_
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) \_
As Long
Private Type POINTAPI
X As Long
Y As Long
End Type
Private Type MOUSEHOOKSTRUCT
pt As POINTAPI
hWnd As Long
wHitTestCode As Long
dwExtraInfo As Long
End Type
Private Const WM\_MOUSEWHEEL = &H20A
Private Const WM\_MBUTTONUP = &H208
Private Const WM\_MBUTTONDOWN = &H207
Private Const WM\_MBUTTONDBLCLK = &H209
Private Const WM\_LBUTTONDOWN = &H201
Private Const WM\_LBUTTONUP = &H202
Private Const MK\_LBUTTON = &H1
Private Const MK\_MBUTTON = &H10
Private Const MK\_RBUTTON = &H2
Public Const WH\_MOUSE = 7
Private Const WHEEL\_DELTA = 120
Public Const GWL\_WNDPROC = -4
Dim hook As Long
Dim nKeys As Long, Delta As Long, XPos As Long, YPos As Long
Dim OriginalWindowProc As Long
Public Enum mButtons
LBUTTON = &H1
MBUTTON = &H10
RBUTTON = &H2
End Enum
Public Function MouseProc(ByVal nCode As Long, ByVal wParam As Long, lParam As MOUSEHOOKSTRUCT) As Long
Select Case nCode
Case Is
In deinem Program musst du noch folgendes einbinden, damit das Subclassing klappt :smile:
Private Sub Form\_Load()
Init Me
End Sub
Private Sub Form\_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Ende
End Sub
Private Sub Form\_Unload(Cancel As Integer)
Ende
End Sub
hier machst du nichts weiter wie beim starten das Subclassing initialisieren und GANZ WICHTIG , beim beenden deines programmes, das subclassing wieder beenden!
So ich hoffe ich konnte dir ein wenig weiterhelfen.
MFG Alex