Italia
Include

Standard TooltipsEverywhere - Tooltip-Include per Tooltips auf jedem Fenster-Bereich

 

Findus
Jonathan (27.02.2013)
Ciao,

Vielleicht kann das ja jemand gebrauchen: Eine Include, mit der man auf jedem beliebigen Fenster circa jedem beliebigen Bereich (relativ (0 bis 1) und absolut (Pixel)) einen Tooltip erzeugen kann, sogar mehrzeilig.

Hier die Include:
'TOOLTIPS EVERYWHERE - TOOLTIP-INCLUDE FÜR TOOLTIPS AUF JEGLICHEN FENSTER-BEREICHEN
'==================================================================================
'
'(c) 2013 Jonathan
'Diese Include darf frei verwendet und modifiziert werden. Um einen Hinweis auf den
'ursprünglichen Autor wird gebeten, zumindest im Quellcode.
Struct TTE_lpPoint = X&, Y&
'{GLOBALE VARIABLEN
Declare TTE_Tooltip_hWnd&'Das Tooltip-Fenster
Declare TTE_Tooltip_text$[]'Text des Tooltips [X]
Declare TTE_Tooltip_grp&[]'Gruppe des Tooltips [X]
Declare TTE_Tooltip_tWnd&[]'Fenster des Tooltips [X]
Declare TTE_Tooltip_xpos![]'X-Position des Tooltip-Bereichs [X]
Declare TTE_Tooltip_ypos![]'Y-Position des Tooltip-Bereichs [X]
Declare TTE_Tooltip_xsz![]'X-Dimensione des Tooltip-Bereichs [X]
Declare TTE_Tooltip_ysz![]'Y-Dimensione des Tooltip-Bereichs [X]
Declare TTE_Tooltip_isRelative%[]'Relative Koordinaten per Tooltip [X]?
Declare TTE_Tooltip_aktnum&'Nummer des aktuell sichtbaren Tooltips
Declare TTE_Tooltip_aktmaxgrp&'Maximale vergebene Gruppen-ID
Declare TTE_DisplayFont$'Nichtproportionaler Font
Declare TTE_TempStr$
TTE_Tooltip_aktmaxgrp& = -1
TTE_Tooltip_aktnum& = -1
'}
'{INITIALISIEREN DES TOOLTIP-FENSTERS
WindowStyle 16 + 64 + 128 + 1024
TTE_Tooltip_hWnd& = @Create("Window", %hwnd, "", 0, 0, 128, 20)
@External("User32.dll", "SetWindowPos", TTE_Tooltip_hWnd&, ~HWND_TOPMOST, 0, 0, 0, 0, ~SWP_NOMOVE | ~SWP_NOSIZE | ~SWP_FRAMECHANGED)
StartPaint TTE_Tooltip_hWnd&
UsePen 5, 0, 0
UseBrush 1, 0
Rectangle 0, 0 - Width(TTE_Tooltip_hWnd&), Height(TTE_Tooltip_hWnd&)
EndPaint
ShowWindow(TTE_Tooltip_hWnd&, 0)
WindowStyle 1 + 2 + 4 + 8
'}

Proc TTE_ShowTooltip

    Parameters X&, Y&, Text$
    Declare Tooltip_imgbuffer&, TextLines$[], maxlen&
    '@ShowWindow(Tooltip_hWnd&, 8)
    TextLines$[] = @Explode(Text$, "\n")
    maxlen& = 1

    WhileLoop 0, @SizeOf(TextLines$[]) - 1

        If @Len(TextLines$[&loop]) > maxlen&

            maxlen& = @Len(TextLines$[&loop])

        EndIf

    EndWhile

    Tooltip_imgbuffer& = @Create("hNewPic", 8 * maxlen&, 16 * @SizeOf(TextLines$[]), 0)
    StartPaint Tooltip_imgbuffer&

    WhileLoop 0, @SizeOf(TextLines$[]) - 1

        UseFont TTE_displayFont$, 16, 8, 0, 0, 0
        TextColor @Rgb(255, 255, 255), -1
        DrawText 0, 16 * &loop, TextLines$[&loop]

    EndWhile

    EndPaint
    ~SetWindowPos(TTE_Tooltip_hWnd&, ~HWND_TOPMOST, X&, Y&, @Width(Tooltip_imgbuffer&), @Height(Tooltip_imgbuffer&), ~SWP_NOACTIVATE | ~SWP_NOOWNERZORDER | ~SWP_NOZORDER | ~SWP_SHOWWINDOW)
    'SetWindowPos Tooltip_hWnd& = X&, Y& - @Width(Tooltip_imgbuffer&), @Height(Tooltip_imgbuffer&)
    StartPaint TTE_Tooltip_hWnd&
    DrawPic Tooltip_imgbuffer&, 0, 0; 0
    EndPaint
    DeleteObject Tooltip_imgbuffer&

EndProc

Proc TTE_HideTooltip

    @ShowWindow(TTE_Tooltip_hWnd&, 0)

EndProc

Proc TTE_ToolTipRoutine

    Declare MousePos#, X!, Y!, MousePosInWnd#
    Dim MousePos#, TTE_lpPoint
    Dim MousePosInWnd#, TTE_lpPoint
    ~GetCursorPos(MousePos#)
    'Print MousePos#.X&, MousePos#.Y&

    If TTE_Tooltip_aktnum& <> -1

        MousePosInWnd# = MousePos#
        ~ScreenToClient(TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&], MousePosInWnd#)

        If TTE_Tooltip_isRelative%[TTE_Tooltip_aktnum&]

            X! = MousePosInWnd#.X& / Width(TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&])
            Y! = MousePosInWnd#.Y& / Height(TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&])

        Else

            X! = MousePosInWnd#.X&
            Y! = MousePosInWnd#.Y&

        EndIf

        IfNot @Between(X!, TTE_Tooltip_xpos![TTE_Tooltip_aktnum&], TTE_Tooltip_xpos![TTE_Tooltip_aktnum&] + TTE_Tooltip_xsz![TTE_Tooltip_aktnum&], Y!, TTE_Tooltip_ypos![TTE_Tooltip_aktnum&], TTE_Tooltip_ypos![TTE_Tooltip_aktnum&] + TTE_Tooltip_ysz![TTE_Tooltip_aktnum&]) And (@GetActiveWindow() = TTE_Tooltip_tWnd&[TTE_Tooltip_aktnum&])

            TTE_Tooltip_aktnum& = -1
            TTE_ToolTipRoutine

        Else

            TTE_ShowTooltip MousePos#.X& + 20, MousePos#.Y& + 20, TTE_Tooltip_text$[TTE_Tooltip_aktnum&]
            '@SetActiveWindow(Tooltip_tWnd&[&loop])

        EndIf

    Else

        WhileLoop 0, @SizeOf(TTE_Tooltip_text$[]) - 1

            If (TTE_Tooltip_text$[&loop] <> "") And (@GetActiveWindow() = TTE_Tooltip_tWnd&[&loop]) And (TTE_Tooltip_tWnd&[&loop] <> -1)

                MousePosInWnd# = MousePos#
                ~ScreenToClient(TTE_Tooltip_tWnd&[&loop], MousePosInWnd#)

                If TTE_Tooltip_isRelative%[&loop]

                    X! = MousePosInWnd#.X& / Width(TTE_Tooltip_tWnd&[&loop])
                    Y! = MousePosInWnd#.Y& / Height(TTE_Tooltip_tWnd&[&loop])

                Else

                    X! = MousePosInWnd#.X&
                    Y! = MousePosInWnd#.Y&

                EndIf

                If @Between(X!, TTE_Tooltip_xpos![&loop], TTE_Tooltip_xpos![&loop] + TTE_Tooltip_xsz![&loop], Y!, TTE_Tooltip_ypos![&loop], TTE_Tooltip_ypos![&loop] + TTE_Tooltip_ysz![&loop])

                    TTE_Tooltip_aktnum& = &loop
                    '@MessageBox(@Str$(Tooltip_aktnum&), "", 0)
                    BREAK

                EndIf

            EndIf

            '@MessageBox(@Str$(Tooltip_aktnum&), "", 0)

        EndWhile

        If TTE_Tooltip_aktnum& = -1

            TTE_HideTooltip

        EndIf

    EndIf

    Dispose MousePos#
    Dispose MousePosInWnd#

EndProc

Proc TTE_RegisterTooltip

    Parameters tWnd&, X!, Y!, SZX!, SZY!, isRelative%, Group&, Text$
    Declare freePos&
    freePos& = -1

    WhileLoop 0, @SizeOf(TTE_Tooltip_text$[]) - 1

        If (TTE_Tooltip_text$[&loop] = "") And (TTE_Tooltip_tWnd&[&loop] = -1)

            freePos& = &loop
            BREAK

        EndIf

    EndWhile

    If freePos& = -1

        freePos& = @SizeOf(TTE_Tooltip_tWnd&[])

    EndIf

    '@MessageBox(@Str$(freePos&), "", 0)
    TTE_Tooltip_tWnd&[freePos&] = tWnd&
    TTE_Tooltip_xpos![freePos&] = X!
    TTE_Tooltip_ypos![freePos&] = Y!
    TTE_Tooltip_xsz![freePos&] = SZX!
    TTE_Tooltip_ysz![freePos&] = SZY!
    TTE_Tooltip_isRelative%[freePos&] = isRelative%
    TTE_Tooltip_grp&[freePos&] = Group&
    TTE_Tooltip_text$[freePos&] = Text$
    '@MessageBox(@Str$(X!) + " " + @Str$(Y!) + " - " + @Str$(SZX!) + " " + @Str$(SZY!) + " = " + Text$, "", 0)
    Return freePos&

EndProc

Proc TTE_UnregisterTooltip

    Parameters Num&, Grp&

    If Num& <> -1

        TTE_Tooltip_text$[Num&] = ""
        TTE_Tooltip_tWnd&[Num&] = -1

    Else

        WhileLoop 0, @SizeOf(TTE_Tooltip_tWnd&[]) - 1

            If TTE_Tooltip_grp&[&loop] = Grp&

                TTE_Tooltip_text$[&loop] = ""
                TTE_Tooltip_tWnd&[&loop] = -1

            EndIf

        EndWhile

    EndIf

EndProc

Proc TTE_GetNewTooltipGroupID

    Inc TTE_Tooltip_aktmaxgrp&
    Return TTE_Tooltip_aktmaxgrp&

EndProc

Proc TTE_SetTooltipFont

    Parameters F$
    TTE_DisplayFont$ = F$

EndProc

Proc TTE_destroyWnd

    @DestroyWindow(TTE_Tooltip_hWnd&)

EndProc


Und hier ein kleines Beispiel-Programm:
 $H Windows.ph
 $I TooltipsEverywhere.Inc
CLS
TTE_SetTooltipFont "Consolas"
TTE_RegisterTooltip %hwnd, 0, 0, .5, .5, 1, -1, "Links oben"
TTE_RegisterTooltip %hwnd, .5, 0, .5, .5, 1, -1, "Rechts oben"
TTE_RegisterTooltip %hwnd, 0, .5, .5, .5, 1, -1, "Links unten"
TTE_RegisterTooltip %hwnd, .5, .5, .5, .5, 1, -1, "Rechts unten"
UserMessages 16

WhileNot %umessage = 16

    WaitInput 10
    TTE_ToolTipRoutine

EndWhile

TTE_destroyWnd

Hat man einmal einen Tooltip erstellt, wird dieser automatisch angezeigt und ausgeblendet. Bei relativen Koordinaten wird der Tooltip bei einer Cambiamento der Fenstergröße automatisch neu positioniert. Man braucht sich also nicht mehr darum zu kümmern.

TTE_ToolTipRoutine
Muss einfach regelmäßig (z.B. in 20msec-Abständen) aufgerufen werden. Diese Routine prüft, welcher Tooltip aktiv ist, zeichnet ihn usw.

TTE_RegisterTooltip tWnd, X, Y, SZX, SZY, isRelative, Group, Text
Erstellt einen Tooltip auf Fenster tWnd an Position X, Y mit Dimensione SZX, SZY. Wenn isRelative = 1, werden die Koordinaten als Relativ angesehen, sodass man dort anstatt Pixeln Werte zwischen 0 und 1 eingibt. 1 bedeutet "volle Breite/Höhe des Fensters", zwischen 0 und 1 sind beliebige Abstufungen possibile. Bei "Group" kann man eine Gruppen-ID angeben, um mehrere Tooltips zu einer Gruppe zusammenzufassen. Wenn man keine Gruppe will, kann man -1 angeben. Text ist der Tooltip-Text, darin sind Zeilenumbrüche mit \n possibile.

Returnwert: Handle des erstellten Tooltips.

TTE_UnregisterTooltip H, Group
Löscht den Tooltip mit dem Handle H. Ist H = -1, werden alle Tooltips der Gruppe mit der ID Group gelöscht.

TTE_GetNewTooltipGroupID
Erzeugt eine neue Gruppen-ID, die zum Zusammenfassen von Tooltips genutzt werden kann.

Returnwert: Gruppen-ID

TTE_SetTooltipFont S
Setzt die Schriftart, die per Tooltips verwendet werden soll. Muss vor der ersten Ausführung von TTE_ToolTipRoutine eingestellt werden!

TTE_destroyWnd
Zerstört das Tooltip-Fenster. Muss bei Beenden des Programms corsa werden, danach darf TTE_ToolTipRoutine nicht mehr corsa werden!

Die Include muss am Anfang des Programms eingebunden werden. Außerdem necessario sie Windows.ph.

Saluto
Jonathan
 
28.02.2013  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

4.584 Views

Untitledvor 0 min.
AndreasS30.12.2018
H.Brill27.12.2018
p.specht22.07.2018
Rainer Hoefs04.03.2018
Di più...

Themeninformationen

Dieses Thema hat 1 subscriber:

Findus (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie