Seite 2 von 2

Re: Tooltip () -> schnell und einfach ein Tooltip anzeigen

Verfasst: 30.06.2014 21:53
von SBond
Version 1.02: *only Windows*

das Tooltip ist nun immer innerhalb des Desktops sichtbar

Code: Alles auswählen

Procedure Tooltip (sText.s , sTitel.s = "", sSymbol.s = "kein", iX_Pos.i = #PB_Default, iY_Pos.i = #PB_Default, iMax_Breite.i = #PB_Default, bBallon.i = #False, bSchliessen.i = #False)
	
	#TTF_ABSOLUTE		= $0080
	#TTF_TRACK			= $0020
	#TTS_CLOSE			= $80
	#TTS_NOFADE			= $20
	
	Static		iTooltip_ID.i		= 0
	Static		iStyle_aktuell.i	= 0
	Static		iX_Pos_aktuell.i	= 0
	Static		iY_Pos_aktuell.i	= 0	
	Static		sText_aktuell.s		= ""
	Static		sTitel_aktuell.s	= ""
	Static		sSymbol_aktuell.s	= ""

	Protected 	iUpdate_Inhalt.i	= #False
	Protected 	iUpdate_Position.i	= #False
	Protected	iX_Pos_Offset.i		= 0
	Protected	iY_Pos_Offset.i		= 0
	
	Protected	iSymbol.i			= 0
	Protected	iStyle.i			= #WS_POPUP | #TTS_NOPREFIX | #TTS_ALWAYSTIP | #TTS_NOFADE
	Protected	iExStyle.i			= #WS_EX_TOPMOST
	Protected 	lWindowID.l			= 0	; experimentell: WindowID angeben, falls es Probleme mit der Darstellung gibt
	Protected	iInstanz.i			= GetModuleHandle_(0)
	Protected	lPosition.l			= 0

	Protected	stParameter.TOOLINFO
	Protected	stAbmessungen.RECT
	Static temp = 0

	; Tooltip löschen, wenn kein Text angegeben wurde
	If sText = "" And iTooltip_ID <> 0
		DestroyWindow_(iTooltip_ID)
		iTooltip_ID 	= 0
		iStyle_aktuell 	= 0
		iX_Pos_aktuell	= 0
		iY_Pos_aktuell	= 0
		sText_aktuell 	= ""
		sTitel_aktuell 	= ""
		sSymbol_aktuell	= ""
		ProcedureReturn 1
		
	ElseIf sText = "" And iTooltip_ID = 0
		iTooltip_ID 	= 0
		iStyle_aktuell 	= 0
		iX_Pos_aktuell	= 0
		iY_Pos_aktuell	= 0
		sText_aktuell 	= ""
		sTitel_aktuell 	= ""
		sSymbol_aktuell	= ""
		ProcedureReturn -1
		
	EndIf
	
	
	; darzustellendes Symbol
	If 		sSymbol = "kein":			iSymbol = #TTI_NONE
	ElseIf 	sSymbol = "Info":			iSymbol = #TTI_INFO
	ElseIf 	sSymbol = "Warnung":		iSymbol = #TTI_WARNING
	ElseIf 	sSymbol = "Fehler":			iSymbol = #TTI_ERROR
	ElseIf 	sSymbol = "Info_groß":		iSymbol = #TTI_INFO_LARGE
	ElseIf 	sSymbol = "Warnung_groß":	iSymbol = #TTI_WARNING_LARGE
	ElseIf 	sSymbol = "Fehler_groß":	iSymbol = #TTI_ERROR_LARGE
	Else: 								iSymbol = #TTI_NONE
	EndIf
	
	
	; X-Position bestimmen (Standard: aktuelle Mausposition)
	If (iX_Pos = #PB_Default) And (bBallon = #True)
		iX_Pos = DesktopMouseX()
		iX_Pos_Offset = 0
		
	ElseIf (iX_Pos = #PB_Default) And (bBallon = #False)
		iX_Pos 	= DesktopMouseX()
		iX_Pos_Offset = 16
	EndIf
	
	
	; Y-Position bestimmen (Standard: aktuelle Mausposition)
	If iY_Pos = #PB_Default
		iY_Pos = DesktopMouseY()
		iY_Pos_Offset = 0
		
	EndIf   
	
	
	; maximale Breite festlegen
	If (iMax_Breite = #PB_Default) Or (iMax_Breite < 10)
		iMax_Breite = 400
		
	EndIf   
	
	
	; ggf. Ballonform aktivieren
	If bBallon = #True
		iStyle | #TTS_BALLOON
	EndIf
	
	
	; ggf. den Schließen-Button anzeigen (Ballonform muss aktiviert sein)
	If bSchliessen = #True
		iStyle | #TTS_CLOSE
	EndIf
	
	
	; prüfen, ob schon ein Tooltip existiert
	If iTooltip_ID = 0
		iTooltip_ID = CreateWindowEx_(iExStyle, #TOOLTIPS_CLASS, #Null, iStyle, 0, 0, 0, 0, lWindowID, 0, iInstanz, 0)
	Else
		If iStyle_aktuell <> iStyle
			DestroyWindow_(iTooltip_ID)
			iTooltip_ID = CreateWindowEx_(iExStyle, #TOOLTIPS_CLASS, #Null, iStyle, 0, 0, 0, 0, lWindowID, 0, iInstanz, 0)
		EndIf
	EndIf

	
	; Eigenschaften übernehmen und anzeigen
	stParameter.TOOLINFO\cbSize	= SizeOf(TOOLINFO)
	stParameter\uFlags			= #TTF_IDISHWND | #TTF_ABSOLUTE | #TTF_TRACK
	stParameter\hWnd			= lWindowID
	stParameter\uId				= lWindowID
	stParameter\lpszText		= @sText
	stParameter\hInst			= iInstanz
	

	; prüfen, ob die Position oder der Inhalt geändert wurde
	If (sText <> sText_aktuell) Or (sTitel <> sTitel_aktuell) Or (sSymbol <> sSymbol_aktuell) Or (sText_aktuell = "")
		iUpdate_Inhalt		= #True
	Else
		iUpdate_Inhalt		= #False
	EndIf
	
	
	If (iX_Pos <> iX_Pos_aktuell) Or (iY_Pos <> iY_Pos_aktuell)
		iUpdate_Position	= #True
	Else
		iUpdate_Position	= #False
	EndIf

	
	; aktuelle Daten speichern
	iStyle_aktuell	= iStyle
	sText_aktuell 	= sText
	sTitel_aktuell 	= sTitel
	sSymbol_aktuell = sSymbol
	iX_Pos_aktuell	= iX_Pos
	iY_Pos_aktuell	= iY_Pos

	
	; Tooltip-Inhalt übernehmen und darstellen
	If iUpdate_Inhalt = #True
		
		SendMessage_	(iTooltip_ID,	#TTM_SETTIPTEXTCOLOR,	GetSysColor_(#COLOR_INFOTEXT),	0)
		SendMessage_	(iTooltip_ID,	#TTM_SETTIPBKCOLOR,		GetSysColor_(#COLOR_INFOBK),	0)
		SendMessage_	(iTooltip_ID,	#TTM_SETMAXTIPWIDTH,	0, iMax_Breite)	
		SendMessage_	(iTooltip_ID,	#TTM_SETTITLE, 			iSymbol, @sTitel)
		
		GetWindowRect_	(lWindowID, 	@stParameter\rect)
		SendMessage_	(iTooltip_ID, 	#TTM_ADDTOOL, 		0, @stParameter)
		SendMessage_	(iTooltip_ID, 	#TTM_TRACKACTIVATE, 1, @stParameter)
		SendMessage_	(iTooltip_ID,	#TTM_UPDATETIPTEXT, 0, @stParameter)		

	EndIf
	
	
	If iUpdate_Position = #True
		
		; die Position des Tooltips anpassen
		If (ExamineDesktops() <> 0)
			
			; die Abmessung des Tooltips ermitteln
			GetWindowRect_	(iTooltip_ID, @stAbmessungen)
			
			If (iX_Pos + iX_Pos_Offset +(stAbmessungen\right - stAbmessungen\left) > DesktopWidth(0))
				iX_Pos = iX_Pos - iX_Pos_Offset - (stAbmessungen\right - stAbmessungen\left)
			Else
				iX_Pos = iX_Pos + iX_Pos_Offset
			EndIf
			
			If (iY_Pos + iY_Pos_Offset +(stAbmessungen\bottom - stAbmessungen\top) > DesktopHeight(0))
				iY_Pos = iY_Pos - (stAbmessungen\bottom - stAbmessungen\top)
			Else
				iY_Pos = iY_Pos + iY_Pos_Offset
			EndIf
			
		EndIf
		
		lPosition = (iX_Pos & $FFFF) | ((iY_Pos & $FFFF) << 16)
		SendMessage_	(iTooltip_ID,	#TTM_TRACKPOSITION, 	0, lPosition)
		
	EndIf

	ProcedureReturn 0
	
EndProcedure


OpenWindow   (0, 0, 0, 40, 30, "Tooltip", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)


Repeat
	
	Text$ = "CPU-Name:" + #TAB$ + #TAB$ + CPUName() + #CRLF$
	Text$ + "Computer-Name:" + #TAB$ + #TAB$ + ComputerName() + #CRLF$
	Text$ + "RAM verfügbar:" + #TAB$ + #TAB$ + StrF(MemoryStatus(#PB_System_FreePhysical)/1048576,1) + " MB"
	
	Tooltip(Text$, "aktuelle Daten", "Info_groß", -1, -1 ,600)

Until WaitWindowEvent(15) =  #PB_Event_CloseWindow