[Windows] Multiline-Tooltip mit Auto-Wordwrap oder per #CRLF

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
inSANE
Beiträge: 5
Registriert: 16.11.2010 17:16

[Windows] Multiline-Tooltip mit Auto-Wordwrap oder per #CRLF

Beitrag von inSANE »

Hallo zusammen,

vor kurzem wurde im englischen Forum darüber geschrieben, das der Gadget-Tooltip von PureBasic unter Linux und OSX einen Wordumbruch per #CRLF$ unterstützt, er dies unter Windows jedoch nicht tut.

Anbei mal eine kleine Lösung, um auch unter Windows Multiline-Tooltips zu erhalten.
Bei Angabe einer (optionalen) Breite für das Tooltip wird bei Bedarf automatisch umgebrochen.
Bei Verwendung von #CRLF$ innerhalb des Textes, wird der Text an diesen Stellen umgebrochen.

Code: Alles auswählen

Procedure GadgetToolTipML(hwndParent, Text.s, Width = 0)
	
	If IsGadget(hwndParent) And Not IsWindow_(hwndParent)  ; Allow, to enter either the PB-#Gadget or a Window-/Gadget-ID
		hwndParent = GadgetID(hwndParent)
	EndIf
	
	Protected hwndTT = CreateWindowEx_(#WS_EX_TOPMOST, #TOOLTIPS_CLASS, #Null, #WS_POPUP | #TTS_NOPREFIX | #TTS_ALWAYSTIP, #CW_USEDEFAULT, #CW_USEDEFAULT, #CW_USEDEFAULT, #CW_USEDEFAULT, hwndParent , #Null, GetModuleHandle_(0), #Null)
	
	SetWindowPos_(hwndTT, #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOACTIVATE)
	
	Protected ti.TOOLINFO
	
	ti\cbSize   = SizeOf(TOOLINFO);
	ti\uFlags   = #TTF_SUBCLASS;
	ti\hwnd     = hwndParent;
	ti\hinst    = #Null
	ti\lpszText = @Text
	GetClientRect_(hwndParent, @ti\rect);
	
	SendMessage_(hwndTT, #TTM_ADDTOOL, 0, @ti)
	
	If Width
		SendMessage_(hwndTT, #TTM_SETMAXTIPWIDTH, 0, Width)
	ElseIf FindString(Text, #CRLF$, 1)
		SendMessage_(hwndTT, #TTM_SETMAXTIPWIDTH, 0, 9999)
	EndIf
	
EndProcedure

Text.s = "The quick brown fox jumps over the lazy dog. Ein Neger mit Gazelle zagt im Regen nie."
CRText.s = "The quick brown fox jumps" + #CRLF$ + "over the lazy dog." + #CRLF$ + "Ein Neger" + #CRLF$ + "mit Gazelle zagt im Regen nie."

If OpenWindow(0,0,0,300,125,"MultiLine ToolTips", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	
	ButtonGadget(0,10,15,280,20,"Long single lined ToolTip")
	ButtonGadget(1,10,40,280,20,"Long auto-wordwrap ToolTip")
	ButtonGadget(2,10,65,280,20,"Short auto-wordwrap ToolTip")
	ButtonGadget(3,10,90,280,20,"ToolTip with #CRLF wordwrap")
	
	GadgetToolTipML(WindowID(0), "I'm a Window, and I'm proud to have my own TooltTip.   :-)",100)
	
	GadgetToolTipML(GadgetID(0), Text)     ; You can either use a WindowID() / GadgetID()
	GadgetToolTipML(1, Text, 300)          ; or the PB-#Gadget as first Parameter.
	GadgetToolTipML(2, Text, 100)
	GadgetToolTipML(3, CRText)
	
	Repeat
		Event = WaitWindowEvent()
	Until Event = #PB_Event_CloseWindow
EndIf
Getestet unter Win7-x86 & -x64.

Vielleicht kann's ja der ein oder andere mal brauchen. <)
Hilli
Beiträge: 17
Registriert: 07.10.2009 15:07

Re: [Windows] Multiline-Tooltip mit Auto-Wordwrap oder per #

Beitrag von Hilli »

Schönes Ding :allright:

War gerade auf der Suche nach so etwas, Danke.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: [Windows] Multiline-Tooltip mit Auto-Wordwrap oder per #

Beitrag von Kiffi »

inSANE hat geschrieben:Vielleicht kann's ja der ein oder andere mal brauchen. <)
im Moment nicht, danke. Ich find's aber löblich, dass Du hier
den Code postest :allright:

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] Multiline-Tooltip mit Auto-Wordwrap oder per #

Beitrag von STARGÅTE »

Liegt das nur an meinem System (Win XP, SP3), dass "deine" Tooltips immer nur genau einmal erscheinen (bei erneutem Mouse-Hover) und dann nie wieder ?
Nämlich genau dann wenn ich den jeweiligen Button gedrückt hatte ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: [Windows] Multiline-Tooltip mit Auto-Wordwrap oder per #

Beitrag von c4s »

STARGÅTE hat geschrieben:Liegt das nur an meinem System (Win XP, SP3), dass "deine" Tooltips immer nur genau einmal erscheinen (bei erneutem Mouse-Hover) und dann nie wieder ?
Nämlich genau dann wenn ich den jeweiligen Button gedrückt hatte ...
Ich bin mir nicht ganz sicher ob das ein "Bug" von Windows ist oder so gewollt. Wenn du aber explizit die Anzeigedauer einstellst, sollte es funktionieren:

Code: Alles auswählen

SendMessage_(hwndTT, #TTM_SETDELAYTIME, #TTDT_AUTOPOP, 15000)
;SendMessage_(hwndTT, #TTM_SETDELAYTIME, #TTDT_INITIAL, 750)
;SendMessage_(hwndTT, #TTM_SETDELAYTIME, #TTDT_RESHOW, 1500)
"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