Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Zones sensitives sur un objet Panoramic Ven 3 Fév 2012 - 1:10 | |
| J'ai fait, en Panoramic pur, un moyen de rendre certaines zones d'un objet Panoramic "sensibles" à un clic gauche de la souris, permettant de générer un évènement Panoramic donnant l'identification de la zone clickée. Le début du code contient la doc complète. Voici le code: - Code:
-
' ZonesSensitives.bas
' (Note: quelque fois, ZS est utilisé pour signifier "Zone Sensitive")
' Ce module peut travailler sur les objets Panoramic suivants: ' picture scene2d memo edit button container ' Cette liste n'est pas exhaustive. Mais cela permet déjà de voir quelques ' applications intéressantes: ' exclure certaines parties d'un SCENE2D du clic de souris ' différencier des colonnes (!) dans un mémo ' définir des zones réactives sur une carte géographique ' etc.
' Ce module permet de définir des zones sensitives sur un objet Panoramic. ' L'objet ciblé est désigne par ZS_n (ZoneSensitive n). ' Une zone sensitive est définie par son numéro d'objet, les coordonnées ' du coin en haut à gauche et du coin en bas à droite, ainsi que d'un ' identifiant numérique qu'il convient de choisir unique. ' Plusieurs zones sensitives peuvent être actives au même moment, dans le ' même objet, ou dans plusieurs objets.
' Le programme application communique avec le package ZS via des variables ' et des sous-programmes
' Les variables d'interface sont: ' ZS_n% (entrée) numéro d'objet ciblé par le service demandé ' ZS_xy% (entrée/sortie) description de la zone sensitive ' ZS_clicked% (sortie) numéro d'objet qui a été clické ' Composition de la variable ZS_xy%: c'est un tableau de 5 cases: ' ZS_xy%(0) = x1 ZZ_xx%(1) = y1 coin en haut à gauche ' ZS_xy%(2) = x2 ZZ_xx%(3) = y2 coin en bas à droite ' ZS_xy%(4) = identifiant une valeur libre, unique pour une ZS
' Les sousprogrammes d'interface sont: ' ZS_init initialise le système ZS, crée les labels et les variables. ' Une commande "label" doit être donnée pour cette routine. ' Exemple: label ZS_init : gosub ZS_init ' ZS_ajouter ajouter une ZS au système. Les variables suivantes doivent ' être renseignées: ' ZS_n% numéro d'objet ciblé ' ZS_xy%(0) abscisse du coin en haut à gauche de la zone ' ZS_xy%(1) ordonnée du coin en haut à gauche de la zone ' ZS_xy%(2) abscisse du coin en bast à droite de la zone ' ZS_xy%(3) ordonnée du coin en bast à droite de la zone ' ZS_xy%(4) identifiant de la zone sensitive ' Si l'objet indiqué par ZS_n% n'est pas encore ciblé par ' une autre ZS, le programme déclare un évènement ' ON_CLICK ZS_click sur cet objet. Ce sera désactivé par ' les routines appropriées. ' ZS_raz: annule l'ensemble des zones sensitives ainsi que les ' routines ON_CLICK éventuelles ' ZS_signaler specifie le numéro d'un objet EDIT pour recevoir la ' notification d'un clic recevable sur une des ZS actives. ' Cet objet doit avoir un évènement ON_CHANGE qui se déclenchera ' chaque fois qu'une zone sensitive active a été cliquée. ' Et dans ce cas, cet obbjet contient l'identifiant de la ZS. ' Les variables à renseigner pour ZS_ajouter sont remplies ' avec les valeurs correspondantes à la zone sensitive, et ' la variable ZS_clicked% contient le numéro de l'objet contenant ' la zone sensitive qui a été clickée. ' ZS_desactiver désactive une zone sensitive. Pour cela, la variable ZS_n% ' doit contenir l'identifiant de la zone sensitive à désactiver. ' Cette ZS ne réagira plus au clic, mais reste mémorisée. On ' peut la réactiver par le sousprogramme ZS_activer. ' ZS_activer réactive une zone sensitive qui a été désactivée par le ' sousprogramme ZS_desactiver ' ZS_retirer retire une zone sensitive du système. La variable ZS_n% doit ' contenir son identifiant unique. Elle est complètement ' effacée et ne peut pas être réactivée par ZS_activer
' La démontration travaille avec un PICTURE 100 dont on déclare le quart ' supérieur gauche en zone sensitive avec identifiant 137, et le quart ' inférieur droit en zone sensitive avec identifiant 29. Un EDIT 101 sert ' d'objet de notification: son évèment ON_CHANGE affiche des informations ' sur un clic reçu - il faudrait placer à cet endroit le traitement ' spécifique de l'application.
' ATTENTION ! Le programme de démo inclus ici ne contient pas de sélection ' visuelle des fonctions. Une variable DEMO% est à modifier pour obtenir ' les tests suivants: ' DEMO% = 1. les deux ZS sont créées, ainsi que le lien de notification ' DEMO% = 2 la ZS 137 est désactivée ' DEMO% = 3 la ZS 137 est réactivée ' DEMO% = 4 la ZS 137 est retirée ' DEMO% = 5 on tente de réactiver la ZS 137 ' DEMO% = 6 le système est complètement remis à zéro
' programme de démo dim DEMO% : DEMO% = 1 label creer_environnement, une_zone_est_clickee
gosub creer_environnement
' *** initialiser le système des zones sensitives ' Cette ligne est à copier au début d'un programme application label ZS_init : gosub ZS_init
' *** zone sensitive id=137 sur le quart supérieur gauche d'un PICTURE ZS_n% = 100 ZS_xy%(0) = 0 : ZS_xy%(1) = 0 ZS_xy%(2) = 200 : ZS_xy%(3) = 150 ZS_xy%(4) = 137 gosub ZS_ajouter
' *** zone sensitive id=29 sur le quart inférieur droit d'un PICTURE ZS_n% = 100 ZS_xy%(0) = 200 : ZS_xy%(1) = 150 ZS_xy%(2) = 400 : ZS_xy%(3) = 300 ZS_xy%(4) = 29 gosub ZS_ajouter
' *** utiliser EDIT 101 pour signaler les clics reçus ZS_n% = 101 gosub ZS_signaler if DEMO%=1 then end
' *** désactiver ZS 137 ZS_n% = 137 gosub ZS_desactiver if DEMO%=2 then end
' ** réactiver ZS 137 ZS_n% = 137 gosub ZS_activer if DEMO%=3 then end
' ** supprimer ZS 137 ZS_n% = 137 gosub ZS_retirer if DEMO%=4 then end
' *** tenter de réactiver ZS 137 ZS_n% = 137 gosub ZS_activer if DEMO%=5 then end
' *** tout effacer gosub ZS_raz if DEMO%=6 then end end
creer_environnement: picture 100 : top 100,30 : left 100,30 : ' OK ' scene2d 100 : top 100,30 : left 100,30 : ' OK sans COLOR ' memo 100 : top 100,30 : left 100,30 : ' OK ' edit 100 : top 100,30 : left 100,30 : ' OK ' button 100 : top 100,30 : left 100,30 : ' OK sans color ' container 100 : top 100,30 : left 100,30 : ' OK sans color width 100,400 : height 100,300 if object_type(100)<>27 if object_type(100)<>2 if object_type(100)<>23 color 100,200,200,255 end_if end_if end_if edit 101 : hide 101 : on_change 101,une_zone_est_clickee form 10 : left 10,700 : top 10,30 : width 10,300 memo 11 : parent 11,10 : top 11,10 : left 11,10 : width 11,260 return une_zone_est_clickee: clear 11 item_add 11,"clic sur objet "+str$(ZS_clicked%) item_add 11," zone ("+str$(ZS_zones%(ZS_j%,2))+","+str$(ZS_zones%(ZS_j%,3))+"/"+str$(ZS_zones%(ZS_j%,4))+","+str$(ZS_zones%(ZS_j%,5))+")" item_add 11," identifiant="+str$(ZS_zones%(ZS_j%,6)) ' ************* placer ICI le code application ' ... ' ************* fin du code application return
' =================== routines su système ZS ' tout ce qui suit, est à copier dans un programme application ' ou à inclure par #INCLUDE
' *** definir les labels internes ZS_labels: label ZS_ajouter, ZS_signaler, ZS_desactiver label ZS_activer, ZS_raz, ZS_retirer label ZS_variables, ZS_click, ZS_trouver return
' *** définir les variables internes ZS_variables: dim ZS_n% : ZS_n% = 0--1 : ' numéro d'objet ciblé (-1=rien) dim ZS_xy%(4) : ' (0)=x1 (1)=y1 (2)=x2 (3)=y2 (4)=identifiant dim ZS_n_objets% : ' nombre d'objets surveillés dim ZS_objets%(50) : ' liste de sobjets surveillés dim ZS_n_zones% : ' nombre de zones ciblées dim ZS_zones%(200,6) : ' (x,0) flag actif/inactif ' (x,1) numéro d'objet à surveiller ' (x,1)=x1 (x,2)=y1 (x,3)=x2 (x,4)=y2 ' (x,6)=identifiant de zone dim ZS_clicked% : ' numéro de l'objet clické dim ZS_x%, ZS_y% : ' coordonnées d'un clic dim ZS_i%, ZS_j%, ZS_res% : ' variable de travail dim ZS_signal% : ' numéro d'objet pour signaler un clic return
' routine interface - initialiser le système ZS ZS_init: if label("ZS_labels")=0 label ZS_labels gosub ZS_labels gosub ZS_variables end_if return
' routine interface - remse à zero du système ZS ZS_raz: if ZS_n_objets%>=0 for ZS_i%=1 to ZS_n_objets% off_click ZS_objets%(ZS_i%) next ZS_i% end_if ZS_n% = 0-1 ZS_n_objets% = 0 ZS_n_zones% = 0 return ' routine interface - ajouter une zone sensitive ZS_ajouter: gosub ZS_trouver if ZS_res%=0 ZS_n_objets% = ZS_n_objets%+1 ZS_objets%(ZS_n_objets%) = ZS_n% end_if ZS_n_zones% = ZS_n_zones%+1 ZS_zones%(ZS_n_zones%,0) = ZS_n% ZS_zones%(ZS_n_zones%,1) = 1 ZS_zones%(ZS_n_zones%,2) = ZS_xy%(0) ZS_zones%(ZS_n_zones%,3) = ZS_xy%(1) ZS_zones%(ZS_n_zones%,4) = ZS_xy%(2) ZS_zones%(ZS_n_zones%,5) = ZS_xy%(3) ZS_zones%(ZS_n_zones%,6) = ZS_xy%(4) if ZS_res%=0 then on_click ZS_n%,ZS_click return ' routine interface - établir le lien vers un EDIT de signalisation ZS_signaler: if ZS_n%>0 if object_exists(ZS_n%)=1 if object_type(ZS_n%)=3 then ZS_signal% = ZS_n% end_if ZS_signal% = ZS_n% else ZS_signal% = 0 end_if return ' routine interface - désactiver une zone sensitive ZS_desactiver: if ZS_n_zones%=0 then return for ZS_i%=1 to ZS_n_zones% if ZS_zones%(ZS_i%,6)=ZS_n% ZS_zones%(ZS_i%,1) = 0 return end_if next ZS_i% return ' routine interface - réactiver une zone sensitive désactivée ZS_activer: if ZS_n_zones%=0 then return for ZS_i%=1 to ZS_n_zones% if ZS_zones%(ZS_i%,6)=ZS_n% ZS_zones%(ZS_i%,1) = 1 return end_if next ZS_i% return
' routine interface - retirer une zone sensitive ZS_retirer: if ZS_n_zones%=0 then return for ZS_i%=1 to ZS_n_zones% if ZS_zones%(ZS_i%,6)=ZS_n% if ZS_i%<ZS_n_zones% for ZS_j%=1 to ZS_i%-1 ZS_zones%(ZS_j%,0) = ZS_zones%(ZS_j%+1,0) ZS_zones%(ZS_j%,1) = ZS_zones%(ZS_j%+1,1) ZS_zones%(ZS_j%,2) = ZS_zones%(ZS_j%+1,2) ZS_zones%(ZS_j%,3) = ZS_zones%(ZS_j%+1,3) ZS_zones%(ZS_j%,4) = ZS_zones%(ZS_j%+1,4) ZS_zones%(ZS_j%,5) = ZS_zones%(ZS_j%+1,5) ZS_zones%(ZS_j%,6) = ZS_zones%(ZS_j%+1,6) next ZS_j% end_if ZS_n_zones% = ZS_n_zones% - 1 return end_if next ZS_i%
return ' routine interne - chercher un objet dans table ZS_trouver: for ZS_i%=1 to ZS_n_objets% if ZS_objets%(ZS_i%)=ZS_n% ZS_res% = ZS_i% return end_if next ZS_i% ZS_res% = 0 return ' routine interne - routine click dans un objet géré par ZS ZS_click: for ZS_i%=1 to ZS_n_objets% if clicked(ZS_objets%(ZS_i%))=1 ZS_clicked% = ZS_objets%(ZS_i%) ZS_x% = mouse_x_left_down(ZS_clicked%) ZS_y% = mouse_y_left_down(ZS_clicked%) for ZS_j%=1 to ZS_n_zones% if ZS_zones%(ZS_j%,0)=ZS_clicked% if ZS_zones%(ZS_j%,1)=1 if ZS_zones%(ZS_j%,2)<ZS_x% if ZS_zones%(ZS_j%,3)<ZS_y% if ZS_zones%(ZS_j%,4)>ZS_x% if ZS_zones%(ZS_j%,5)>ZS_y% ' message "clic sur objet "+str$(ZS_clicked%)+" zone ("+str$(ZS_zones%(ZS_j%,2))+","+str$(ZS_zones%(ZS_j%,3))+"/"+str$(ZS_zones%(ZS_j%,4))+","+str$(ZS_zones%(ZS_j%,5))+") identifiant="+str$(ZS_zones%(ZS_j%,6)) ZS_xy%(0) = ZS_zones%(ZS_j%,2) ZS_xy%(1) = ZS_zones%(ZS_j%,3) ZS_xy%(2) = ZS_zones%(ZS_j%,4) ZS_xy%(3) = ZS_zones%(ZS_j%,5) ZS_xy%(4) = ZS_zones%(ZS_j%,6) if ZS_signal%>0 then text ZS_signal%,str$(ZS_zones%(ZS_j%,6)) return end_if end_if end_if end_if end_if end_if next ZS_j% return end_if next ZS_i% return | |
|
exdragon
Nombre de messages : 601 Date d'inscription : 05/01/2012
| Sujet: Re: Zones sensitives sur un objet Panoramic Ven 3 Fév 2012 - 4:14 | |
| Lol, trop hardu pour moi En tous cas, bravo de savoir faire un truc pareil !!! | |
|
Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Zones sensitives sur un objet Panoramic Sam 4 Fév 2012 - 21:14 | |
| Encore un autre beau programme... | |
|