Forum Liberty Basic France

Le 10/05/2015 à 10h27

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 575
Le présent topic fait suite à celui-ci ---> http://libertybasic.fr/forum/topic-384-2.php#m4298

Bonjour tout le monde !

Je recherchais un moyen de détecter la présence de la souris au dessus d'une zone particulière, pour y afficher une combobox volante, quand soudain une illumination apparut : "commence donc déjà par apprendre le JustBasic ! "

Bon, alors voilà le travail d'une après-midi, que je vous dévoile en cette belle matinée de Dimanche :

Code VB :
 
'détecter le passage de la souris dans une zone délimitée

'définir la fenêtre
'   (dimensions modifiées par des coefficients allant de 0 à 1 inclus)

    'dimensions actuelles de l'écran
    LargeurEcran = DisplayWidth
    HauteurEcran = DisplayHeight
 
    'dimensions de la fenêtre
    WindowWidth = int(LargeurEcran * 0.6)
    WindowHeight = int(HauteurEcran * 0.6)
 
    'position de l'angle supérieur gauche de la fenêtre sur l'écran
    UpperLeftX = int(LargeurEcran * 0.2)
    UpperLeftY = int(HauteurEcran * 0.2)
 
 
'position des écritures « position pointeur »
    XLigneAffichage = int(WindowWidth * 0.05)
    YLigneAffichage = int(WindowHeight * 0.05)
 
'position et dimension de la zone dans laquelle on devra détecter la souris
'   on définit ici le point supérieur gauche et le point inférieur droit de la zone
'   axes de référence : bords droit et haut de la fenêtre

    XHautGaucheZone = int(WindowWidth * 0.3)
    YHautGaucheZone = int(WindowHeight * 0.3)
    XBasDroiteZone = XHautGaucheZone + int(WindowWidth * 0.5)
    YBasDroiteZone = YHautGaucheZone + int(WindowHeight * 0.5)
 
'ouvrir la fenêtre en mode graphique (la lecture de la souris ne marche pas en mode window
'il semblerait d'ailleurs qu'il y ait un monde entre ces deux univers)
    
    open "souris sur zone ?" for graphics as #fenetre1
 
'affichage du texte "bougez la souris !"
    print #fenetre1, "color black"
    print #fenetre1, "down"
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage
    print #fenetre1, "\Bougez la souris !"
    print #fenetre1, "up"
 
'dessin de la zone
    print #fenetre1, "goto ";XHautGaucheZone;" ";YHautGaucheZone
    print #fenetre1, "down"
    print #fenetre1, "backcolor darkgreen"
 
    print #fenetre1, "boxfilled ";XBasDroiteZone;" ";YBasDroiteZone
    print #fenetre1, "backcolor white"
 
'détection du mouvement de la souris
    print #fenetre1, "when mouseMove [souris_se_deplace]"
 
'pour fermer la fenêtre
   print #fenetre1, "trapclose [quit]"
 
'attente…
wait
 
 
'fin du programme, au cas où...
end
 
 
'******** zone des sous-programmes ********

[quit]
    'fermeture sans confirmation et par le gadget de fermeture de la fenetre
    print "[quit]"
    close #fenetre1
end
 
 
[souris_se_deplace]
 
    'le pointeur est-il dans la zone ?
    if MouseX > XHautGaucheZone and MouseX < XBasDroiteZone and MouseY > YHautGaucheZone and MouseY < YBasDroiteZone then
        afficher$ = "La souris est dans la zone    "
        couleur$ = "red"
    else
        afficher$ = "La souris est hors-zone       "
        couleur$ = "black"
    end if
 
    'affichage de la position du pointeur et de l'information "en/hors zone"
    print #fenetre1, "color black"
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage
    print #fenetre1, "\Pos X = ";MouseX;",  Pos Y = ";MouseY;"           "
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage + 20
    print #fenetre1, "color " + couleur$
    print #fenetre1, "\" + afficher$
 
wait
 


Y'aurait-il quelque chose de travers dans ce code ?

Les textes affichés sur une fenêtre graphiques suivent-ils la même règle que les segments de droite qu'on affiche et qu'on doit désafficher ensuite, ou peut-on écrire à l'infini sans crainte pour l'espace mémoire ?

Christophe



Edité par Christophe Le 10/05/2015 à 10h31
____________________
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 10/05/2015 à 15h58

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Je ne dirai qu'un mot: Parfait!
Au niveau code: Ce n'est peut-être pas la peine de créer des variables: "LargeurEcran" autant mettre directement
"WindowWidth".
Et à la place de tes calculs savants, tu a: SourisouestuenX=MouseX (majuscules obligatoires), qui te donne la position de la souris.
Tu mets un: " if SourisouestuenX > debutzonegauche and SourisouestuenX < finzonedroite then " j y suis dans la largeur"
Et pareil avec: MouseY

