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
Sicro hat geschrieben:Das GadgetToolTip() von PB unterstützt leider keine mehrzeiligen Tooltips.
WinAPI-Lösungen:
ToolTip mit Zeilenumbruch
ToolTip mit Icon, Titel und Zeilenumbruch

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 :mrgreen:

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