Seite 1 von 1
[gelöst]GadgetToolTip
Verfasst: 24.06.2014 18:38
von DeKa
Moin,
die Funktion von GadgetToolTip kann sehr hilfreich sein, leider gibt er den Text ungebrochen in einer Zeile aus.
Gibt es eine Möglichkeit den Text in mehrere Zeilen umzubrechen ?
Oder gibt es einen ähnlichen Befehl der einen Textblock anzeigt, sowie in Excel die Notizzettel?
Danke
DeKa
Re: GadgetToolTip
Verfasst: 24.06.2014 20:11
von Sicro
Das GadgetToolTip() von PB unterstützt leider keine mehrzeiligen Tooltips.
WinAPI-Lösungen:
ToolTip mit Zeilenumbruch
ToolTip mit Icon, Titel und Zeilenumbruch
Re: GadgetToolTip
Verfasst: 25.06.2014 16:35
von DeKa
Schade das GadgetToolTip() keine mehrzeiligen Texte unterstützt!
Danke Sicro, für die Antwort und der beigefügten Links.
DeKa
Re: [gelöst]GadgetToolTip
Verfasst: 25.06.2014 18:01
von edel
Diese Funktionen geistern schon seit Jahren im Netz und zeigen wie man es nicht machen sollte. Mit den Funktionen wird jedesmal ein neues Handle erstellt. Wenn man jetzt ein Tooltip nimmt, um einen aktuellen Status anzuzeigen, wird das Programm (oder gar Windows selber) irgendwann am Ende sein. PB erstellt beim ersten Aufruf selber ein Tooltip, warum nutzt man das nicht?
Code: Alles auswählen
Import ""
PB_Object_GetThreadMemory(obj)
PB_Gadget_Globals
EndImport
Structure PB_GadgetGlobals
CurrentWindow.i
FirstOptionGadget.i
DefaultFont.i
*PanelStack.integer
PanelStackIndex.l
PanelStackSize.l
ToolTipWindow.i
EndStructure
Procedure GetToolTipHandle()
Protected *winObj.PB_GadgetGlobals
*winObj = PB_Object_GetThreadMemory(PB_Gadget_Globals)
ProcedureReturn *winObj\ToolTipWindow
EndProcedure
Procedure.l GadgetToolTipEx(Gadget, Text.s)
Protected Info.TOOLINFO
Protected hTip.i
hGadget = GadgetID(Gadget)
if not GetToolTipHandle()
GadgetToolTip(Gadget, Text)
endif
hTip = GetToolTipHandle()
Info\cbSize = SizeOf(TOOLINFO)
Info\uFlags = #TTF_SUBCLASS|#TTF_IDISHWND
Info\hWnd = hGadget
Info\uID = hGadget
Info\hInst = GetModuleHandle_(0)
Info\lpszText = @Text
SendMessage_(hTip, #TTM_ADDTOOL, 0, @Info)
SendMessage_(hTip, #TTM_SETMAXTIPWIDTH, 0, 1024)
ProcedureReturn #True
EndProcedure
Procedure Main()
hWnd = OpenWindow(0, #PB_Ignore, #PB_Ignore, 300, 200, "")
ImageGadget(0, 20, 20, 150, 150,0, #PB_Image_Border)
GadgetToolTipEx(0, "fdfg" + chr(13) + "sddfsdfsfdsd")
Repeat
event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
EndProcedure:End Main()
Re: [gelöst]GadgetToolTip
Verfasst: 25.06.2014 18:21
von ts-soft
PS: edels tip funktioniert auch unter 64-bit (und 32-bit), wenn man die Strukture abändert:
Code: Alles auswählen
Import ""
PB_Object_GetThreadMemory(obj)
PB_Gadget_Globals
EndImport
Structure PB_GadgetGlobals
CurrentWindow.i
FirstOptionGadget.i
DefaultFont.i
*PanelStack.integer
PanelStackIndex.l
PanelStackSize.l
ToolTipWindow.i
EndStructure
Gruß
Thomas
Re: [gelöst]GadgetToolTip
Verfasst: 25.06.2014 22:54
von Sicro
Ok, dass jedes mal ein neues Fenster und somit auch jedes Mal ein neues Handle erstellt wird, ist natürlich schlecht, das sollte man im Code abändern. Da habe ich nicht aufgepasst und die Links zu den Codes blind gepostet.
Da wir uns im Anfänger-Forum befinden, rate ich daher lieber die bessere und schon fertige Variante von edel zu verwenden.
Kurze Frage zu diesen internen PB-Funktionen, deren Antwort für DeKa sicherlich auch wissenswert ist:
Ist die Verwendung dieser internen PB-Funktionen auch noch garantiert bei zukünftigen Versionen von PB, also nicht so wie bei den Funktionen EventwParam() und EventlParam()?
Re: [gelöst]GadgetToolTip
Verfasst: 26.06.2014 18:38
von edel
Nein, Fred kann jederzeit etwas aendern und dann war es das. Allerdings laeuft das bei mir schon seit mehr als 7 Jahren.
Danke Thomas, werde es anpassen.
Re: [gelöst]GadgetToolTip
Verfasst: 27.06.2014 15:38
von Falko
Sorry das ich mich jetzt erst melde, aber hier ist vielleicht eine
einfachere variante die mir ozzie aus dem englischen Forum aufgezeigt hatte, nachdem
ich einen alten Thread mal aufgerollt habe. Sowas könnte Fred eigentlich simpel und einfach
einbauen, wenn er nur wollte. Er will aber nicht
Code: Alles auswählen
;http://www.purebasic.fr/english/viewtopic.php?p=447192#p447192"
;Tipp von ozzie aus dem englischen Forum
Procedure setToolTipControls()
Protected ttip
ttip = FindWindow_("tooltips_class32",0)
If ttip
SendMessage_(ttip,#TTM_SETMAXTIPWIDTH,0,500) ; maximum width set to 500 pixels
SendMessage_(ttip,#TTM_SETDELAYTIME,#TTDT_INITIAL,0) ; cause tooltip to be displayed immediately
SendMessage_(ttip,#TTM_SETDELAYTIME,#TTDT_AUTOPOP,30000) ; time (in ms) tooltip will remain visible
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 270, 100, "GadgetTooltip", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(0, 10, 30, 250, 30, "Schalter mit Tooltip")
GadgetToolTip(0, "Tooltip für den Schalter"+#CRLF$+"Teste dieses mal"+#CRLF$+"Cool und nur mit wenigen Sendmessages")
setToolTipControls()
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf