wechselnde ToolTips in PanelGadget

Anfängerfragen zum Programmieren mit PureBasic.
ozoffi
Beiträge: 41
Registriert: 08.02.2010 20:56

wechselnde ToolTips in PanelGadget

Beitrag von ozoffi »

Hallo!

Ich möchte wechselnde ToolTipps im gleichen PanelGadget je nach auszuwählenden Kartenreiter.
Ich habe nun auch schon verschiedenes versucht. u.a. durch Ermitteln der Mausposition über einem Reiter und setzen eines Textes zb.b. in der Menüleiste, etc.
Aber, das was ich will, nämlich den Text im Tooltip ändern, habe ich nicht geschafft.

Gibt es da eine einfache Möglichkeit?

Es soll so aussehen:

PanelGadget(#panel1, 5, 5, 599, 371)
AddGadgetItem(#panel1, 1, "Text1") : GadgetToolTip(#panel1/1,"Tipp1")
AddGadgetItem(#panel1, 2, "Text2") : GadgetToolTip(#panel1/2,"Tipp2")

Ich weis, dass es : GadgetToolTip(#panel1/2,"Tipp2") SO nicht gibt ... man kann ja nur EINEM Gadget (und das ist halt #panel1) den Tooltipp zuweisen - ich will aber den "Reitern" jeden seinen eigenen Tipp zuweisen....

Vielen Dank im Voraus.

lg
Oliver
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: wechselnde ToolTips in PanelGadget

Beitrag von RSBasic »

Code: Alles auswählen

Global OldCallback,CheckToolTip
Global WideCharBuf_
#WideCharLen_=#MAX_PATH*4
WideCharBuf_=AllocateMemory(#WideCharLen_)

Structure TCHITTESTINFO
  pt.POINT
  Flags.l
EndStructure

#TTN_GETDISPINFOW = -530


; BalloonTip Constants
#ToolTip_NoBalloon=-1
#TOOLTIP_NO_ICON      = 0
#TOOLTIP_INFO_ICON    = 1
#TOOLTIP_WARNING_ICON = 2
#TOOLTIP_ERROR_ICON   = 3

Procedure OwnToolTip(WindowId, gadget, text$ , Title$, Icon)
  If Icon=#ToolTip_NoBalloon
    Flag=#WS_POPUP | #TTS_NOPREFIX
  Else
    Flag=#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON
  EndIf
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",Flag,0,0,0,0,WindowID(WindowId),0,GetModuleHandle_(0),0)
  SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0)
  SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
  SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,180)
  Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
  Balloon\hwnd=GadgetID(gadget)
  Balloon\uId=GadgetID(gadget)
  If text$
    Balloon\lpszText=@text$
  Else
    Balloon\lpszText=-1
  EndIf
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
  If Title$ > "" And Icon>-1
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
  EndIf
  ProcedureReturn ToolTip
EndProcedure
Procedure MyWindowCallback(WindowId, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
 
  If Message=#WM_NOTIFY
    *notify.NMHDR=lParam
   
    If (*notify\code=#TTN_GETDISPINFOW Or *notify\code=#TTN_GETDISPINFO) And wParam=GadgetID(1)
;       ToolTip.TOOLINFO
;       ToolTip\cbSize=SizeOf(TOOLINFO)
;       ToolTip\hwnd=wParam
;       ToolTip\uId=wParam
     
      ;Which Tab?
      GetCursorPos_(Test.TCHITTESTINFO\pt)
      MapWindowPoints_(0,GadgetID(1),Test\pt,1)
      index=SendMessage_(GadgetID(1),#TCM_HITTEST,0,Test)
      ToolTipText$="Work? - "+Str(index+1)
      ;CP_THREAD_ACP
      MultiByteToWideChar_(1,#MB_PRECOMPOSED,@ToolTipText$,Len(ToolTipText$),WideCharBuf_,#WideCharLen_)
     
      *text.NMTTDISPINFO=lParam
      *text\lpszText=WideCharBuf_
      *text\hinst=0
      *text\szText[0]=0
      Result=#False
;       ToolTip\lpszText=@a$
;       SendMessage_(*notify\hwndfrom,#TTM_UPDATETIPTEXT,0,ToolTip)
;       SendMessage_(*notify\hwndfrom,#TTM_ACTIVATE ,0,0)
;       SendMessage_(*notify\hwndfrom,#TTM_update ,0,0)
;       SendMessage_(*notify\hwndfrom,#TTM_ACTIVATE ,#True,0)
      ;Result=#False
    EndIf
  EndIf
  If Result=#PB_ProcessPureBasicEvents And OldCallback
    ProcedureReturn CallWindowProc_(OldCallback,WindowId,Message,wParam,lParam)
  Else
    ProcedureReturn Result
  EndIf
 
EndProcedure

If OpenWindow(1,0,0,200,200,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

    PanelGadget(1,0,0,200,200)
    AddGadgetItem(1,-1,"Test1")
    AddGadgetItem(1,-1,"Test2")
    AddGadgetItem(1,-1,"Test3")
    AddGadgetItem(1,-1,"Test4")
   
    OldCallback=SetWindowLong_(GadgetID(1),#GWL_WNDPROC,@MyWindowCallback())
   
    CheckToolTip=OwnToolTip(1,1,"","",-1);Text immer nachfragen
   
    Repeat
      event=WaitWindowEvent()
     
    Until event=#PB_Event_CloseWindow
  
EndIf
Quelle: http://www.purebasic.fr/english/viewtop ... 760#p46760
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
ozoffi
Beiträge: 41
Registriert: 08.02.2010 20:56

Re: wechselnde ToolTips in PanelGadget

Beitrag von ozoffi »

Vielen Dank - das hilft :) !

lg
Oliver
ozoffi
Beiträge: 41
Registriert: 08.02.2010 20:56

Re: wechselnde ToolTips in PanelGadget

Beitrag von ozoffi »

Hallo!

Eine hab' ich noch ....

Ich lese die anzuzeigenden Texte für den ToolTip von einer TXT Datei ein und weise diese einer Array Variable zu
Soweit so gut, funktioniert alles bestens .... nur Umlaute werden nicht dargestellt!
Konkret wird anstelle des ä ein o mit Wellenlinie angezeigt ...
Umlaute werden auch nicht angezeigt, wenn ich den Text direkt zuweise - also: ToolTipText$="...ä..."

Ansonsten werden in allen Variablen, Textgadgets etc. sehr wohl Umlaute dargestellt!

lg
Oliver
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: wechselnde ToolTips in PanelGadget

Beitrag von ts-soft »

Du musst das Textformat berücksichtigen:

Code: Alles auswählen

Define FF = ReadFile(#PB_Any, "c:\Users\Thomas\Desktop\bla.txt")
Define Format
If FF
  Format = ReadStringFormat(FF)
  While Not Eof(FF)
    Debug ReadString(FF, Format)
  Wend
  CloseFile(FF)
EndIf
Wenn das nicht hinhaut, weil z.B. der BOM (Format-Kennung) fehlt, dann gebe mal
die möglichen Konstanten für das Readstring Flag fest vor.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
ozoffi
Beiträge: 41
Registriert: 08.02.2010 20:56

Re: wechselnde ToolTips in PanelGadget

Beitrag von ozoffi »

Hallo!

Danke erstmal - hilft leider nicht.
Egal was ich angeben, entweder ???? oder eben o mit ~ anstelle von ä

Wobei der "falsche Umlaut" auch dann kommt, wenn ich den text DIREKT in die Variable ToolTipText$ schreibe, also nicht von der TXT-Datei einlese.
ALLE anderen Variablen *ausserhalb* dieser Routine werden ja korrekt befüllt und zeigen die richtigen Umlaute - nur eben nicht im ToolTip über die Procedur.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: wechselnde ToolTips in PanelGadget

Beitrag von Danilo »

ozoffi hat geschrieben:Danke erstmal - hilft leider nicht.
Egal was ich angeben, entweder ???? oder eben o mit ~ anstelle von ä
Nimm mal als ersten Parameter für MultiByteToWideChar_() 28591 statt 1,
das ist dann Codepage "ISO 8859-1 Latin 1; Western European (ISO)".
Dann gehen die Umlaute, nur € geht noch nicht.

Für andere Werte siehe die MSDN-Hilfe zu der Funktion.

Und im Unicode-Modus brauchst Du MultiByteToWideChar_() nicht, also am
besten ein CompilerIf rein:

Code: Alles auswählen

Global OldCallback,CheckToolTip
Global WideCharBuf_
#WideCharLen_=#MAX_PATH*4
WideCharBuf_=AllocateMemory(#WideCharLen_)

Structure TCHITTESTINFO
  pt.POINT
  Flags.l
EndStructure

#TTN_GETDISPINFOW = -530


; BalloonTip Constants
#ToolTip_NoBalloon=-1
#TOOLTIP_NO_ICON      = 0
#TOOLTIP_INFO_ICON    = 1
#TOOLTIP_WARNING_ICON = 2
#TOOLTIP_ERROR_ICON   = 3

Procedure OwnToolTip(WindowId, gadget, text$ , Title$, Icon)
  If Icon=#ToolTip_NoBalloon
    Flag=#WS_POPUP | #TTS_NOPREFIX
  Else
    Flag=#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON
  EndIf
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",Flag,0,0,0,0,WindowID(WindowId),0,GetModuleHandle_(0),0)
  SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0)
  SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0)
  SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,180)
  Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO)
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS
  Balloon\hwnd=GadgetID(gadget)
  Balloon\uId=GadgetID(gadget)
  If text$
    Balloon\lpszText=@text$
  Else
    Balloon\lpszText=-1
  EndIf
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon)
  If Title$ > "" And Icon>-1
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$)
  EndIf
  ProcedureReturn ToolTip
EndProcedure

Procedure MyWindowCallback(WindowId, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
 
  If Message=#WM_NOTIFY
    *notify.NMHDR=lParam
   
    If (*notify\code=#TTN_GETDISPINFOW Or *notify\code=#TTN_GETDISPINFO) And wParam=GadgetID(1)
;       ToolTip.TOOLINFO
;       ToolTip\cbSize=SizeOf(TOOLINFO)
;       ToolTip\hwnd=wParam
;       ToolTip\uId=wParam
     
      ;Which Tab?
      GetCursorPos_(Test.TCHITTESTINFO\pt)
      MapWindowPoints_(0,GadgetID(1),Test\pt,1)
      index=SendMessage_(GadgetID(1),#TCM_HITTEST,0,Test)
      ToolTipText$="Wörk? - äöüß - "+Str(index+1)
      ;CP_THREAD_ACP
      If #PB_Compiler_Unicode=0
        MultiByteToWideChar_(28591,#MB_PRECOMPOSED,@ToolTipText$,Len(ToolTipText$),WideCharBuf_,#WideCharLen_)
      Else
        PokeS(WideCharBuf_,ToolTipText$)
      EndIf

      *text.NMTTDISPINFO=lParam
      *text\lpszText=WideCharBuf_
      *text\hinst=0
      *text\szText[0]=0
      Result=#False
;       ToolTip\lpszText=@a$
;       SendMessage_(*notify\hwndfrom,#TTM_UPDATETIPTEXT,0,ToolTip)
;       SendMessage_(*notify\hwndfrom,#TTM_ACTIVATE ,0,0)
;       SendMessage_(*notify\hwndfrom,#TTM_update ,0,0)
;       SendMessage_(*notify\hwndfrom,#TTM_ACTIVATE ,#True,0)
      ;Result=#False
    EndIf
  EndIf
  If Result=#PB_ProcessPureBasicEvents And OldCallback
    ProcedureReturn CallWindowProc_(OldCallback,WindowId,Message,wParam,lParam)
  Else
    ProcedureReturn Result
  EndIf
 
EndProcedure

If OpenWindow(1,0,0,200,200,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)

    PanelGadget(1,0,0,200,200)
    AddGadgetItem(1,-1,"Test1")
    AddGadgetItem(1,-1,"Test2")
    AddGadgetItem(1,-1,"Test3")
    AddGadgetItem(1,-1,"Test4")
   
    OldCallback=SetWindowLong_(GadgetID(1),#GWL_WNDPROC,@MyWindowCallback())
   
    CheckToolTip=OwnToolTip(1,1,"","",-1);Text immer nachfragen
    
    ;OwnToolTip(1,1,"...äöü...ÄÖÜ...ß...","title",1)
   
    Repeat
      event=WaitWindowEvent()
     
    Until event=#PB_Event_CloseWindow
  
EndIf
Der Code von RSBasic zeigt so zwar 4 verschiedene Tooltips an, aber wenn man
nach der Anzeige des TT den Mauszeiger auf einen anderen Eintrag verschiebt,
wechselt der Text nicht.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: wechselnde ToolTips in PanelGadget

Beitrag von ts-soft »

Ich denke die 0 wäre richtiger? Entspricht dann: #CP_ACP
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: wechselnde ToolTips in PanelGadget

Beitrag von Danilo »

ts-soft hat geschrieben:Ich denke die 0 wäre richtiger? Entspricht dann: #CP_ACP
Das habe ich auch erst gedacht, aber #CP_ACP und #CP_OEMCP usw. hängen von dem
System ab, auf dem das Programm ausgeführt wird. Steht auch so in der Hilfe.
Wir haben vielleicht alle die (ungefähr) gleiche Codepage, aber auf einem japanischen oder chinesischem System
benutzt der User vielleicht ganz andere Codepages. Da können erweiterte ASCII-Chars ganz anders
übersetzt werden.
Wenn man nun feste Codepages wie 28591 für "ISO 8859-1 Latin 1; Western European (ISO)"
verwendet, dann wird auch genau diese Codepage übersetzt, und nicht eine zufällige, die der
User installiert hat und die sich ändern kann.

Das ganze Codepage-Zeug ist eh ein Graus, am besten macht man heutzutage alles gleich im Unicode-Modus.
Als Weltbürger habe ich Unicode natürlich als Default-Compileroption immer aktiviert. ;)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: wechselnde ToolTips in PanelGadget

Beitrag von ts-soft »

Danilo hat geschrieben:am besten macht man heutzutage alles gleich im Unicode-Modus.
Meine Projekte setze ich seit Jahren alle im Unicode-Modus um, den anderen Modus nutze
ich nur noch zum Testen von Fremdcode :wink:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten