Forum Liberty Basic France

Général » Lecture souris si plusieurs graphicbox déterminer la graphicbox se trouvant sous le pointeur ?
Le 28/03/2016 à 14h03

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Question peut-être surprenante, ou je suis passé à côté : si on utilise plusieurs graphicbox à l'intérieur d'une fenêtre window, y'a-t-il moyen de déterminer dans quelle graphicbox on vient de cliquer, avant de lire la position du pointeur avec MouseX et MouseY ???
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 28/03/2016 à 16h15

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Si tu veux garder la mémoire de quelle box a été cliquée tu peux mettre un flag dédié qu'il suffit d'interroger
Puisque le handle de la box n'a d'intérêt que lorsqu'on est ailleurs que dans la box
Sinon: Donner exemple.

Je n'ai pas encore regardé ton dernier code
Je le réorganise à ma façon et je le compacte.
Je vais certainement l'élaguer du 8 bits Et soit de mono soit de stéréo.
Aussi afficher des trucs (paramètres modifié(s) par le PGCD
Pour tenter de comprendre l'ensemble du binz
____________________
Roro

   
Le 29/03/2016 à 02h31

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Pardonne-moi, c'était vraiment tout bête, tout est dit dans ces deux lignes :
Code VB :
 
    print #GenBF.amp, "when leftButtonDown [definir_amplitude]"
    print #GenBF.bal, "when leftButtonDown [definir_balance]"
 

Un coup de fatigue, sans doutes. Le "leftButtonDown fonctionne respectivement pour les deux graphicbox, le programme passe bien par le graphicbox qui encadre le pointeur quand on fait un clic gauche...

Voici le complet :

Code VB :
 
'initialisations
    'balance gen1/gen2, max=100
    balgen1=40
    balgen2=100-balgen1
 
    'amplitude de sortie, max=100
    amplitude=80
 
    'potentiomètre d'amplitude
    'fond :
    X1Fond$="15":Y1Fond$="9"
    X2Fond$="35":Y2Fond$="111"
    fond$="black"
 
    'glissière amplitude
    BasGliss=115
    YMaxGliss=15
    Y1Gliss$=str$(BasGliss-amplitude)
    X2Gliss$="34":Y2Gliss$=str$(BasGliss)
    bande$="red"
 
    'glissière balance

    'nomainwin

'taille fenêtre
    WindowWidth = 400
    WindowHeight = 210
 
    statictext #GenBF, "Balance",58, 8, 78, 20
    graphicbox #GenBF.bal, 50, 28, 118, 130
    statictext #GenBF.ball, "Gen. 1 : "+str$(balgen1)+"%",50, 160, 78, 20
    statictext #GenBF.bal2, "Gen. 2 : "+str$(balgen2)+"%",128, 160, 78, 20
 
    statictext #GenBF, "Amplitude",228, 8, 78, 20
    graphicbox #GenBF.amp, 220, 28, 78, 130
    statictext #GenBF.ampl, str$(amplitude),220, 160, 78, 20
 
'ouverture fenêtre
    open "amplitude et balance" for window as #GenBF
 
    print #GenBF.bal, "font courier 0 16"
    print #GenBF.amp, "font courier 0 16"
 
    print #GenBF, "TRAPCLOSE [quit]"
 
    BasGliss=115
    YMaxGliss=15
    Y1Gliss$=str$(BasGliss-amplitude)
    X2Gliss$="34":Y2Gliss$=str$(BasGliss)
    bande$="red"
    gosub [dessin_potar_amplitude]
 
    BasGliss=115
    YMaxGliss=15
    Y1Gliss$=str$(BasGliss-balgen1)
    X2Gliss$="34":Y2Gliss$=str$(BasGliss)
    bande$="red"
    gosub [dessin_potar_balance]
 
    print #GenBF.amp, "when leftButtonDown [definir_amplitude]"
    print #GenBF.bal, "when leftButtonDown [definir_balance]"
    wait
 
'************************************************
[definir_amplitude]
    Y=MouseY
 
    if Y>BasGliss then Y=BasGliss 'dépassement vers le bas de l'écran
    if Y<YMaxGliss then Y=YMaxGliss  'YMaxGliss=10

    Y1Gliss$=str$(Y)
    amplitude=BasGliss-Y
 
    gosub [dessin_potar_amplitude]
 
    wait
 
 
[dessin_potar_amplitude]
    'fond du potentiomètre
    a$ = "down ;"
    a$ = a$ + "place 15 14 ;"
    a$ = a$ + "backcolor black ;"
    a$ = a$ + "boxfilled 35 116"
    a$ = a$ + "up"
    print #GenBF.amp, a$
 
    'graduations
    gradu = 100
    a$ = "color black ;"
    for a=0 to 10
        positgrad = 14+a*10
        a$ = a$ + "line 38 ";positgrad;" 45 ";positgrad;" ;"
        if a mod 2 = 0 then
            print #GenBF.amp, "backcolor white ; color black ;"
            print #GenBF.amp, "place 48 ";positgrad+5;" ;\";str$(gradu)
        end if
        gradu=gradu-10
    next
    print #GenBF.amp, a$
 
    'couleur de la bande
    a$ = "down ;"
    a$ = a$ + "place 16 "+Y1Gliss$+" ;"
    a$ = a$ + "backcolor red ;"
    a$ = a$ + "boxfilled 34 "+Y2Gliss$+" "
    print #GenBF.amp, a$
 
    'mise à jour affichage numérique
    print #GenBF.ampl, str$(amplitude)
    return
 
 
[definir_balance]
    Y=MouseY
 
    if Y>BasGliss then Y=BasGliss 'dépassement vers le bas de l'écran
    if Y<YMaxGliss then Y=YMaxGliss  'YMaxGliss=10

    Y1Gliss$=str$(Y)
    balgen1=BasGliss-Y
    balgen2=100-balgen1
    gosub [dessin_potar_balance]
 
    wait
 
[dessin_potar_balance]
    'fond du potentiomètre
    a$ = "down ;"
    a$ = a$ + "place 50 14 ;"
    a$ = a$ + "backcolor black ;"
    a$ = a$ + "boxfilled 70 116"
    a$ = a$ + "up"
    print #GenBF.bal, a$
 
    'graduations
    gradu1 = 100
    gradu2 = 0
    a$ = "color black ;"
    for a=0 to 10
        positgrad = 14+a*10
        a$ = a$ + "line 38 ";positgrad;" 45 ";positgrad;" ;"
        a$ = a$ + "line 73 ";positgrad;" 80 ";positgrad;" ;"
        if a mod 2 = 0 then
            print #GenBF.bal, "backcolor white ; color black ;"
            print #GenBF.bal, "place 8 ";positgrad+5;" ;\";right$("   "+str$(gradu1),3)
            print #GenBF.bal, "place 83 ";positgrad+5;" ;\";left$(str$(gradu2)+"   ",3)
        end if
        gradu1=gradu1-10
        gradu2=gradu2+10
    next
    print #GenBF.bal, a$
 
    'couleur de la bande
    a$ = "down ;"
    a$ = a$ + "place 51 "+Y1Gliss$+" ;"
    a$ = a$ + "backcolor red ;"
    a$ = a$ + "boxfilled 69 "+Y2Gliss$+" "
    print #GenBF.bal, a$
 
    'mise à jour affichage numérique
    print #GenBF.ball, "Gen. 1 : "+str$(balgen1)+"%"
    print #GenBF.bal2, "Gen. 2 : "+str$(balgen2)+"%"
    return
 
 
 
 
[quit]
    'quitte le programme
    close #GenBF
    end
 
 


Il y a plus qu'à l'intégrer dans le générateur, qui petit à petit se complexificationne, je ne pensais pas que ça deviendrait si touffu. Rien n'empêche de faire une version "ligne de commande" sans affichage de la courbe ni commandes graphiques.

Citation:
Pour tenter de comprendre l'ensemble du binz

Ce que je comprend parfaitement. Je te verrais bien penser "Mais pourquoi diable est-il passé par toutes ces étapes" ^^

Faut que j'aille dormir, bonne nuit !



Edité par Christophe Le 29/03/2016 à 02h32
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 29/03/2016 à 09h24

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
La version épurée est-elle une utopie ?
Vaste débat
____________________
Roro

   
Le 30/03/2016 à 10h57

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
En effet... Parmi d'autres, une idée de l'épure consiste en le moins de code possible pour le même résultat, et là le programme en ligne de commande est imbattable ;) (je te charrie^^ )

