ListViewGadget: GadgetTooltip bei überlangem Text?

Für allgemeine Fragen zur Programmierung mit PureBasic.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

ListViewGadget: GadgetTooltip bei überlangem Text?

Beitrag von c4s »

Hi liebe Community,
Ich habe seit gestern das erstemal mit mit dem ListviewGadget beschäftigt
und war mal wieder ziemlich erfreut darüber, wie genial doch PB ist, denn
an Einfachheit ists mal wieder nicht zu übertreffen! (Ich neige dazu Vorurteile
zu pflegen wie z.B. das etwas eh zu schwer wäre etc ;))

Nunja das füttern mit Strings funktioniert ganz gut. Nun habe ich aber auch
welche, die breiter sind als der Rahmen/die Breite des ListViewGadgets.
Bisher schien es mir immer so, dass andere Programme immer den Text,
wenn er eben am Ende abgeschnitten ist, per Tooltip ganz anzeigen. Das ist
einfach selbstverständlich geworden. Daher habe ich die Vermutung, dass
dahinter ein einfacher Flag per Api-Konstante liegt (oder zumindest wünsche/
hoffe ich dies).
Und eventuell schonmal im vorraus: Ich möchte keinen horizontalen Scroll-
balken ;)

mfg c4s
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

In PB selber ist mir nichts dergleichen bekannt, aber du kannst das über die Windows-API auch selber lösen, such einfach mal in der MSDN-Doku.

Hab dir hier mal nen Link raus gesucht, der Interessante Teil steht im Absatz "Implementing In-Place ToolTips"

Code: Alles auswählen

http://msdn.microsoft.com/en-us/library/bb760252(VS.85).aspx

Das ist zwar etwas aufwändiger als ein in PB eingebauter Befehl, aber du kannst dir daraus ja eine Prozedur machen und für jedes deiner Projekte wieder verwenden.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Beitrag von c4s »

Danke für den Tipp!
Aber der Artikel spricht leider nur davon, dass das besondere an diesem Fall
die Positionierung des Tooltips sei. Es wird dann wohl nur beschrieben, wo
eben dieses Fenster mit dem Tooltip erstellt werden soll.
Ich bin mal wieder von einer einfacheren Lösung ausgegangen und dachte,
das es so grundlegend in Windows ist, dass ein einfacher Befehl genügen
würde. Aber mich groß mit Tooltips erstellen, positionieren, callbacks und
sonstwas zu beschäftigen ist es mir dann doch nicht wert :wink:


mfg c4s
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Wollte mal wissen wie es gehen kann. Hat zwar etwas gedauert, aber hin bekommen <)

Siehe Procedure SetToolTip()

Code: Alles auswählen

;- Konstanten
Enumeration ; Window ID
  #Window
EndEnumeration

Enumeration ; Menu ID
  #Menu
EndEnumeration

Enumeration ; MenuItem ID
  #Menu_Exit
EndEnumeration

Enumeration ; Statusbar ID
  #Statusbar
EndEnumeration

Enumeration ; Gadget ID
  #List
EndEnumeration

; ***************************************************************************************

