Bulles d'aide pour canvas

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Bulles d'aide pour canvas

Message par microdevweb »

Je travaille pas mal avec les canvas, et si par exemple vous dessinez plusieurs boutons dans le même canvas il peut-être utile d'afficher une bulle d'aide. Voici un solution sans appi.

Image

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : Tooltip for canvas
; File Name : TootipCanvas.pb
; Description : Comment affiché une bulle d'aide à un canvas
; Version: B0.1  Date of begin : 2016/04/
;************************************************************************************************************************
DeclareModule tst
    Declare AddForm(X,Y,W,H,BgColor,FgColor,HelpMsg.s)
    Declare Init(X.i,Y.i,W.i,H.i)
    Declare Draw()
EndDeclareModule
Module tst
    ;-* Structure et liste pou afiché des formes dans un canvas
    Structure pos
        X.i
        Y.i
        W.i
        H.i
    EndStructure
    Structure form
        myPos.pos
        helpMsg.s
        BgColor.i
        FgColor.i
    EndStructure
    Structure tst
        myPos.pos
        List myForm.form()
        idForm.i
        idCanvas.i
        idHelpWin.i
        HelpOn.b
        BgColor.i
        FgColor.i
        TxtFont.i
        TxtColor.i
    EndStructure
    Global myTst.tst
    Global gMouseX,gMouseY
    ;}
    ;-* LOCAL PROCEDURE
    Procedure HideHelp()
        If myTst\HelpOn
            ; Enfin on affiche la fenêtre
            HideWindow(myTst\idHelpWin,#True,#PB_Window_NoActivate)
            ; Et on signale que la fenêtre n'est plus affichée
            myTst\HelpOn=#False
        EndIf
    EndProcedure
    Procedure DisplayHelp()
        Protected Margin=10,W,H,X,Y
        ; On dessine dans la fenêtre Bulle d'aide
        StartDrawing(WindowOutput(myTst\idHelpWin))
        DrawingFont(FontID(myTst\TxtFont))
        ; La largeur
        W=TextWidth(myTst\myForm()\helpMsg)+(Margin*2)
        ; La hauteur
        H=TextHeight(myTst\myForm()\helpMsg)+(Margin*2)
        ; On mémorise la position ou sera affichée la fenêtre
        ; On prend pour cela la position souris relative à la fenêtre
        X=WindowMouseX(myTst\idForm)
        ; On dessend également la position Y pour ne pâs marqué le curseur
        Y=WindowMouseY(myTst\idForm)+40
        ; On vérifier que la bulle d'aide n'est en dehors de la fenêtre
        If (X+W)>(WindowMouseX(myTst\idForm)+WindowWidth(myTst\idForm))-Margin
            X=(WindowMouseX(myTst\idForm)+WindowWidth(myTst\idForm))-Margin
        EndIf
        If (Y+H)>(WindowMouseY(myTst\idForm)+WindowHeight(myTst\idForm))-Margin
            Y=(WindowMouseY(myTst\idForm)+WindowHeight(myTst\idForm))-Margin
        EndIf
        ; On redimentionne la fenêtre pour la bulle d'aide
        ResizeWindow(myTst\idHelpWin,X,Y,W,H)
        ; Si l'aide n'est pas déjà affichée
        ; On dessine le fond
        DrawingMode(#PB_2DDrawing_Default)
        Box(0,0,W,H,myTst\BgColor)
        ; On dessine le cadre
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(0,0,W,H,myTst\FgColor)
        ; On dessine le texte
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(Margin,Margin,myTst\myForm()\helpMsg,myTst\TxtColor)
        StopDrawing()
        If  myTst\HelpOn=#False
            ; Enfin on affiche la fenêtre
            HideWindow(myTst\idHelpWin,#False,#PB_Window_NoActivate)
            ; Et on signale que la fenêtre est affichée
            myTst\HelpOn=#True
        EndIf
    EndProcedure
    Procedure IsHoverForm()
        ForEach myTst\myForm()
            With myTst\myForm()\myPos
                If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\H))
                    ProcedureReturn #True
                EndIf
            EndWith
        Next
        ProcedureReturn #False
    EndProcedure
    Procedure WhereIsMouse()
        ; On est sur une forme
        If IsHoverForm()
            ; On affiche la bulle d'aide
            DisplayHelp()
            ; On change le curseur
            SetGadgetAttribute(myTst\idCanvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
            ; On ne va pas plus loint
            ProcedureReturn 
        EndIf
        ; Ici on est sur aucun élément donc on affiche le curseur normal
        SetGadgetAttribute(myTst\idCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
        ; Masque la bulle d'aide
        HideHelp()
    EndProcedure
    Procedure Event()
        ; Si aucune forme on sort
        If ListSize(myTst\myForm())=0:ProcedureReturn :EndIf
        Select EventType()
                ; La souris bouge    
            Case #PB_EventType_MouseMove
                ; On relève les positions de la souris (relative au canvas)
                gMouseX=GetGadgetAttribute(myTst\idCanvas,#PB_Canvas_MouseX)
                gMouseY=GetGadgetAttribute(myTst\idCanvas,#PB_Canvas_MouseY)
                ; Regarde on est ?
                WhereIsMouse()
                ; On est en dehors du canvas   
            Case #PB_EventType_MouseLeave
                ; Si en dehors du canvas
                HideHelp()
        EndSelect
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure AddForm(X,Y,W,H,BgColor,FgColor,HelpMsg.s)
        With myTst\myForm()
            AddElement(myTst\myForm())
            \BgColor=BgColor
            \FgColor=FgColor
            \helpMsg=HelpMsg
            \myPos\X=X
            \myPos\Y=Y
            \myPos\W=W
            \myPos\H=H
        EndWith
    EndProcedure
    Procedure Init(X.i,Y.i,W.i,H.i)
        Protected flag=#PB_Window_BorderLess|#PB_Window_Invisible
        With myTst\myPos
            \X=X
            \Y=Y
            \W=W
            \H=H
            myTst\idForm=GetActiveWindow()
            ; Création du canvas dans la fenêtre
            myTst\idCanvas=CanvasGadget(#PB_Any,X,Y,W,H)
        EndWith
        With myTst
            ; Ouverture de la fenêtre pour afficher l'aide invisible
            \idHelpWin=OpenWindow(#PB_Any,0,0,100,100,"",flag,WindowID(\idForm))
            StickyWindow(myTst\idHelpWin,#True)
            ; Par défaut l'aide n'est pas active
            \HelpOn=#False
            ; Couleur et police pour la bulle d'aide
            \BgColor=RGB(135, 206, 250)
            \FgColor=RGB(8, 127, 200)
            \TxtColor=RGB(1, 24, 38)
            \TxtFont=LoadFont(#PB_Any,"Arial",11,#PB_Font_HighQuality)
            ; Mise en place du callback
            BindGadgetEvent(\idCanvas,@Event())
        EndWith
    EndProcedure
    Procedure Draw()
        StartDrawing(CanvasOutput(myTst\idCanvas))
        ForEach myTst\myForm()
            With myTst\myForm()
                DrawingMode(#PB_2DDrawing_Default)
                Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,\BgColor)
                DrawingMode(#PB_2DDrawing_Outlined)
                Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,\FgColor)
            EndWith
        Next
        StopDrawing()
    EndProcedure
    ;}
EndModule
; Code pour le teste
Procedure Exit()
    End
EndProcedure
Define Flag,X
Flag=#PB_Window_SystemMenu|#PB_Window_Maximize
OpenWindow(0,0,0,800,600,"teste",Flag)
tst::Init(10,10,800,200)
X=10
tst::AddForm(X,10,50,50,RGB(255, 0, 0),RGB(5, 2, 37),"Voici le carré rouge")
X+60
tst::AddForm(X,10,50,50,RGB(15, 177, 76),RGB(5, 2, 37),"Voici le carré vert")
X+60
tst::AddForm(X,10,50,50,RGB(249, 245, 122),RGB(5, 2, 37),"Voici le carré jaune")
tst::Draw()
BindEvent(#PB_Event_CloseWindow,@Exit(),0)
Repeat :WaitWindowEvent():ForEver
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Ar-S
Messages : 9478
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Bulles d'aide pour canvas

Message par Ar-S »

Très cool ça, merci !
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Bulles d'aide pour canvas

Message par Micoute »

Merci microdevweb pour ce partage. J'adore et j'adopte.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Bulles d'aide pour canvas

Message par Kwai chang caine »

Super jolie ces bulles.
D'autant plus que des bulles carrées......dans ma vie j'en ai pas vu souvent 8O
Et pourtant je m'y connais un peu dans ce sujet , car je peux te dire qu'a l'école, j'en ai coincé quelques unes, mais jamais au point de les rendre carrées :lol:
Merci de ce code et de ton travail acharné 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Bulles d'aide pour canvas

Message par microdevweb »

Voila pour faire plaisir à Kwai chang caine un autre code avec des vrais bubulle.

Note: Par-contre ne fonctionnera que sur Windows.

Image

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : Tooltip for canvas
; File Name : TootipCanvas.pb
; Description : Comment affiché une bulle d'aide à un canvas
; Version: B0.1  Date of begin : 2016/04/
;************************************************************************************************************************
DeclareModule tst
    Declare AddForm(X,Y,W,H,BgColor,FgColor,HelpMsg.s)
    Declare Init(X.i,Y.i,W.i,H.i)
    Declare Draw()
EndDeclareModule
Module tst
    ;-* Structure et liste pou afiché des formes dans un canvas
    Structure pos
        X.i
        Y.i
        W.i
        H.i
    EndStructure
    Structure form
        myPos.pos
        helpMsg.s
        BgColor.i
        FgColor.i
    EndStructure
    Structure tst
        myPos.pos
        List myForm.form()
        idForm.i
        idCanvas.i
        idHelpWin.i
        HelpOn.b
        BgColor.i
        FgColor.i
        TxtFont.i
        TxtColor.i
    EndStructure
    Global myTst.tst
    Global gMouseX,gMouseY
    Global AlphaColor=$FC000000
    ;}
    ;-* LOCAL PROCEDURE
    Procedure HideHelp()
        If myTst\HelpOn
            ; Enfin on affiche la fenêtre
            HideWindow(myTst\idHelpWin,#True,#PB_Window_NoActivate)
            ; Et on signale que la fenêtre n'est plus affichée
            myTst\HelpOn=#False
        EndIf
    EndProcedure
    Procedure DisplayHelp()
        Protected Margin=10,W,H,X,Y
        ; On dessine dans la fenêtre Bulle d'aide
        StartDrawing(WindowOutput(myTst\idHelpWin))
        DrawingFont(FontID(myTst\TxtFont))
        ; La largeur
        W=TextWidth(myTst\myForm()\helpMsg)+(Margin*2)
        ; La hauteur
        H=TextHeight(myTst\myForm()\helpMsg)+(Margin*2)
        ; On mémorise la position ou sera affichée la fenêtre
        ; On prend pour cela la position souris relative à la fenêtre
        X=WindowMouseX(myTst\idForm)
        ; On dessend également la position Y pour ne pâs marqué le curseur
        Y=WindowMouseY(myTst\idForm)+40
        ; On vérifier que la bulle d'aide n'est en dehors de la fenêtre
        If (X+W)>(WindowMouseX(myTst\idForm)+WindowWidth(myTst\idForm))-Margin
            X=(WindowMouseX(myTst\idForm)+WindowWidth(myTst\idForm))-Margin
        EndIf
        If (Y+H)>(WindowMouseY(myTst\idForm)+WindowHeight(myTst\idForm))-Margin
            Y=(WindowMouseY(myTst\idForm)+WindowHeight(myTst\idForm))-Margin
        EndIf
        ; On redimentionne la fenêtre pour la bulle d'aide
        ResizeWindow(myTst\idHelpWin,X,Y,W,H)
        ; Si l'aide n'est pas déjà affichée
        DrawingMode(#PB_2DDrawing_Default)
        ; On place un fond avec la couleur qui sera en Aplha
        Box(0,0,W,H,AlphaColor)
        ; On dessine le fond
        RoundBox(0,0,W,H,35,35,myTst\BgColor)
        ; On dessine le cadre
        DrawingMode(#PB_2DDrawing_Outlined)
        RoundBox(0,0,W,H,35,35,myTst\FgColor)
        ; On dessine le texte
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(Margin,Margin,myTst\myForm()\helpMsg,myTst\TxtColor)
        StopDrawing()
        If  myTst\HelpOn=#False
            ; Enfin on affiche la fenêtre
            HideWindow(myTst\idHelpWin,#False,#PB_Window_NoActivate)
            ; Et on signale que la fenêtre est affichée
            myTst\HelpOn=#True
        EndIf
    EndProcedure
    Procedure IsHoverForm()
        ForEach myTst\myForm()
            With myTst\myForm()\myPos
                If (gMouseX>=\X And gMouseX<=(\X+\W)) And (gMouseY>=\Y And gMouseY<=(\Y+\H))
                    ProcedureReturn #True
                EndIf
            EndWith
        Next
        ProcedureReturn #False
    EndProcedure
    Procedure WhereIsMouse()
        ; On est sur une forme
        If IsHoverForm()
            ; On affiche la bulle d'aide
            DisplayHelp()
            ; On change le curseur
            SetGadgetAttribute(myTst\idCanvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
            ; On ne va pas plus loint
            ProcedureReturn 
        EndIf
        ; Ici on est sur aucun élément donc on affiche le curseur normal
        SetGadgetAttribute(myTst\idCanvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
        ; Masque la bulle d'aide
        HideHelp()
    EndProcedure
    Procedure Event()
        ; Si aucune forme on sort
        If ListSize(myTst\myForm())=0:ProcedureReturn :EndIf
        Select EventType()
                ; La souris bouge    
            Case #PB_EventType_MouseMove
                ; On relève les positions de la souris (relative au canvas)
                gMouseX=GetGadgetAttribute(myTst\idCanvas,#PB_Canvas_MouseX)
                gMouseY=GetGadgetAttribute(myTst\idCanvas,#PB_Canvas_MouseY)
                ; Regarde on est ?
                WhereIsMouse()
                ; On est en dehors du canvas   
            Case #PB_EventType_MouseLeave
                ; Si en dehors du canvas
                HideHelp()
        EndSelect
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure AddForm(X,Y,W,H,BgColor,FgColor,HelpMsg.s)
        With myTst\myForm()
            AddElement(myTst\myForm())
            \BgColor=BgColor
            \FgColor=FgColor
            \helpMsg=HelpMsg
            \myPos\X=X
            \myPos\Y=Y
            \myPos\W=W
            \myPos\H=H
        EndWith
    EndProcedure
    Procedure Init(X.i,Y.i,W.i,H.i)
        Protected flag=#PB_Window_BorderLess|#PB_Window_Invisible
        With myTst\myPos
            \X=X
            \Y=Y
            \W=W
            \H=H
            myTst\idForm=GetActiveWindow()
            ; Création du canvas dans la fenêtre
            myTst\idCanvas=CanvasGadget(#PB_Any,X,Y,W,H)
        EndWith
        With myTst
            ; Ouverture de la fenêtre pour afficher l'aide invisible
            \idHelpWin=OpenWindow(#PB_Any,0,0,100,100,"",flag,WindowID(\idForm))
            ; Pour rendre la fenêtre transaprente
            SetWindowLong_(WindowID(\idHelpWin), #GWL_EXSTYLE, #WS_EX_LAYERED) 
            SetLayeredWindowAttributes_(WindowID(\idHelpWin), AlphaColor, 0, #LWA_COLORKEY)    ;
            StickyWindow(myTst\idHelpWin,#True)
            ; Par défaut l'aide n'est pas active
            \HelpOn=#False
            ; Couleur et police pour la bulle d'aide
            \BgColor=RGB(135, 206, 250)
            \FgColor=RGB(8, 127, 200)
            \TxtColor=RGB(1, 24, 38)
            \TxtFont=LoadFont(#PB_Any,"Arial",11,#PB_Font_HighQuality)
            ; Mise en place du callback
            BindGadgetEvent(\idCanvas,@Event())
        EndWith
    EndProcedure
    Procedure Draw()
        StartDrawing(CanvasOutput(myTst\idCanvas))
        ForEach myTst\myForm()
            With myTst\myForm()
                DrawingMode(#PB_2DDrawing_Default)
                Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,\BgColor)
                DrawingMode(#PB_2DDrawing_Outlined)
                Box(\myPos\X,\myPos\Y,\myPos\W,\myPos\H,\FgColor)
            EndWith
        Next
        StopDrawing()
    EndProcedure
    ;}
EndModule
; Code pour le teste
Procedure Exit()
    End
EndProcedure
Define Flag,X
Flag=#PB_Window_SystemMenu|#PB_Window_Maximize
OpenWindow(0,0,0,800,600,"teste",Flag)
tst::Init(10,10,800,200)
X=10
tst::AddForm(X,10,50,50,RGB(255, 0, 0),RGB(5, 2, 37),"Voici le carré rouge")
X+60
tst::AddForm(X,10,50,50,RGB(15, 177, 76),RGB(5, 2, 37),"Voici le carré vert")
X+60
tst::AddForm(X,10,50,50,RGB(249, 245, 122),RGB(5, 2, 37),"Voici le carré jaune")
tst::Draw()
BindEvent(#PB_Event_CloseWindow,@Exit(),0)
Repeat :WaitWindowEvent():ForEver
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Bulles d'aide pour canvas

Message par Kwai chang caine »

Alors la ......je reste sans voix, t'es plus rapide que la redoute 8O

C'est plus fort que le fromage fort, même pas on demande, et on a 8)
Dit ...aux prochaines élections...tu voudrais pas te présenter contre FRED..parce que... au niveau réactivité c'est exactement le même temps
Juste l'unité change, l'un c'est les minutes, l'autre les années :mrgreen:

Marche niquel avec VINE D'EAU, encore merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Bulles d'aide pour canvas

Message par GallyHC »

Bonjour,

J'ai bien appréciais ton code. Je penses que je l'utiliserais un de c'est quatre ^^. Je dirais, même qu'il me pousse à modifier mes codes et à utiliser cette méthode de module.

Vraiment sympa et continu a nous donné de bon code comme celui-ci.

Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Bulles d'aide pour canvas

Message par microdevweb »

Merci GallyHc et Kwai chang caine,

Kwai chang caine heu j'ai vraiment pas le niveau de Fred malheureusement pour moi :wink:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Bernie
Messages : 282
Inscription : mar. 22/mars/2016 10:12
Localisation : En France

Re: Bulles d'aide pour canvas

Message par Bernie »

microdevweb pour ce partage
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Bulles d'aide pour canvas

Message par Kwai chang caine »

microdevweb a écrit :Merci GallyHc et Kwai chang caine,
Kwai chang caine heu j'ai vraiment pas le niveau de Fred malheureusement pour moi :wink:
On reve tous (ou presque d'avoir le niveau de FRED :wink:)
Je me souviens d'une des rares fois ou il avait eu la gentillesse d'échanger quelques mots sur sa vie, et ou il nous disait qu'il n'était pas le meilleur de sa classe 8O
Cette phrase m'avait fait bondir, car j'ai eu du mal à le croire.
Il n'était peut être pas le meilleur à l'époque, mais il a fait tellement de route depuis qu'il a perdu ses boutons de jeune adolescent geek 8)

D'ailleurs qui est le meilleur ??
Je sais même pas si y'a un championnat de programmation :cry:
Y'a des championnats de tout, avec des médailles de toutes les couleurs, on nous bassine tous les jours à la télé de foot, rugby et autres joyeuseries et rien sur les cerveaux.

Bref, te casses pas la tête, depuis le temps que je l'observe et l'admire, je me rend compte du niveau de FRED (et encore), mais ce qui est sûr c'est que tu es quelqu'un de structuré, de prolifique, qui généré du code de qualité et c'est un vrai plaisir de te voir coder 8)
La programmation a besoin de personnes stables et structurées, le seul problème c'est que ça prend du temps, et on est pas tous capable de lui consacrer ce dernier, par impatience souvent et parfois forcé :cry:
Alors je profite de ce post pour te remercier à nouveau pour tout ce que tu apportes à ce forum 8)

Et je faisais de l'humour, sur la différence de réactivité entre FRED et toi :lol: il est taquin le KCC, il est taquin :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre