Seite 1 von 1
ListViewGadget: GadgetTooltip bei überlangem Text?
Verfasst: 02.06.2008 17:39
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
Verfasst: 03.06.2008 12:03
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.
Verfasst: 03.06.2008 12:46
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
mfg c4s
Verfasst: 03.06.2008 22:25
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
P.S. kleine verbesserung wenn Listview (Windows ListBox) nicht an Pos 0,0 anfang.
Verfasst: 04.06.2008 09:35
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.
Verfasst: 04.06.2008 12:30
von c4s
SUPER mk-soft!
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 ...
Verfasst: 04.06.2008 12:46
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.
Verfasst: 04.06.2008 14:14
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.
Verfasst: 04.06.2008 17:26
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.
Verfasst: 08.06.2008 22:44
von c4s
So... hab da doch einen Api-Befehl gefunden.
Siehe
h i e r