Procedure UpdateWindow()

  Protected x,y,dx,dy
  Protected mn,st,tb
  
  x = 0
  y = 0
  mn = MenuHeight()
  st = StatusBarHeight(#StatusBar)
  ;tb = ToolBarHeight(#ToolBar)
  dx = WindowWidth(#Window)
  dy = WindowHeight(#Window) - mn - st - tb
  ResizeGadget(#List, x, y, dx, dy)
  
EndProcedure

Procedure WriteLog(Info.s)
  Protected temp.s
  temp = FormatDate("%YYYY.%MM.%DD %HH:%II:%SS - ", Date()) + Info
  AddGadgetItem(#List, -1, temp)
  If CountGadgetItems(#List) > 500
    RemoveGadgetItem(#List, 0)
  EndIf
EndProcedure

Procedure MAKELPARAM(l, h)
  Protected result.l
  result = h << 16 & $FFFF0000 | l
  ProcedureReturn result
EndProcedure

#LB_ITEMFROMPOINT = 425

Procedure SetToolTip()

  Protected x, y, hwnd, item, text.s
  Static olditem = -1
  
  x = DesktopMouseX()
  y = DesktopMouseY()
  hwnd = WindowFromPoint_(x,y)
  Select hwnd
    Case GadgetID(#List)
      x = WindowMouseX(#Window) - GadgetX(#List)
      y = WindowMouseY(#Window) - GadgetY(#List)
      item = SendMessage_(hwnd, #LB_ITEMFROMPOINT, 0, MAKELPARAM(x,y))
      If item <> olditem
        olditem = item
        If item < $10000
          text = GetGadgetItemText(#List, item)
          GadgetToolTip(#List, text)
        Else
          GadgetToolTip(#List, "Listview")
        EndIf
      EndIf
  EndSelect
  
EndProcedure

;- Globale Variablen
Global exit = 0

;- Fenster
style = #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget
If OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 400, 300, "Fenster", style)
  ; Menu
  If CreateMenu(#Menu, WindowID(#Window))
    MenuTitle("&Datei")
      MenuItem(#Menu_Exit, "Be&enden")
  EndIf
  ; Statusbar
  CreateStatusBar(#Statusbar, WindowID(#Window))
  ; Gadgets
  If CreateGadgetList(WindowID(#Window))
    ListViewGadget(#List, 0,0,0,0)
    GadgetToolTip(#List, "Listview")
        
  EndIf
  
  For i = 1 To 9
    temp.s = ""
    For n = 1 To 80
      temp + Str(i) + "-"
    Next
    AddGadgetItem(#List, -1, temp)
  Next
   
  ;-- Hauptschleife
  Repeat
    event   = WaitWindowEvent(100)
    window  = EventWindow()
    menu    = EventMenu()
    type    = EventType()
    
    SetToolTip()
    
    Select event
      Case #PB_Event_Menu
        Select menu
          Case #Menu_Exit
            Exit = 1
        EndSelect
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #List
            Select EventType()
              Case #PB_EventType_LeftClick
            EndSelect
        EndSelect
      Case #PB_Event_CloseWindow
        Exit = 1
      Case #PB_Event_Repaint
      Case #PB_Event_SizeWindow
        UpdateWindow()
        
      Case #PB_Event_MoveWindow
      Case #PB_Event_ActivateWindow
      Case #PB_Event_SysTray
    
    EndSelect
    
  Until Exit
EndIf
FF :allright:

P.S. kleine verbesserung wenn Listview (Windows ListBox) nicht an Pos 0,0 anfang.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Schönes Beispiel, funktioniert ja schonmal.
Aber wenn der Text im ToolTip jetzt noch genau über dem Originaltext liegen soll, dann kommt man wohl nicht drum rum den ToolTip selber per API zu verwalten.
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Beitrag von c4s »

SUPER mk-soft! :allright:
Ist sogar noch klein genug, dass ich die Lösung als klein bezeuchnen
kann, was ich (bekanntlich) mag :)

@Rokur
Der Tooltip wird doch über dem Text geziegt - zumindest in der passenden
Zeile. Was mir nur aufgefallen ist: Wenn der Text nicht überlang ist, dann
wird trotzdem ein Tooltip angezeigt. <- Das meinste wohl ...
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Rokur hat geschrieben:Schönes Beispiel, funktioniert ja schonmal.
Nein, der Code funktioniert nicht mit deaktiviertem XP-Skin unter Vista!
c4s hat geschrieben:Der Tooltip wird doch über dem Text geziegt - zumindest in der passenden
Zeile. Was mir nur aufgefallen ist: Wenn der Text nicht überlang ist, dann
wird trotzdem ein Tooltip angezeigt. <- Das meinste wohl ...
Erstens das und zweitens wird z. B. im IE->Extras->Erweitert dieser besagte Tooltip ohne Zeitverzögerung angezeigt.

Ich denke daher auch, dass es irgendwie per API gehen muss.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Nein ich meine folgendes:
Der ToolTip oben aus dem Beispiel erscheint bei mir etwas nach links und nach unten versetzt, so dass die Originalzeile und der ToolTipText gleichzeitig sichtbar sind.
Aus den meisten Programmen (z.B. Windows Explorer) kenne ich es so das der ToolTipText den Originaltext genau überlagert. Das sieht dann so aus als ob sich die Zeile einfach verlängert.

Getestet mit Windows XP im klassischen Design (ohne das ganze runde Zeugs).

Dazu müsste man aber Schriftart, -größe und Position der Originalzeile ermitteln und den ToolTip dann selbst erstellen, formatieren und an der entsprechenden Stelle anzeigen.

ToolTip nur anzeigen, wenn die Zeile zu klein ist könnte man so lösen:
- Text der Originalzeile und Breite des ListviewGadgets ermitteln
- errechnen wie breit (in Pixel) der Text mit der verwendeten Schriftart und -größe ist
- Wenn Textlänge in Pixel > Breite des Listview, dann ToolTip anzeigen
AND51 hat geschrieben:Ich denke daher auch, dass es irgendwie per API gehen muss.
Ja, wie genau steht unter dem Link, den ich gepostet habe.
Benutzeravatar
mk-soft
Beiträge: 3856
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

AND51 hat geschrieben:Nein, der Code funktioniert nicht mit deaktiviertem XP-Skin unter Vista!
Mal wieder eine Macke von Vista (Muss zugeben das ich kein Vista habe).
Nach API Beschreibung müsste es ab Windows 95 und NT4 funktionieren.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Beitrag von c4s »

So... hab da doch einen Api-Befehl gefunden.
Siehe h i e r
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Antworten