Das ListView-Control gehört sicherlich zu einem der meist verwendeten Controls in der eigenen VB-Anwendung. Verwendet man das ListView-Control nicht im Report-Modus (Detail-Ansicht), kann der Anwender die einzelnen Elemente zur Laufzeit verschieben, was jedoch nicht immer gewollt ist. Leider verfügt das ListView-Control über keine entsprechende Eigenschaft, die das Verschieben der ListView-Elemente verhindert. Per Subclassing lässt sich diese Funktionalität jedoch mit wenig Aufwand nachrüsten. Erstellen Sie ein neues Projekt und platzieren auf die Form ein ListView-Control und ein ImageList-Control. Fügen Sie dem ImageList-Control ein Bildsymbol hinzu. Option Explicit Private Sub Form_Load() Dim i As Long ' ImageList-Control an das ListView binden Set ListView1.Icons = ImageList1 ' Ansicht auf "große Symbole" festlegen ListView1.View = lvwIcon ' ein paar ListView-Elemente erzeugen For i = 1 To 20 ListView1.ListItems.Add , , "Element " & CStr(i), 1 Next i ' Subclassing starten StartSubclass Me.hWnd End Sub Private Sub Form_Unload(Cancel As Integer) ' Wichtig! Das Subclassing muss ordnungegemäß ' wieder ausgeschaltet werden!!! EndSubclass End Sub Fügen Sie dem Projekt ein neues Modul mit folgendem Code hinzu: Option Explicit ' Benötigte API-Deklarationen 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 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 Sub CopyMemory Lib "kernel32" _ Alias "RtlMoveMemory" ( _ pDest As Any, _ pSource As Any, _ ByVal dwLength As Long) Private Const WM_NOTIFY = &H4E Private Const GWL_WNDPROC = -4 Private nOldWndProc As Long Private nHWnd As Long Private Type NMHDR hwndFrom As Long idFrom As Long code As Long End Type ' Nachrichten-Konstanten Public Const LVN_FIRST = -100& Public Const LVN_BEGINDRAG = (LVN_FIRST - 9) Public Sub StartSubclass(hWnd As Long) ' Subclassing starten nHWnd = hWnd nOldWndProc = SetWindowLong(nHWnd, GWL_WNDPROC, AddressOf WindowProc) End Sub Public Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long Dim oMsg As NMHDR Select Case uMsg Case WM_NOTIFY ' Message-Struktur füllen Call CopyMemory(oMsg, ByVal lParam, Len(oMsg)) Select Case oMsg.code Case LVN_BEGINDRAG ' Nachrichtenverarbeitung auf "erledigt" setzen, ' so dass der Drag-Vorgang sofort abgebrochen wird WindowProc = 1 Exit Function End Select End Select ' Alle anderen Windows-Nachrichten an das Objekt weiterleiten WindowProc = CallWindowProc(nOldWndProc, hWnd, uMsg, wParam, lParam) End Function Public Sub EndSubclass() ' Subclassing beenden Call SetWindowLong(nHWnd, GWL_WNDPROC, nOldWndProc) End Sub Dieser Tipp wurde bereits 10.759 mal aufgerufen. Voriger Tipp | Zufälliger Tipp | Nächster Tipp
Anzeige
Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv Vol.6 (einschl. Beispielprojekt!) Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! - nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten - Symbol-Galerie mit mehr als 3.200 Icons im modernen Look Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m. |
vb@rchiv CD Vol.6 Geballtes Wissen aus mehr als 8 Jahren vb@rchiv! Online-Update-Funktion Entwickler-Vollversionen u.v.m. Tipp des Monats März 2024 Dieter Otter UTF-8 Konvertierung von Dateien und Strings VB6 selbst verfügt über keine Funktionen zur UTF-8 Konvertierung von Daten. Mit Hilfe des ADODB.Stream-Objekts lassen sich diese fehlenden Funktionen aber schnell nachrüsten. sevWizard für VB5/6 Professionelle Assistenten im Handumdrehen Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) |
||||||||||||||||
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein. |