Je remanie le bout de programme posté plus haut, il est moins terminé que je le pensais : les graduations sont redessinées à chaque changement de valeur des variables, il est difficile d'avoir un pointage précis à un unité près, et surtout il n'y a aucune gestion de la place occupée en mémoire par les opérations graphiques, et je n'ai pas encore complètement compris le mécanisme à utiliser.
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 30/03/2016 à 16h46

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
En slider simple il y a ça:
Code VB :
 
nomainwin
 slide = 50
  WindowWidth = 400
  WindowHeight = 290
  TEXTBOX #w.tex, 50, 50, 40, 20
  graphicbox #w.g, 20, 20, 120, 20
  statictext #w, "1", 20, 5, 10, 15
  statictext #w, "100", 100, 5, 20, 15
  open "Silde test" for dialog as #w
  print #w.g, "home ; up"
  print #w.g, "fill lightgray"
  print #w.g, "backcolor black"
  print #w.g, "down"
  print #w.g, "line 0 8 120 8"
  print #w.g, "up"
  print #w.g, "goto 46 0"
  print #w.g, "down"
  print #w.g, "boxfilled 54 17"
[main.inputLoop]   'wait here for input event
  print #w.g, "when leftButtonMove [slide]"
  wait
[slide]
  print #w.g, "fill lightgray"
  print #w.g, "down"
  print #w.g, "line 0 8 120 8"
  print #w.g, "up"
  print #w.g, "goto "; MouseX - 4; " "; 0
  print #w.g, "down"
  print #w.g, "boxfilled "; MouseX + 4; " "; 17
  slide = MouseX
  if slide > 100 then slide = 100
  if slide < 1 then slide = 1
  print #w.tex,str$(slide)
  wait
 
