vb-Zentrum
Controls
http://www.vb-zentrum.de/tip_controls.html

© 2010 vb-Zentrum

0004 ListView mit einstellbaren Icon-Abständen (LVM_SETICONSPACING = &H1035&)

Mit dem Standard ListView-Control die Abstände der Icons einstellen...
Das ist eine Funktion, die man vergeblich in den Eigenschaften dieses Controls sucht.
In der MSDN wird man aber schnell fündig: es ist wieder einmal die SendMessage-Funktion, die uns von der API angeboten wird, um eben diesen Effekt nachzubilden. Leider funktioniert das Ganze unter VB6 mal wieder nicht so richtig: egal was wir als Parameter übergeben - das Ergebnis sind stets die gleichen überlappenden Icons! Abhilfe schafft hier eine kleine Änderung:
Verwenden Sie PostMessage statt SendMessage!

Hintergrund: PostMessage arbeitet fast genauso wie SendMessage - setzt die Nachricht in die Warteschlange von Windows, kehrt aber sofort zurück, während SendMessage auf einen Rückgabewert wartet! Das scheint in VB Probleme zu verursachen. Also nutzen Sie die Post und vertrauen darauf, dass die Zustellung auch erfolgt! :-)

Was Sie sonst noch wissen sollten:

  • Die Abstände wSpace und hSpace repräsentieren Pixel (und nicht Twips!)
  • Zum gewünschten Abstand muß die aktuelle Icongröße addiert werden!
    Bsp.: gewünschter Abstand = 40px, Icongröße = 32px -> wSpace/hSpace = 40+32 = 72
  • wSpace = -1 und hSpace = -1 setzt die Abstände wieder auf Default
  • Die Funktion muss vor dem Füllen des ListView-Controls aufgerufen werden!
' Deklaration:
Public Declare Function PostMessage Lib "user32" Alias" PostMessageA" (ByVal hWnd As Long, _
       ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

' Funktion:
' Setzt den Abstand der Icons im ListView-Control in Pixel
' Minimaler Wert ist 4Pixel! wSpace/hSpace = Icongröße+Abstand in Pixel!
Public Function ListViewSetIconSpace(ByVal hWnd As Long, _
                ByVal wSpace As Integer, ByVal hSpace As Integer) As Long
  Dim isp As Long

  isp = (wSpace And &HFFFF&) Or (hSpace * &H10000) ' MakeLong
  ListViewSetIconSpace = PostMessage(hWnd, &H1035&, 0, isp)
End Function

Autor: ralf schlegel
Stand: 06/2009

Nach oben

0003 Tooltip-Text des Slidercontrols ausschalten

Wenn Sie den Slider der Standard-Controls mit der Maus verschieben, so erscheint grundsätzlich der Wert (value) des Controls als ToolTip-Text. Das ist nicht immer sinnvoll und kann mit zwei einfachen SendMessage Aufrufen unterbunden werden. Kopieren Sie die unten stehende Funktion in ein Programm-Modul und rufen Sie sie einmal (zum Beispiel in der Load-Anweisung der Parent-Form) auf. Übergeben Sie der Funktion das Handle des Sliders:

' Deklaration:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

' Funktion:
Public Sub sliderToolTipOff(ByVal hwnd As Long)
  Dim ret As Long

  ret = SendMessage(hwnd, &H41E, 0&, ByVal 0&)
  SendMessage ret, &H401, 0&, ByVal 0&
End Sub

Autor: ralf schlegel
Stand: 03/2007

Nach oben

0002 TabStrip-Registerkarte zur Laufzeit umschalten

Das TabStrib-Control und seine Registerkarten wird in den meisten Anwendungen zum Beispiel in der Auswahl der Programmeigenschaften eingesetzt. Leider, so scheint es, gibt es keine Methode um eine bestimmte Registerkarte zur Laufzeit zu aktivieren. Und dennoch läßt sich diese Eigenschaft mit einer einzigen Codezeile realisieren:

TabStrip1.Tabs(Index).Selected = True
Wobei 'Index' für die gewünschte Registerkarte steht.
Vorsicht: Der Index beginnt in diesem Fall bei 1!

Autor: ralf schlegel
Stand:03/2005

Nach oben

0001 ListView mit optimaler Spaltenbreite

Leider stellt das ListView-Control von Hause aus keine Methode zum Optimieren der Spaltenbreite in der Reportansicht zur Verfügung. Dennoch läßt sich diese Funktion wieder einmal mit einem API-Aufruf nachbilden, und zwar mit dem SendMessage Befehl. Übrigens - auch der Windows Explorer unterstütz diese Funktion: öffnen Sie ein Explorerfenster in der Detailansicht, halten Sie die <Strg>-Taste gedrückt und betätigen die <+>-Taste des Ziffernblocks...

' Deklaration:
Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
        (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

' Funktion:
Public Sub lvwSetColumnWidth(lstView As ListView, ByVal colIdx As Long)
  Const LV_SETCOLUMNWIDTH As Long = &H101E
 
  With lstView
    ' Prüfen, ob das Listview in der Ansicht "Report" ist
    If .View = lvwReport Then
      If colIdx > 0 And colIdx <= .ColumnHeaders.Count Then
        SendMessage .hwnd, LV_SETCOLUMNWIDTH, colIdx - 1, -2
      End If
    End If
  End With
End Sub

' Aufruf für alle Spalten eines ListView:
For i = 1 To ListView1.ListItms.Count
  lvwSetColumnWidth ListView1, i
Next i

Autor: ralf schlegel
Stand: 12/2004

Nach oben