Pour ce qui est de la mémoire: Avec 1 ou 2 gigas de ram, ce n'est pas les quelques octets d'une zone de texte qui m'ont jamais inquiétés.
Et donc: Je ne sais pas, mais je ne pense pas. C'est la mise en segment qui mobilise de la mémoire.(puisqu'on peut les rappeler)
Quand on surimpressionne sur un texte, il est perdu pour toujours; si on veut le revoir, il faut le réafficher.

Edit: Houla! je n'avais pas fait gaffe; avec ton système, tu ne détecte QUE si la souris est dans la fenêtre.
Ce qui obligerait à faire autant de fenêtres que de zones à détecter
Avec MouseX et MouseY, tu peux détecter n'importe où dans la fenêtre.
____________________
Roro

   
Le 11/05/2015 à 18h01

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 575
Merci !

Roland:

Au niveau code: Ce n'est peut-être pas la peine de créer des variables: "LargeurEcran" autant mettre directement
"WindowWidth".

En effet, je ne sais pas pourquoi je les ai mises, ça avait sûrement un côté rassurant de le voir écrit noir sur blanc, mais ça aurait fait trois lignes de moins, j'admet^^

Roland:

Et à la place de tes calculs savants, tu a: SourisouestuenX=MouseX (majuscules obligatoires), qui te donne la position de la souris.
Tu mets un: " if SourisouestuenX > debutzonegauche and SourisouestuenX < finzonedroite then " j y suis dans la largeur"
Et pareil avec: MouseY

je ne voulais mettre qu'un seul IF. J'ai supposé qu'un IF prendrait moins de temps que deux. Reste à savoir si le temps de traitement d'une porte ET à 4 entrées ne bouffe pas l'avantage de l'IF unique. Le vrai travail n'était pas l'optimisation, c'était une petite idée en passant.

Roland:

C'est la mise en segment qui mobilise de la mémoire.(puisqu'on peut les rappeler)
Quand on surimpressionne sur un texte, il est perdu pour toujours; si on veut le revoir, il faut le réafficher.

ça me rassure, et je n'ai effectivement pas lu de consigne pour désafficher un texte, donc à priori en effet il n'y a pas besoin de s'en préoccuper. Se poser la question était quand même pertinent, vu le nombre de mouvement de souris et d'affichage correspondants.

Roland:

...avec ton système, tu ne détecte QUE si la souris est dans la fenêtre.

C'est normal, la zone _est_ dans la fenêtre, et le programme détecte si la souris est dans la zone, ou à l'extérieur de la zone. Ou alors il ne fonctionne pas sur ton ordi comme il fonctionne chez moi.

Je vais voir maintenant comment gérer plusieurs zones dans une même fenêtre, et déterminer si la souris est dans la zone 1, 2, ou 3. Si ça marche ce sera gagné. (mais pas encore utile pour l'autre post qui traite de la combobox volante : je ne crois pas que les combobox soient fonctionnelles dans une fenêtre en mode graphics, ou si elles le sont, le sont-elles pleinement ? Je sens poindre de nouvelles difficultés)

Christophe.
____________________
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 11/05/2015 à 21h36

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Si tu veux gagner du temps, tu a une gestion de détection multizone en graphicbox dans le sous prog: [choice]
De ce prog: --> http://libertybasic.fr/forum/topic-381+un-petit-jeu.php

Le premier "if" détermine la zone d'exclusion
Avec MouseX, MouseY, c'est du gâteau.

Je pense que les combobox fonctionnent sans soucis dans les graphicbox.

J'ai bien aimé ton commentaire sur les différences entre les types de fenêtres.(qui peuvent êtres en effet surprenantes).
____________________
Roro

   
Le 12/05/2015 à 10h17

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Salut vous deux,

il y aurait peut-être une autre piste intéressante (et peut-être plus courte à l'usage ?) : spritecollides (voir le paragraphe Drawing and Collision Detection dans l'aide)

- on crée un petit sprite de 1 pixel
- ce sprite suivra la souris tout le temps.

- on crée autant de sprites blanc à l'emplacement des zones à détecter (un rectangle blanc)

- en utilisant spritecollides on connait le sprite que le petit sprite qui suit la souris vient de percuter...
- on détermine la position du sprite rencontré avec spritexy? je crois bien,
- on déplace le combobox à cette position

et le tour est joué...

@+

Gilles



Edité par cassiope01 Le 12/05/2015 à 10h22
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 12/05/2015 à 15h05

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Citation:
et le tour est joué..

Comme tu dit !
Le tout est de passer au travers des "sprites allready in use" Et autres ténébreux messages.
Nul doute que tu ferais ça en deux coups de cuillère à pot
Maître des sprites que tu es
Mais Christophe pourrait bien lui y manger son chapeau.
Comme de temps en temps, j'y mange aussi le mien.
Les sprites sont lutins
Et pour les maîtriser
Il faut être malin. ;)
____________________
Roro

   
Le 12/05/2015 à 16h02

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 575
L'idée des sprites est loin d'être bête, mais, en effet, je ne connais pas leur fonctionnement dans JustBasic, donc en attendant de me faire une session "spéciale sprites", je continue de me familiariser avec la détection de zones dans une fenêtre graphics.

Je regarde la réalisation de Roland, déjà étudiée (à l'occasion de mon premier post) à une époque où je ne cherchais pas à détecter la présence de la souris, et je reviens quand j'aurai fait quelque chose de significatif, ou si je suis vraiment bloqué^^

Bon après-midi à vous deux. A+

Christophe
____________________
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 12/05/2015 à 20h19

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Voyons Roland ! non seulement encore une fois tu te fais une montagne d'un caillou mais en plus tu fais peur à Christophe ;) c'est malin ça :lol
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 12/05/2015 à 22h26

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Avec spritecollide, c'est un combat de sprites que tu propose.
Je m'inquiète des dégâts collatéraux. :)
____________________
Roro

   
Le 13/05/2015 à 15h44

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 575
Pas de panique, je suis toujours là !

En fait ça y est, j'ai mes trois zones indépendantes qui fonctionnent

Voici l’œuvre, brouillonne pour le moment mais ça marche :

Code VB :
 
'détection de souris sur plusieurs zones d'une fenêtre

'définir la fenêtre
'   (dimensions modifiées par des coefficients allant de 0 à 1 inclus)

    'dimensions de la fenêtre
    WindowWidth = int(DisplayWidth * 0.6)
    WindowHeight = int(DisplayHeight * 0.6)
 
    'position de l'angle supérieur gauche de la fenêtre sur l'écran
    UpperLeftX = int(DisplayWidth * 0.2)
    UpperLeftY = int(DisplayHeight * 0.2)
 
 
'position des écritures « position pointeur »
    XLigneAffichage = int(WindowWidth * 0.05)
    YLigneAffichage = int(WindowHeight * 0.05)
 
'position et dimension des zones dans lesquelles on devra détecter la souris
'   on définit ici le point supérieur gauche et le point inférieur droit de la zone
'   axes de référence : bords droit et haut de la fenêtre

    Zone1XHautGauche = int(WindowWidth * 0.3)
    Zone1YHautGauche = int(WindowHeight * 0.3)
    Zone1XBasDroite = Zone1XHautGauche + int(WindowWidth * 0.5)
    Zone1YBasDroite = Zone1YHautGauche + int(WindowHeight * 0.5)
    couleur1$ = "darkgreen"
 
    Zone2XHautGauche = int(WindowWidth * 0.15)
    Zone2YHautGauche = int(WindowHeight * 0.11)
    Zone2XBasDroite = Zone2XHautGauche + int(WindowWidth * 0.2)
    Zone2YBasDroite = Zone2YHautGauche + int(WindowHeight * 0.15)
    couleur2$ = "red"
 
    Zone3XHautGauche = int(WindowWidth * 0.09)
    Zone3YHautGauche = int(WindowHeight * 0.36)
    Zone3XBasDroite = Zone3XHautGauche + int(WindowWidth * 0.09)
    Zone3YBasDroite = Zone3YHautGauche + int(WindowHeight * 0.02)
    couleur3$ = "blue"
 
'ouvrir la fenêtre en mode graphique (la lecture de la souris ne marche pas en mode window
'il semblerait d'ailleurs qu'il y ait un monde entre ces deux univers)
    open "souris sur zone ?" for graphics as #fenetre1
 
'affichage du texte "bougez la souris !"
    print #fenetre1, "color black"
    print #fenetre1, "down"
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage
    print #fenetre1, "\Bougez la souris !"
    print #fenetre1, "up"
 
'dessin des zones
    'zone 1
    print #fenetre1, "goto ";Zone1XHautGauche;" ";Zone1YHautGauche
    print #fenetre1, "down"
    print #fenetre1, "backcolor " + couleur1$
    print #fenetre1, "boxfilled ";Zone1XBasDroite;" ";Zone1YBasDroite
    print #fenetre1, "backcolor white"
    print #fenetre1, "up"
 
    'zone 2
    print #fenetre1, "goto ";Zone2XHautGauche;" ";Zone2YHautGauche
    print #fenetre1, "down"
    print #fenetre1, "backcolor " + couleur2$
    print #fenetre1, "boxfilled ";Zone2XBasDroite;" ";Zone2YBasDroite
    print #fenetre1, "backcolor white"
    print #fenetre1, "up"
 
    'zone 3
    print #fenetre1, "goto ";Zone3XHautGauche;" ";Zone3YHautGauche
    print #fenetre1, "down"
    print #fenetre1, "backcolor " + couleur3$
    print #fenetre1, "boxfilled ";Zone3XBasDroite;" ";Zone3YBasDroite
    print #fenetre1, "backcolor white"
    print #fenetre1, "up"
 
    print #fenetre1, "when mouseMove [souris_se_deplace]"
 
'pour fermer la fenêtre
   print #fenetre1, "trapclose [quit]"
 
'attente…
wait
 
 
'fin du programme, au cas où...
end
 
 
'******** zone des sous-programmes ********

[quit]
    'fermeture sans confirmation et par le gadget de fermeture de la fenetre
    print "[quit]"
    close #fenetre1
end
 
 
[souris_se_deplace]
 
    X = MouseX : Y = MouseY
 
    'le pointeur est-il dans la zone ?
    zone = 0
    if X > Zone1XHautGauche and X < Zone1XBasDroite and Y > Zone1YHautGauche and Y < Zone1YBasDroite then zone = 1
    if X > Zone2XHautGauche and X < Zone2XBasDroite and Y > Zone2YHautGauche and Y < Zone2YBasDroite then zone = 2
    if X > Zone3XHautGauche and X < Zone3XBasDroite and Y > Zone3YHautGauche and Y < Zone3YBasDroite then zone = 3
 
 
    select case zone
        case 0
        afficher$ = "La souris est hors-zone        "
        couleur$ = "black"
 
        case 1
        afficher$ = "La souris est dans la zone 1   "
        couleur$ = couleur1$ 
 
        case 2
        afficher$ = "La souris est dans la zone 2   "
        couleur$ = couleur2$ 
 
        case 3
        afficher$ = "La souris est dans la zone 3   "
        couleur$ = couleur3$ 
    end select
 
    'affichage de la position du pointeur et de l'information "en/hors zone"
    print #fenetre1, "color black"
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage
    print #fenetre1, "\Pos X = ";X;",  Pos Y = ";Y;"           "
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage + 20
    print #fenetre1, "color " + couleur$
    print #fenetre1, "\" + afficher$
 
wait
 
 


J'ai adapté le code pour avoir une couleur par zone, et changé le nom des limites de zones, mais ça reste encore codé en dur. Je cogite sur un programme qui accepte de me générer autant de zones que je veux. A vue de nez, ça devrait pas être trop compliqué, mais c'est pas pour aujourd'hui.

Avant, peut-être que je ferais bien d'essayer si on peut connecter une combobox volante à ce système. Une petite note pour nos lecteurs qui débarqueraient sur cette discussion : la combobox "volante" ne fait pas partie des instructions JustBasic, c'est juste une expression imagée qu'on a trouvé pour parler d'une combobox unique dont le contenu varie en fonction de l'emplacement de la souris dans la fenêtre, qui suit la fenêtre et s'affiche seulement lorsque la souris passe au-dessus d'une zone précise. (ouf ! je sais pas si je suis clair, là :lol )

Au fait, Roland, ton programme lit la position de la souris dans une fenêtre window, il va falloir que j'éclaircisse ce point car pour moi, ça n'a marché qu'à partir du moment où j'ai passé la fenetre de window à graphics. Si ça marche chez toi, c'est que le problème ne venait pas de MouseX ou MouseY, comme je le croyais au début. Une autre instruction que je n'avais pas soupçonné ? Je me souviens plus (et j'ai viré le fichier "erreur" )

Quoi qu'il en soit, toujours merci de vos suggestions.

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 13/05/2015 à 18h22

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Citation:
ton programme lit la position de la souris dans une fenêtre window

Le prog ne lis pas dans la window, mais dans la graphicbox
C'est ce que je trouve le plus pratique: une graphicbox dans une window NF
Je vais tenter de faire "voler" une combobox.
Mais je vois poindre un problème pour les changements de tableaux; car à chaque nouvel emplacement de la combo, il faudra lui affecter un tableau différent.
Je pense qu'il va falloir garder le même tableau et en changer le contenu en amont du déplacement
____________________
Roro

   
Le 13/05/2015 à 19h06

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Essai concluant. Enfin...Presque :d
la combobox vole bien, mais y a un petit soucis: Il faut détruire le combodrome au décollage et en reconstruire un pour l'atterrissage.
Because: La combobox est définie avant l'open.
C'est pas gagné.

Code VB :
 
 
'détection de souris sur plusieurs zones d'une fenêtre

'définir la fenêtre
'   (dimensions modifiées par des coefficients allant de 0 à 1 inclus)

    'dimensions de la fenêtre
    WindowWidth = int(DisplayWidth * 0.6)
    WindowHeight = int(DisplayHeight * 0.6)
 
    'position de l'angle supérieur gauche de la fenêtre sur l'écran
    UpperLeftX = int(DisplayWidth * 0.2)
    UpperLeftY = int(DisplayHeight * 0.2)
 
 
'position des écritures « position pointeur »
    XLigneAffichage = int(WindowWidth * 0.05)
    YLigneAffichage = int(WindowHeight * 0.05)
 
'position et dimension des zones dans lesquelles on devra détecter la souris
'   on définit ici le point supérieur gauche et le point inférieur droit de la zone
'   axes de référence : bords droit et haut de la fenêtre

    Zone1XHautGauche = int(WindowWidth * 0.3)
    Zone1YHautGauche = int(WindowHeight * 0.3)
    Zone1XBasDroite = Zone1XHautGauche + int(WindowWidth * 0.5)
    Zone1YBasDroite = Zone1YHautGauche + int(WindowHeight * 0.5)
    couleur1$ = "darkgreen"
 
    Zone2XHautGauche = int(WindowWidth * 0.15)
    Zone2YHautGauche = int(WindowHeight * 0.11)
    Zone2XBasDroite = Zone2XHautGauche + int(WindowWidth * 0.2)
    Zone2YBasDroite = Zone2YHautGauche + int(WindowHeight * 0.15)
    couleur2$ = "red"
 
    Zone3XHautGauche = int(WindowWidth * 0.09)
    Zone3YHautGauche = int(WindowHeight * 0.36)
    Zone3XBasDroite = Zone3XHautGauche + int(WindowWidth * 0.09)
    Zone3YBasDroite = Zone3YHautGauche + int(WindowHeight * 0.02)
    couleur3$ = "blue"
 
'ouvrir la fenêtre en mode graphique (la lecture de la souris ne marche pas en mode window
'il semblerait d'ailleurs qu'il y ait un monde entre ces deux univers)
    aa=280:bb=30
    [go]
    COMBOBOX #fenetre1.ext, array$(), [event], aa, bb, 100, 100
    open "souris sur zone ?" for graphics as #fenetre1
 
 
'affichage du texte "bougez la souris !"
    print #fenetre1, "color black"
    print #fenetre1, "down"
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage
    print #fenetre1, "\Bougez la souris !"
    print #fenetre1, "up"
 
'dessin des zones
    'zone 1
    print #fenetre1, "goto ";Zone1XHautGauche;" ";Zone1YHautGauche
    print #fenetre1, "down"
    print #fenetre1, "backcolor " + couleur1$
    print #fenetre1, "boxfilled ";Zone1XBasDroite;" ";Zone1YBasDroite
    print #fenetre1, "backcolor white"
    print #fenetre1, "up"
 
    'zone 2
    print #fenetre1, "goto ";Zone2XHautGauche;" ";Zone2YHautGauche
    print #fenetre1, "down"
    print #fenetre1, "backcolor " + couleur2$
    print #fenetre1, "boxfilled ";Zone2XBasDroite;" ";Zone2YBasDroite
    print #fenetre1, "backcolor white"
    print #fenetre1, "up"
 
    'zone 3
    print #fenetre1, "goto ";Zone3XHautGauche;" ";Zone3YHautGauche
    print #fenetre1, "down"
    print #fenetre1, "backcolor " + couleur3$
    print #fenetre1, "boxfilled ";Zone3XBasDroite;" ";Zone3YBasDroite
    print #fenetre1, "backcolor white"
    print #fenetre1, "up"
 
    print #fenetre1, "when mouseMove [souris_se_deplace]"
 
'pour fermer la fenêtre
   print #fenetre1, "trapclose [quit]"
 
'attente…
wait
 
 
'fin du programme, au cas où...
end
 
 
'******** zone des sous-programmes ********

[quit]
    'fermeture sans confirmation et par le gadget de fermeture de la fenetre
    print "[quit]"
    close #fenetre1
end
 
 
[souris_se_deplace]
 
    X = MouseX : Y = MouseY
 
    'le pointeur est-il dans la zone ?
    zone = 0
    if X > Zone1XHautGauche and X < Zone1XBasDroite and Y > Zone1YHautGauche and Y < Zone1YBasDroite then zone = 1
    if X > Zone2XHautGauche and X < Zone2XBasDroite and Y > Zone2YHautGauche and Y < Zone2YBasDroite then zone = 2
    if X > Zone3XHautGauche and X < Zone3XBasDroite and Y > Zone3YHautGauche and Y < Zone3YBasDroite then zone = 3
 
 
    select case zone
        case 0
        afficher$ = "La souris est hors-zone        "
        couleur$ = "black"
 
 
        case 1
        afficher$ = "La souris est dans la zone 1   "
        couleur$ = couleur1$ 
        close #fenetre1
        aa=300:bb=200
        goto [go]
 
        case 2
        afficher$ = "La souris est dans la zone 2   "
        couleur$ = couleur2$ 
        close #fenetre1
        aa=100:bb=50
        goto [go]
 
        case 3
        afficher$ = "La souris est dans la zone 3   "
        couleur$ = couleur3$ 
        close #fenetre1
        aa=55:bb=150
        goto [go]
    end select
 
    'affichage de la position du pointeur et de l'information "en/hors zone"
    print #fenetre1, "color black"
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage
    print #fenetre1, "\Pos X = ";X;",  Pos Y = ";Y;"           "
    print #fenetre1, "place ";XLigneAffichage;" ";YLigneAffichage + 20
    print #fenetre1, "color " + couleur$
    print #fenetre1, "\" + afficher$
 
wait
 
 
____________________
Roro

   
Le 13/05/2015 à 19h29

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Moi, je mettrais tout en texte; si tu a 5 propositions il suffit de faire des interlignes de 2 lignes
Et tout gérer à la position souris.
____________________
Roro

   
Le 13/05/2015 à 21h20

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Dans le principe, ça fonctionnerait mieux comme ça, mais il faudrait essayer de mieux contrôler le combobox...ou bien utiliser une Listbox ?

Code VB :
'détection de souris sur plusieurs zones d'une fenêtre
nomainwin
'définir la fenêtre
'   (dimensions modifiées par des coefficients allant de 0 à 1 inclus)

    'dimensions de la fenêtre
    WindowWidth = int(DisplayWidth * 0.6)
    WindowHeight = int(DisplayHeight * 0.6)
 
    'position de l'angle supérieur gauche de la fenêtre sur l'écran
    UpperLeftX = int(DisplayWidth * 0.2)
    UpperLeftY = int(DisplayHeight * 0.2)
 
 
'position des écritures « position pointeur »
    XLigneAffichage = int(WindowWidth * 0.05)
    YLigneAffichage = int(WindowHeight * 0.05)
 
'position et dimension des zones dans lesquelles on devra détecter la souris
'   on définit ici le point supérieur gauche et le point inférieur droit de la zone
'   axes de référence : bords droit et haut de la fenêtre

    Zone1XHautGauche = int(WindowWidth * 0.3)
    Zone1YHautGauche = int(WindowHeight * 0.3)
    Zone1XBasDroite = Zone1XHautGauche + int(WindowWidth * 0.5)
    Zone1YBasDroite = Zone1YHautGauche + int(WindowHeight * 0.5)
    couleur1$ = "darkgreen"
 
    Zone2XHautGauche = int(WindowWidth * 0.15)
    Zone2YHautGauche = int(WindowHeight * 0.11)
    Zone2XBasDroite = Zone2XHautGauche + int(WindowWidth * 0.2)
    Zone2YBasDroite = Zone2YHautGauche + int(WindowHeight * 0.15)
    couleur2$ = "red"
 
    Zone3XHautGauche = int(WindowWidth * 0.09)
    Zone3YHautGauche = int(WindowHeight * 0.36)
    Zone3XBasDroite = Zone3XHautGauche + int(WindowWidth * 0.09)
    Zone3YBasDroite = Zone3YHautGauche + int(WindowHeight * 0.08)
    couleur3$ = "blue"
 
'ouvrir la fenêtre en mode graphique (la lecture de la souris ne marche pas en mode window
'il semblerait d'ailleurs qu'il y ait un monde entre ces deux univers)
    aa=-480 :bb=30
    dim mots$(10,3), array$(10)
 
    graphicbox #fenetre1.gra, 20,20,WindowWidth-40,WindowHeight-60
    listbox #fenetre1.ext, array$(), [event], aa, bb, 100, 100
    OPEN "souris sur zone ?" for window_nf as #fenetre1
    #fenetre1 "trapclose [quit]"
 
'affichage du texte "bougez la souris !"
    #fenetre1.gra, "color black"
    #fenetre1.gra, "down"
    #fenetre1.gra, "place ";XLigneAffichage;" ";YLigneAffichage
    #fenetre1.gra, "\Bougez la souris !"
 
'dessin des zones
    'zone 1
    #fenetre1.gra, "place ";Zone1XHautGauche;" ";Zone1YHautGauche
    #fenetre1.gra, "backcolor " + couleur1$
    #fenetre1.gra, "boxfilled ";Zone1XBasDroite;" ";Zone1YBasDroite
 
    'zone 2
    #fenetre1.gra, "place ";Zone2XHautGauche;" ";Zone2YHautGauche
    #fenetre1.gra, "backcolor " + couleur2$
    #fenetre1.gra, "boxfilled ";Zone2XBasDroite;" ";Zone2YBasDroite
 
    'zone 3
    #fenetre1.gra, "place ";Zone3XHautGauche;" ";Zone3YHautGauche
    #fenetre1.gra, "backcolor " + couleur3$
    #fenetre1.gra, "boxfilled ";Zone3XBasDroite;" ";Zone3YBasDroite
    #fenetre1.gra, "backcolor white"
 
    #fenetre1.gra "flush : discard"
    #fenetre1.gra, "when mouseMove [souris_se_deplace]"
 
    mot$(1,1) = "Corbeau"
    mot$(2,1) = "Loup"
    mot$(3,1) = "Renard"
    mot$(4,1) = "Corbeau"
    mot$(5,1) = "Souriceau"
    mot$(6,1) = "Lion"
 
    mot$(1,2) = "perché"
    mot$(2,2) = "en fleur"
    mot$(3,2) = "déraciné"
    mot$(4,2) = "perché"
    mot$(5,2) = "feuillu"
    mot$(6,2) = "magnifique"
 
    mot$(1,3) = "alléchée"
    mot$(2,3) = "rouge vif"
    mot$(3,3) = "bleue"
    mot$(4,3) = "alléchée"
    mot$(5,3) = "puissante"
    mot$(6,3) = "sereine"
'attente…
wait
 
 
'******** zone des sous-programmes ********

[quit]
    'fermeture sans confirmation et par le gadget de fermeture de la fenetre
    print "[quit]"
    close #fenetre1
end
 
 
[souris_se_deplace]
 
    X = MouseX : Y = MouseY
    aa=-480 :bb=30
 
    'le pointeur est-il dans la zone ?
    zone = 0
    if X > Zone1XHautGauche and X < Zone1XBasDroite and Y > Zone1YHautGauche and Y < Zone1YBasDroite then zone = 1
    if X > Zone2XHautGauche and X < Zone2XBasDroite and Y > Zone2YHautGauche and Y < Zone2YBasDroite then zone = 2
    if X > Zone3XHautGauche and X < Zone3XBasDroite and Y > Zone3YHautGauche and Y < Zone3YBasDroite then zone = 3
 
 
    select case zone
      case 0
        afficher$ = "La souris est hors-zone        "
        couleur$ = "black"
 
      case 1
        afficher$ = "La souris est dans la zone 1   "
        couleur$ = couleur1$ 
        aa=Zone1XHautGauche+22
        bb=Zone1YHautGauche+22
        for m=1 to 6
          array$(m) = mot$(m,1)
        next
 
      case 2
        afficher$ = "La souris est dans la zone 2   "
        couleur$ = couleur2$ 
        aa=Zone2XHautGauche+22
        bb=Zone2YHautGauche+22
        for m=1 to 6
          array$(m) = mot$(m,2)
        next
 
      case 3
        afficher$ = "La souris est dans la zone 3   "
        couleur$ = couleur3$ 
        aa=Zone3XHautGauche+22
        bb=Zone3YHautGauche+22
        for m=1 to 6
          array$(m) = mot$(m,3)
        next
 
    end select
    #fenetre1.ext "reload"
    #fenetre1 "refresh"
 
    'affichage de la position du pointeur et de l'information "en/hors zone"
    #fenetre1.gra, "color black"
    #fenetre1.gra, "place ";XLigneAffichage;" ";YLigneAffichage
    #fenetre1.gra, "\Pos X = ";X;",  Pos Y = ";Y;"           "
    #fenetre1.gra, "place ";XLigneAffichage;" ";YLigneAffichage + 20
    #fenetre1.gra, "color " + couleur$
    #fenetre1.gra, "\" + afficher$
 
wait
 




Edité par cassiope01 Le 14/05/2015 à 11h07
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    
Le 14/05/2015 à 00h42

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Ah oui, en effet.
Je pense que le soucis, c'est de vouloir s'exonérer du "clic" qui rendrait le prog statique (entre les clics)
La lecture, et donc la gestion de l'ensemble en "continu" n'est pas évidente.
Le phénomène de la zone 3 mérite l'examen

En plus, il ne faut pas perdre de vue que le nombre d'emplacements est variable.
____________________
Roro

   
Le 14/05/2015 à 01h22

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 575
Mince, pas le temps de dire ouf !

OK pour la graphicbox, Roland, ça m'avait échappé

Merci à vous deux pour ces recherches, c'est plus sympa à plusieurs. Chez moi les combos de cassiopee papillonnent, je suppose que c'est normal et que ce sont des cycles d'affichage-désaffichage, mais j'ai testé en vitesse et je verrais plus profondément demain.

Une idée comme ça, si ça reste trop problématique de finaliser une solution à base de combobox : maintenant que je sais détecter la présence de la souris dans une zone, je devrais pouvoir réaliser un équivalent simplifié d'une combobox, dans une combo on ne fait que garder le choix (la zone) sur lequel se trouve la souris quand on fait un clic gauche.

Ce n'est peut-être pas évident, parce qu'on ouvre autant de nouvelles zones sensibles qu'il y a de choix dans la liste, et qu'il faudra neutraliser après fermeture de la liste, mais ça me semble faisable.

Peut-être que je rêve, comme souvent^^ Il est déjà bien tard.

Bonne nuit,

Christophe.
____________________
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 14/05/2015 à 08h34

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 575
Christophe:
Mince, pas le temps de dire ouf !

OK pour la graphicbox, Roland, ça m'avait échappé

Merci à vous deux pour ces recherches, c'est plus sympa à plusieurs. Chez moi les combos de cassiopee papillonnent, je suppose que c'est normal et que ce sont des cycles d'affichage-désaffichage, mais j'ai testé en vitesse et je verrais plus profondément demain.

Une idée comme ça, si ça reste trop problématique de finaliser une solution à base de combobox : maintenant que je sais détecter la présence de la souris dans une zone, je devrais pouvoir réaliser un équivalent simplifié d'une combobox, dans une combo on ne fait que garder le choix (la zone) sur lequel se trouve la souris quand on fait un clic gauche.

Ce n'est peut-être pas évident, parce qu'on ouvre autant de nouvelles zones sensibles qu'il y a de choix dans la liste, et qu'il faudra neutraliser après fermeture de la liste, mais ça me semble faisable.

Peut-être que je rêve, comme souvent^^ Il est déjà bien tard.

Bonne nuit,

Christophe.


Petit edit du lendemain : je dis "je", mais on pourrait bien dire "maintenant que nous savons détecter la présence de la souris", si on peut étudier à fond les combobox pour voir si elles sont utilisables ici, allons-y...
____________________
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 14/05/2015 à 08h37

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 575
Si on fait un "edit", le forum reproduit le message édité ???
____________________
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 14/05/2015 à 09h08

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2151
Citation:
Si on fait un "edit", le forum reproduit le message édité ???

Si tu clique sur "bloc/crayon" dans la barre de ton pseudo, la page te présente ton message que tu peux modifier.
Et en dessous tu a un bouton "modifier" à la place de "envoyer"

Concernant le code: Pour éviter le clignotement des combos, il faut réduire la zone de détection à la surface de la combo.
C'est ce qui se passe avec la zone 3.
Mais ça ne va pas être simple de faire un nombre de zones variable.
____________________
Roro

   
Le 14/05/2015 à 09h42

Libertynaute Expert

Groupe: Membre

Inscrit le: 19/02/2011
Messages: 767
Christophe:

Petit edit du lendemain : je dis "je", mais on pourrait bien dire "maintenant que nous savons détecter la présence de la souris", si on peut étudier à fond les combobox pour voir si elles sont utilisables ici, allons-y...


Non non, tu peux dire "je" puisque Roland et moi savions déjà le faire :lol

En y repensant je me demande si une LISTBOX ne serait-elle pas mieux appropriée ? mais bon, c'est presque pareil...

Je pense que la détection du passage de la souris ne devrait simplement QUE déterminer de nouvelles coordonnées au COMBOBOX ou à la LISTBOX:
- dès que de nouvelles coordonnées valident sont déterminées :
- on désactive la détection de la souris,
- on affiche la LISTBOX (après l'avoir mis à jour avec tous les paramètres liés à sa position dans la fable) tant que le joueur n'a pas sélectionné un mot dans la liste,
- puis on fait disparaitre la LISTBOX (en la positionnant en dehors de la fenêtre par exemple: voir mon dernier bout de code modifié... plus haut),
- on affiche le mot sélectionné,
- et on réactive la détection à la souris...


@Roland, je ne vois pas de différence de comportement entre la zone 3 et les autres ???
Roland:
Mais ça ne va pas être simple de faire un nombre de zones variable.

Avec ma méthode des sprites il suffit de les compter à la lecture du fichier texte pour savoir le nombre de sprites à créer... On met leur n° dans leur nom et on connaitra ainsi leur n° avec SPRITECOLLIDE Curs,list$...
Ce nombre sera d'ailleurs essentiel à connaître car il conditionnera la taille de plusieures variables tableaux : les listes de mots, les coordonnées x,y de ces listes qui sont aussi celles des zones pour la souris, etc...

Bonne journée

Gilles.



Edité par cassiope01 Le 14/05/2015 à 10h50
____________________
Devise Shadocks : "Mieux vaut mobiliser son intelligence pour des conneries, que mobiliser sa connerie pour des choses intelligentes"
Coluche disait : "C'est parce que la vitesse de la lumière est plus rapide que celle du son que certains peuvent paraîtrent brillants jusqu'à ce qu'ils ouvrent la bouche."

Web    

 |  |

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