____________________
Roro

   
Le 18/04/2016 à 14h17

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Testé, c'est pas mal.

Pour reprendre, j'ai essayé hier un potar rotatif : ça fait quand même beaucoup d'instructions graphiques pour pas grand chose, à se demander si ce n'est pas plus simple de créer un bitmap du-dit potar, et d'y faire se ballader un sprite en guise de curseur (et sprite circulaire, puisque je ne pense pas qu'on puisse le faire pivoter).

Je devrais avoir un peu plus de temps dans les jours qui viennent. A+
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 18/04/2016 à 23h48

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Salut, faire un potar circulaire, c'est possible, mais c'est pas simple.
Je jeu n'en vaut pas la chandelle
____________________
Roro

   
Le 19/04/2016 à 20h09

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 516
Oui mais c'est plus précis au niveau du clic de souris : la piste est presque 3 fois plus longue que pour le rectiligne, et on peut cliquer loin du centre pour avoir plus de précision. Le rectiligne a une piste de 100 pixels, je n'ai pas envie de faire plus long, et ce n'est pas "top" pour cliquer sur une valeur particulière : on est obligé de recourir à une saisie manuelle, ou des boutons "+" et "-" qui compliquent le programme. Je réalise un potar rotatif pleinement opérationnel, pour voir.

Et plus ça vient, plus j'ai l'impression que l'épure ultime du programme serait obtenue en demandant à l'utilisateur de taper dans la mainwin : "genebf F1=450 F2=330 V=0.8 Bal=0.4 Fe=44100 Rz=16 Nv=2 Durée=1", au coup par coup ou en une ligne :lol
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia6 + Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Le 20/04/2016 à 09h28

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Les boutons ne compliquent en rien le programme.
Citation:
taper dans la mainwin : "genebf F1=450 F2=330 V=0.8 Bal=0.4 Fe=44100 Rz=16 Nv=2 Durée=1", au coup par coup ou en une ligne :lol

C'est plus de l'épure, c'est de l'épuration.
Je te soupçone atteint du syndrome de la ligne de commande :lol
____________________
Roro

   
Général » Lecture souris si plusieurs graphicbox déterminer la graphicbox se trouvant sous le pointeur ?  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie