Seite 1 von 1

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

Verfasst: 01.12.2010 07:12
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. <)

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

Verfasst: 01.12.2010 09:51
von Hilli
Schönes Ding :allright:

War gerade auf der Suche nach so etwas, Danke.

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

Verfasst: 01.12.2010 10:32
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

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

Verfasst: 01.12.2010 10:56
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 ...

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

Verfasst: 01.12.2010 12:17
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)