1. Artikel
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Paules-PC-Forum.de
  2. Forum
  3. Programmierung
  4. XProfan
  5. Anregungen und Bugreports

ToolTip

  • H.Brill
  • 21. März 2025 um 17:25
  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 21. März 2025 um 17:25
    • #1

    Hallo,

    hätte da noch eine Anregung für den ToolTip.

    Könnte RGH da noch einen optionalen Modus einbauen ? Es gibt ja den normalen rechteckigen ToolTip und dann noch einen als Ballon. Mit einem optionalen zusätzlichen Modus könnte man dann einstellen, welchen man haben möchte (oder gibt es noch mehrere ?)

    Code
    Create("Tooltip",N1,N2,S,[M])

    Bei 0 oder Weglassen halt der normale Modus und bei 1 den TTS_BALLOON ($40) - Modus.

    Wenn wir schon einen ToolTip haben, sollte man auch dessen Möglichkeiten ausnutzen können. Ist ja wahrscheinlich nur eine Kleinigkeit.

    Eine weitere Überlegung wäre, ob man mehrere ToolTips für mehrere Dialogelemente mit einem Rutsch erstellen könnte (N2 und S als optionales Array). Und als Rückgabe auch ein Array, falls man mit SetText den ToolTip ändern will. Dann lohnt sich wenigstens der Aufwand :)

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    4 Mal editiert, zuletzt von H.Brill (21. März 2025 um 17:37)

  • Jens-Arne
    Schüler
    Reaktionen
    98
    Beiträge
    122
    • 30. März 2025 um 18:52
    • #2

    Naja, man kann sich das auch selbst bauen:

    Code
    def %cTTS_ALWAYSTIP           $01
    def %cTTS_NOPREFIX            $02
    def %cTTS_NOANIMATE           $10
    def %cTTS_NOFADE              $20
    def %cTTS_BALLOON             $40
    def %cTTS_CLOSE               $80
    def %cTTI_NONE                0
    def %cTTI_INFO                1
    def %cTTI_WARNING             2
    def %cTTI_ERROR               3
    def %cTTI_INFO_LARGE          4
    def %cTTI_WARNING_LARGE       5
    def %cTTI_ERROR_LARGE         6
    def %cTTM_SETTITLEA           1056
    declare hB%,hTT%,s$
    SUBPROC Create.ToolTipEx
     parameters hWnd&,hCtrl&,Text$,Modus&,Title$,Icon&
     declare pc%,NewHandle&
     pc%=%PCount
     if pc%=5
       Icon&=0
     elseif pc%=4
       Icon&=0
       Title$=""
     elseif pc%=3
       Icon&=0
       Title$=""
       Modus&=0
     endif
     NewHandle&=@create("TOOLTIP",hWnd&,hCtrl&,Text$)
     if Modus&=1
       if Title$<>""
         @sendmessage(NewHandle&,%cTTM_SETTITLEA,Icon&,@addr(Title$))
       endif
       setstyle NewHandle&,@getstyle(NewHandle&) | %cTTS_BALLOON
     endif
     return NewHandle&
    ENDPROC
    cls
    hB%=@create("BUTTON",%HWnd,"Button",10,10,@width(%HWnd)-20,@height(%HWnd)-20)
    hTT%=@create("TOOLTIPEX",%HWnd,hB%,"Dies ist ein echt großer Button.",1,"Button-Info",%cTTI_INFO)
    waitinput
    end
    Alles anzeigen
  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 31. März 2025 um 08:22
    • #3

    Sieht schon mal gut aus. Danke.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 31. März 2025 um 09:59
    • #4

    Und getestet :

    Code
    Declare Long hTip1, htip2, htip3, btn1, btn2, btn3, hicon, ende
    Declare  String Title
    hIcon = Create("hIcon", "GESICHT")
    Title = "INFO"
    Window 600, 400
    btn1 = Create("Button", &HWnd, "Info 1", 10, 10, 60, 25)
    btn2 = Create("Button", &HWnd, "Test 1", 100, 10, 60, 25)
    btn3 = Create("Button", &HWnd, "Ende", 200, 10, 60, 25)
    hTip1 = Create("Tooltip", %hWnd, btn1, "Info 1")
    hTip2 = Create("Tooltip", %hWnd, btn2, "Info 2")
    hTip3 = Create("Tooltip", %hWnd, btn3, "Info 3")
    
    SendMessage(hTip1, 1056, hicon, Addr(Title))
    SetStyle hTip1, GetStyle(hTip1) | $40
    SendMessage(hTip2, 1056, hicon, Addr(Title))
    SetStyle hTip2, GetStyle(hTip2) | $40
    SendMessage(hTip3, 1056, hicon, Addr(Title))
    SetStyle hTip3, GetStyle(hTip3) | $40
    
    WhileNot ende
       WaitInput
      If Clicked(btn3)
         ende = 1
      EndIf
    EndWhile
    End
    Alles anzeigen

    Also reicht im Grunde genommen ein API-Befehl und ein SetStyle - Befehl :

    Code
    SendMessage(hTip1, 1056, hicon, Addr(Title))
    SetStyle hTip1, GetStyle(hTip1) | $40

    Das könnte RGH doch einbauen. Dann gerät es auch nicht so leicht in Vergessenheit.

    Das mag ich gerade an den eingebauten Sachen in XProfan. Man kann es in der Hilfe, die man sowieso immer auf hat, schnell mal nachschlagen / schauen und hat es stets 'auf dem Schirm'.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

    2 Mal editiert, zuletzt von H.Brill (31. März 2025 um 10:07)

  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 31. März 2025 um 11:53
    • #5

    Da kann man auch schöne Comics machen.

    Code
    Declare Long hTip1, htip2, st1, st2, bmp1, bmp2, hicon, ende
    Declare  String Title1, Title2
    hIcon = 0
    Title1 = "Hallo Pluto ! Wie geht es dir ?"
    Title2 = "Bestens. Danke. Und dir ?"
    Window 600, 400
    bmp1 = Create("hPic", -1, "F:\Micky.png")
    st1 = Create("Static", %HWnd, 10, 10, %BmpX, %BmpY)
    StartPaint st1
    DrawPic bmp1, 0, 0; 0
    EndPaint
    bmp2 = Create("hPic", -1, "F:\Pluto.png")
    st2 = Create("Static",, %HWnd, 300, 10, %BmpX, %BmpY)
    StartPaint st2
    DrawPic bmp2, 0, 0; 0
    EndPaint
    hTip1 = Create("Tooltip", %hWnd, st1, " ")
    hTip2 = Create("Tooltip", %hWnd, st2, " ")
    SendMessage(hTip1, 1056, hicon, Addr(Title1))
    SetStyle hTip1, GetStyle(hTip1) | $40
    SendMessage(hTip2, 1056, hicon, Addr(Title2))
    SetStyle hTip2, GetStyle(hTip2) | $40
     
    WhileNot ende
       WaitInput
    
    EndWhile
    End
    Alles anzeigen

    Bitte Pfad entsprechend ändern und angehängte Bilder laden.

    Dateien

    Micky.png 4,13 kB – 0 Downloads Pluto.png 3,99 kB – 0 Downloads

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Schüler
    Reaktionen
    98
    Beiträge
    122
    • 14. April 2025 um 23:22
    • #6

    Nicht schlecht! Sehr lustige Idee, und sieht wirklich gut aus!

  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 15. April 2025 um 07:36
    • #7

    Jetzt müßte ich nur noch rausfinden, wie man einen Mauszeiger zu vorgegebenen Koordinaten automatisch bewegt, damit man nicht immer händisch mit dem Zeiger drüber fahren muß. Halt so ähnlich, wie man es bei einem Fernwartungssystem sieht.

    Damit könnte man dann die die Koordinaten zu den einzelnen Bildern ansteuern.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Schüler
    Reaktionen
    98
    Beiträge
    122
    • 15. April 2025 um 14:36
    • #8

    Dazu brauchst Du ein paar API-Funktionen.

    Mauscursor platzieren (absolute Bildschirmposition, daher brauchen wir noch ein paar mehr Funktionen):

    Code
    PROC SetMouseCursorPos
      'Setzt den Mauscursor auf eine bestimmte absolute Bildschirmposition (sic, nicht Fensterposition)
      parameters x&,y&
      @external("USER32.DLL","SetCursorPos",x&,y&)
    ENDPROC 'SetMouseCursorPos

    Um die linke obere Ecke des Client-Bereichs des Fensters in Bezug auf den Bildschirm herauszubekommen, braucht man grundsätzlich diese Funktionen:

    Code
    PROC GetAbsWindowPosX1
      parameters handle hW
      declare b#,ret&
      dim b#,4*4
      @external("user32.dll","GetWindowRect",hW,b#)
      ret&=@long(b#,0)
      dispose b#
      return ret&
    ENDPROC 'GetAbsWindowPosX1
    
    PROC GetAbsWindowPosY1
      parameters handle hW
      declare b#,ret&
      dim b#,4*4
      @external("user32.dll","GetWindowRect",hW,b#)
      ret&=@long(b#,4)
      dispose b#
      return ret&
    ENDPROC 'GetAbsWindowPosY1
    
    PROC GetAbsWindowPosX2
      'Es wird die absolute Position ermittelt!
      parameters handle hW
      declare b#,ret&
      dim b#,4*4
      @external("user32.dll","GetWindowRect",hW,b#)
      ret&=@long(b#,8)
      dispose b#
      return ret&
    ENDPROC 'GetAbsWindowPosX2
    
    PROC GetAbsWindowPosY2
      'Es wird die absolute Position ermittelt!
      parameters handle hW
      declare b#,ret&
      dim b#,4*4
      @external("user32.dll","GetWindowRect",hW,b#)
      ret&=@long(b#,12)
      dispose b#
      return ret&
    ENDPROC 'GetAbsWindowPosY2
    Alles anzeigen

    Und nun müssen wir noch die Breite des Fensterrahmens einrechnen und die Höhe von Fenstertitelzeile und Menü:

    Code
    PROC IsCaptionPresent 'Rückgabe: 0=keine Titelzeile, 1=normale Titelzeile, 2=schmale Titelzeile (ToolWindow)
      parameters handle hW
      declare erg&
      if (@external("user32.dll","GetWindowLongA",hW,-16) & 12582912)=12582912 '-16=~GWL_STYLE, 12582912=~WS_CAPTION
        erg&=1
        if (@external("user32.dll","GetWindowLongA",hW,-20) & $80)=$80 '-20=~GWL_EXSTYLE, $80=~WS_EX_TOOLWINDOW
          erg&=2
        endif
      else
        erg&=0
      endif
      return erg&
    ENDPROC 'IsCaptionPresent
    
    PROC GetCaptionHeight
      declare erg&
      erg&=@external("user32.dll","GetSystemMetrics",4) '~SM_CYCAPTION=4
      return erg&
    ENDPROC 'GetCaptionHeight
    
    PROC GetSmallCaptionHeight
      declare erg&
      erg&=@external("user32.dll","GetSystemMetrics",51) '~SM_CYSMCAPTION=51
      return erg&
    ENDPROC 'GetSmallCaptionHeight
    
    PROC GetCaptionText
      'wenn das Fenster keine Titelzeile hat, ist das Ergebnis=""
      parameters handle hW
      declare erg$,b#
      dim b#,4001
      @external("user32.dll","GetWindowTextA",hW,b#,4001)
      erg$=@string$(b#,0)
      dispose b#
      if (left$(@upper$(erg$),19)="XPROFAN INTERPRETER") or (left$(@upper$(erg$),15)="XPROFAN RUNTIME")
        erg$=""
      endif
      return erg$
    ENDPROC 'GetCaptionText
    
    
    PROC IsWindowSizeable
      parameters handle hW
      declare erg&
      if (@getstyle(hW,0) & $40000)=$40000
        erg&=1
      else
        erg&=0
      endif
      return erg&
    ENDPROC 'IsWindowSizeable
    
    PROC GetWindowThickBorderWidth
      declare erg&
      erg&=@external("user32.dll","GetSystemMetrics",32) '~SM_CXFRAME=32
      return erg&
    ENDPROC 'GetWindowThickBorderWidth
    
    PROC GetWindowThinBorderWidth
      declare erg&
      erg&=@external("user32.dll","GetSystemMetrics",7) '~SM_CXFIXEDFRAME=7
      return erg&
    ENDPROC 'GetWindowThinBorderWidth
    
    
    PROC IsMenuPresent
      'Ergebnis: Menü-Handle des Fensters oder 0, wenn es kein Menü hat
      'Bei child windows ist das Ergebnis undefiniert!
      parameters handle hW
      declare erg&
      erg&=@external("user32.dll","GetMenu",hW)
      return erg&
    ENDPROC 'IsMenuPresent
    
    PROC GetMenuHeight
      declare erg&
      erg&=@external("user32.dll","GetSystemMetrics",15) '~SM_CYMENU=15
      return erg&
    ENDPROC 'GetMenuHeight
    Alles anzeigen

    Damit kannst Du dann alles notwendige ermitteln, um den Mauscursor auf einem der Comicbilder zu platzieren. Ob das allerdings auch das Erscheinen der Tooltips auslöst, weiß ich nicht.

    Einmal editiert, zuletzt von Jens-Arne (15. April 2025 um 14:45)

  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 15. April 2025 um 17:23
    • #9

    Oh danke, da muß ich mich erst mal durchfuchsen. Dachte jetzt nicht, daß so eine Menge Code nötig ist.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Schüler
    Reaktionen
    98
    Beiträge
    122
    • 15. April 2025 um 19:52
    • #10

    Ok, ich dachte, es schadet nicht, die ganzen einzelnen Funktionen für die Zukunft parat zu haben. Hier eine einzige Funktion, die das alles zusammenfasst und den Mauscursor auf eine relative Position in Bezug auf den Clientbereich eines Fensters setzt:

    Code
    PROC SetRelMouseCursorPos
      parameters handle hW,RelX&,RelY&
      declare WorkX&,WorkY&,b#
      'absolute Fensterposition ermitteln:
      dim b#,4*4
      @external("user32.dll","GetWindowRect",hW,b#)
      WorkX&=@long(b#,0)
      WorkY&=@long(b#,4)
      dispose b#
      'Fensterrahmen dazu:
      if (@external("user32.dll","GetWindowLongA",hW,-16) & $40000)=$40000 '-16=~GWL_STYLE, $40000=~WS_THICKFRAME
        WorkX&=WorkX&+@external("user32.dll","GetSystemMetrics",32) '~SM_CXFRAME=32
        WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",32) '~SM_CXFRAME=32
      else
        WorkX&=WorkX&+@external("user32.dll","GetSystemMetrics",7) '~SM_CXFIXEDFRAME=7
        WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",7) '~SM_CXFIXEDFRAME=7
      endif
      'vertikal: Fenstertitelhöhe dazu:
      if (@external("user32.dll","GetWindowLongA",hW,-16) & 12582912)=12582912 '-16=~GWL_STYLE, 12582912=~WS_CAPTION
        if (@external("user32.dll","GetWindowLongA",hW,-20) & $80)=$80 '-20=~GWL_EXSTYLE, $80=~WS_EX_TOOLWINDOW
          WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",51) '~SM_CYSMCAPTION=51
        else
          WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",4) '~SM_CYCAPTION=4
        endif
      endif
      'vertikal: Menühöhe dazu:
      if @external("user32.dll","GetMenu",hW)
        WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",15) '~SM_CYMENU=15
      endif
      'relative Position dazu:
      WorkX&=WorkX&+RelX&
      WorkY&=WorkY&+RelY&
      'Mausposition setzen:
      return @external("USER32.DLL","SetCursorPos",WorkX&,WorkY&)
    ENDPROC 'SetRelMouseCursorPos
    Alles anzeigen

    Einmal editiert, zuletzt von Jens-Arne (15. April 2025 um 19:59)

  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 15. April 2025 um 20:19
    • #11

    Funktioniert mit einem Timer super :

    Code
    SetTimer 8000
    WhileNot ende
       WaitInput
       If %wmtimer
         SetRelMouseCursorPos(%HWnd, 40, 60)
         WhileLoop 1, 60000 : EndWhile
         SetRelMouseCursorPos(%HWnd, 330, 30)
       EndIf
       Case %Key = 27 : ende = 1
    EndWhile

    Das SLEEP wollte nicht so, wie ich. Deshalb die Zählschleife.

    Nochmals danke. Kann man ja auch für mehrere Sachen verwenden.

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

  • Jens-Arne
    Schüler
    Reaktionen
    98
    Beiträge
    122
    • 15. April 2025 um 23:12
    • #12

    Entschuldigung, ich hatte noch etwas an der konsolidierten Funktion übersehen, nämlich rahmenlose Fenster. Bitte die nachfolgende Version benutzen:

    Code
    PROC SetRelMouseCursorPos
      parameters handle hW,RelX&,RelY&
      declare WorkX&,WorkY&,b#
      'absolute Fensterposition ermitteln:
      dim b#,4*4
      @external("user32.dll","GetWindowRect",hW,b#)
      WorkX&=@long(b#,0)
      WorkY&=@long(b#,4)
      dispose b#
      'Fensterrahmen dazu:
      if (@external("user32.dll","GetWindowLongA",hW,-16) & $800000)=$800000 '-16=~GWL_STYLE, $800000=~WS_BORDER
        if (@external("user32.dll","GetWindowLongA",hW,-16) & $40000)=$40000 '-16=~GWL_STYLE, $40000=~WS_THICKFRAME
          WorkX&=WorkX&+@external("user32.dll","GetSystemMetrics",32) '~SM_CXFRAME=32
          WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",32) '~SM_CXFRAME=32
        else
          WorkX&=WorkX&+@external("user32.dll","GetSystemMetrics",7) '~SM_CXFIXEDFRAME=7
          WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",7) '~SM_CXFIXEDFRAME=7
        endif
      endif
      'vertikal: Fenstertitelhöhe dazu:
      if (@external("user32.dll","GetWindowLongA",hW,-16) & 12582912)=12582912 '-16=~GWL_STYLE, 12582912=~WS_CAPTION
        if (@external("user32.dll","GetWindowLongA",hW,-20) & $80)=$80 '-20=~GWL_EXSTYLE, $80=~WS_EX_TOOLWINDOW
          WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",51) '~SM_CYSMCAPTION=51
        else
          WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",4) '~SM_CYCAPTION=4
        endif
      endif
      'vertikal: Menühöhe dazu:
      if @external("user32.dll","GetMenu",hW)
        WorkY&=WorkY&+@external("user32.dll","GetSystemMetrics",15) '~SM_CYMENU=15
      endif
      'relative Position dazu:
      WorkX&=WorkX&+RelX&
      WorkY&=WorkY&+RelY&
      'Mausposition setzen:
      return @external("user32.dll","SetCursorPos",WorkX&,WorkY&)
    ENDPROC 'SetRelMouseCursorPos
    Alles anzeigen

    Und so ist es besser als mit einer Schleife zur Verzögerung (das Declare kommt natürlich nach oben):

    Code
    SetTimer 2000
    Declare Long State
    State=1
    WhileNot ende
       WaitInput
       If %wmtimer
         If State=1
           SetRelMouseCursorPos(%HWnd, 40, 60)
         Else
           SetRelMouseCursorPos(%HWnd, 330, 30)
         EndIf
         State=1-State
       EndIf
       Case %Key = 27 : ende = 1
    EndWhile
    Alles anzeigen

    Schleifen zur Verzögerung funktionierten zuletzt beim C64, weil der bei jedem ziemlich exakt gleich schnell war. Bei mir wird Deine Schleife selbst im Interpreter so schnell durchlaufen, dass man den Text nicht lesen kann. Und meine CPU ist zwar schnell, aber auch nicht mehr das neueste, was es gibt. :lol:

    Einmal editiert, zuletzt von Jens-Arne (15. April 2025 um 23:24) aus folgendem Grund: Ein Beitrag von Jens-Arne mit diesem Beitrag zusammengefügt.

  • H.Brill
    Stammuser
    Reaktionen
    506
    Beiträge
    1.186
    • 16. April 2025 um 08:20
    • #13

    Ja, so funktioniert es noch besser. :top:

    Wir sind die XProfaner.

    Sie werden von uns assimiliert.

    Widerstand ist zwecklos!

    Wir werden alle ihre Funktionen und Algorithmen

    den unseren hinzufügen.

Windows 11

Ähnliche Themen

  • Office-N-PDF

    • yomi
    • 2. Juli 2024 um 08:50
    • Software - Allgemein
  1. Datenschutzerklärung
  2. Impressum
Community-Software: WoltLab Suite™