Seite 1 von 1

ListIconGadget und ToolTip

Verfasst: 28.04.2008 13:18
von ThoPie
Hallo,

in einem ListIconGadget würde ich gern, wenn der Mauszeiger in einer Zeile mit einem bestimmten Inhalt in einem Feld steht, eine Information über einen ToolTip anzeigen lassen.
Gibt es da eine relativ einfache Umsetzungsmöglichkeit?
Vielen Dank.

Verfasst: 02.05.2008 22:33
von Shardik
Nach meinen Recherchen ist es laut MSDN lediglich möglich, für Zellen in der ersten Spalte eines ListIconGadget einen ToolTip-Text anzeigen zu lassen. Fluid Byte hat dies in dem folgenden schönen Beispiel demonstriert:
http://www.purebasic.fr/german/viewtopi ... 97&start=2

Natürlich ist es möglich, die augenblickliche Zeile und Spalte des Cursors in einem ListIconGadget zu ermitteln und anzeigen zu lassen. Nur die ToolTip-Anzeige ist wie oben erwähnt nur für Zellen in der ersten Spalte möglich. Ich habe einmal ein Beispiel erstellt, in dem die aktuelle Zeilen- und Spalten-Info in einem Text-Gadget am unteren Rand eingeblendet wird. Dazu habe ich ein Beispiel von Trond aus dem englischen Forum erweitert, das lediglich die Zeilennummer ermittelt (http://www.purebasic.fr/english/viewtop ... 35&start=1). Dieses Beispiel verwendet einen gänzlich anderen Ansatz als das von Fluid Byte und benötigt keinen Callback:

Code: Alles auswählen

Structure LV_HITTESTINFOEX
  Pt.POINT
  Flags.L
  iItem.L
  iSubItem.L
  iGroup.L
EndStructure

OpenWindow(0, 0, 0, 264, 344, "ListIconGadget mit Positionsinfo", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
CreateGadgetList(WindowID(0)) 
ListIconGadget(0, 10, 10, WindowWidth(0) - 20, WindowHeight(0) - 40, "Spalte 1", 120, #PB_ListIcon_FullRowSelect)
AddGadgetColumn(0, 1, "Spalte 2", 120)
TextGadget(1, 10, WindowHeight(0) - 20, 100, 15, "")

For i = 1 To 20 
  AddGadgetItem(0, -1, "Zeile " + Str(i) + ", Spalte 1" + #LF$ + "Zeile " + Str(i) + ", Spalte 2")
Next 

Repeat 
  Select WaitWindowEvent() 
    Case #WM_MOUSEMOVE 
      GetWindowRect_(GadgetID(0), @Rect.RECT) 
      ScreenToClient_(WindowID(0), @Rect) 
      ScreenToClient_(WindowID(0), @Rect+8) 

      With Rect
        If WindowMouseX(0) > \Left And WindowMouseX(0) < \Right
          If WindowMouseY(0) > \Top And WindowMouseY(0) < \Bottom
            HitTestInfo.LV_HITTESTINFOEX
            HitTestInfo\Pt\x = WindowMouseX(0) - GadgetX(0)
            HitTestInfo\Pt\y = WindowMouseY(0) - GadgetY(0)
            Row = SendMessage_(GadgetID(0), #LVM_HITTEST, 0, @HitTestInfo)

            HitTestInfo\Pt\x = WindowMouseX(0) - GadgetX(0)
            HitTestInfo\Pt\y = WindowMouseY(0) - GadgetY(0)
            SendMessage_(GadgetID(0), #LVM_SUBITEMHITTEST, 0, @HitTestInfo)
            Column = HitTestInfo\iSubItem

            If Row = -1 Or Column = -1
              SetGadgetText(1, "")
            Else
              SetGadgetText(1, GetGadgetItemText(0, Row, Column))
            EndIf
          EndIf 
        EndIf 
      EndWith 
    Case #PB_Event_CloseWindow 
      Break 
  EndSelect 
ForEver