Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Nouvelle DLL: intercepter clic gauche, double et droit ! | |
| | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! Dim 29 Jan 2012 - 15:07 | |
| L'interception des évènements souris marchent aussi avec une FORM ! Et ceci avec la version de la DLL qui est déjà en distribution. En voici la démonstration: - Code:
-
' demo clickintercept objets.bas
' ce programme montre l'usage de ClickIntercept.dll ' pour tous les objets possibles.
' les objets possibles sont ceux pour lesquels on peut ' avoir un handle par la fonction handle(): ' scene3d, button, edit, memo, combo, alpha, form ' list, check, option, main_menu, sub_menu, ' movie, track_bar, scroll_bar, progress_bar, scene2d ' malgré la possibilité d'avoir un handle pour SOUND, MAIN_MENU ' OPEN_DIALOG et SAVE_DIALOG, ces objets ne sont pas utlisables ' ici car ils sont invisibles.
' Les zones spécifiques à la gestion de la DLL sont commentées. ' On peut ainsi extraire les parties obligatoires, ainsi que les ' instructions spécifiques à la gestion de certains types d'objet.
' ATTENTION: l'objet COMBO pose problème - il n'est pas utilisable ' en l'état !.
' ATTENTION: à cause d'un bug pour HANDLE() pour un ALPHA, la gestion ' de cet objet ne peut pas encore être faite !
' ATTENTION: SUB_MENU pose encore un problème qui est à l'étude !
label montrer, communs1, communs2, clickobj, cacher, close0 label gauche, double, droit, molette, mousein, mouseout, timer99 label memolistcombo, communs1bis, clickobjbis, communs3, communs1ter label communs4, clickformbouton
data "scene3d",1, "button",1, "edit",1, "memo",1, "combo",1 data "alpha",0, "form",1 data "list",1, "check",1, "option",1, "sub_menu",0 data "movie",1, "track_bar",1 data "scroll_bar",1, "progress_bar",1, "scene2d",1 data "*fini*" dim maxobj% : maxobj% = 0
dim obj%, i%, s$, res%, f_simple%, f_dedans% dim hndtab%(20)
height 0,650
' charger et afficher la liste des objets disponibles alpha 101 : top 101,20 : left 101,10 : caption 101,"Objet:" combo 102 : top 102,40 : left 102,10 repeat read s$ if s$<>"*fini*" maxobj% = maxobj% + 1 read hndtab%(maxobj%) item_add 102,s$ end_if until s$="*fini*"
' créer les boutons "Montrer" et "Cacher" mutuellement exclusifs button 103 : top 103,70 : left 103,10 : caption 103,"Montrer" on_click 103,montrer button 104 : top 104,70 : left 104,10 : caption 104,"Cacher" on_click 104,cacher : hide 104
' ceci sont les boutons d'interface avec la DLL ClickIntercept.dll. ' leur évènement ON_CLICK signale l'évènement détecté par la DLL. button 201 : hide 201 : on_click 201,gauche button 202 : hide 202 : on_click 202,double button 203 : hide 203 : on_click 203,droit button 204 : hide 204 : on_click 204,molette button 205 : hide 205 : on_click 205,mousein button 206 : hide 206 : on_click 206,mouseout
' cet EDIT sert à recevoir les coordonnées de la souris au moment du clic alpha 301 : top 301,130 : left 301,10 : caption 301,"Coordonnées:" edit 302 : top 302,130 : left 302,100 ' ce MEMO sert à montrer les évènements détectés par la DLL alpha 303 : top 303,160 : left 303,10 : caption 303,"Trace:" memo 304 : top 304,160 : left 304,100 : height 304,400
' ce timer est indispensable pour différencier les simples clics ' des doubles clics. L'intervalle peut éventuellement être raccourci. timer 99 : timer_off 99 : timer_interval 99,500 on_timer 99,timer99
' on crée tous les objets possibles, et on les cache. Les routines ' COMMUNSx serventà configurer des attributs communs à plusieurs objets. obj% = 0 scene3d 1 : hide 1 : gosub communs1 button 2 : hide 2 : gosub communs1 edit 3 : hide 3 : gosub communs1 memo 4 : hide 4 : gosub communs1 combo 5 : hide 5 : gosub communs1 alpha 6 : hide 6 : gosub communs2 form 7 : hide 7 : gosub communs1ter button 1007 : parent 1007,7 : gosub communs4 list 8 : hide 8 : gosub communs1 check 9 : hide 9 : gosub communs1 option 10 : hide 10 : gosub communs1 option 1010 : hide 1010 : gosub communs1bis sub_menu 11 : hide 11 : gosub communs3 movie 12 : hide 12 : gosub communs2 track_bar 13 : hide 13 : gosub communs2 scroll_bar 14 : hide 14 : gosub communs2 progress_bar 15 : hide 15 : gosub communs2 scene2d 16 : hide 16 : gosub communs1
' on charage la DLL dll_on "ClickIntercept.dll" ' la routine CLOSE0 servira à désactiver les interceptions de clics ' afin de ne pas perturber le système, e, sortant on_close 0,close0
' ici, on établit le lien entre les évènements (par leur ID) ' et les boutons dont la routine ON_CLICK leur sera associée. res% = dll_call2("ClickSetLink",0,0) : ' tout effacer res% = dll_call2("ClickSetLink",handle(201),1) : ' clic gauche res% = dll_call2("ClickSetLink",handle(202),2) : ' double-clic res% = dll_call2("ClickSetLink",handle(203),3) : ' clic droit ' res% = dll_call2("ClickSetLink",handle(204),3) : ' pas encore implémenté res% = dll_call2("ClickSetLink",handle(205),5) : ' souris entrante res% = dll_call2("ClickSetLink",handle(206),6) : ' souris sortante
end
' ******************* fin du programme principal *************
' ------------------- appelé en fermeture du programme ------- close0: if obj%>0 : ' est-ce qu'on a un traitement activé pour un objet ? ' si cet objet a une interception des clics, alors les désactiver if hndtab%(obj%)=1 then res% = dll_call1("ClickClearHook",handle(obj%)) end_if dll_off : ' décharger la DLL return
' ------------------- évènement timer spécial pour les double-clics --- timer99: timer_off 99 : ' couper le timer if f_simple%=1 : ' est-ce qu'on a déjà reçu un clic gauche ? f_simple% = 0 : ' oui donc on a un clic simple ! ' ***** ici, on place le traitement spécifique au simple-clic item_add 304,"DLL: clic gauche" if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%)) ' ***** fin du traitement spécifique au double-clic ' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet if instr("scene3d",s$)=0 then set_focus obj% if s$="check" if checked(obj%)=1 mark_off obj% else mark_on obj% end_if end_if ' ===== fin des traitements selon le type d'objet end_if return
' ------------------- évènement clic gauche détecté par la DLL ----- gauche: timer_off 99 : ' on coupe le timer f_simple% = f_simple% + 1 : ' on incrémente le compteur de clics gauches if f_simple%=2 : ' est-ce qu'on a déjà 2 clics ? f_simple% = 0 : ' oui, donc c'est un double-clic ! ' ***** ici, on place le traitement spécifique au double-clic item_add 304,"DLL: clic double" if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%)) ' ***** fin du traitement spécifique au double-clic ' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet if instr("scene3d",s$)=0 then set_focus obj% if s$="form" then to_foreground obj% ' ===== fin des traitements selon le type d'objets return end_if ' item_add 304,"attente" timer_on 99 return
' ------------------- évènement double clic détecté par PANORAMIC ----- double: timer_off 99 : ' on coupe le timer f_simple% = 0 : ' on remet le compteur de clics à zéro ' ***** ici, on place le traitement spécifique au double-clic item_add 304,"PANORAMIC: clic double" if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%)) ' ***** fin du traitement spécifique au double-clic ' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet if instr("scene3d",s$)=0 then set_focus obj% if s$="form" then to_foreground obj% ' ===== fin des traitements selon les objets return
' ------------------- évènement clic droit détecté par la DLL ----- droit: ' ***** ici, on place le traitement spécifique au double-clic item_add 304,"DLL: clic droit" if instr("combo,list",s$)>0 then item_add 304,"--> indexe "+str$(item_index(obj%)) ' ***** fin du traitement spécifique au clic droit ' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet if instr("scene3d",s$)=0 then set_focus obj% if s$="form" then to_foreground obj% ' ===== fin des traitements selon les objets return
' ------------------- évènement molette détecté par la DLL ----- molette: ' ***** ici, on place le traitement spécifique au double-clic item_add 304,"DLL: molette" ' ***** fin du traitement spécifique à la molette ' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet if instr("scene3d",s$)=0 then set_focus obj% if s$="form" then to_foreground obj% ' ===== fin des traitements selon les objets return
' ------------------- évènement souris entrante détecté par la DLL ----- mousein: if f_dedans%=1 then return : ' la souris est déjà dedans ? ignorer ! f_dedans% = 1 : ' mémoriser que la souris est dedans ' ***** ici, on place le traitement spécifique à l'entrée de la souris item_add 304,"DLL: souris entrée" if s$="alpha" font_color obj%,255,0,0 end_if if instr("button,scene2d,movie,track_bar,scroll_bar,progress_bar",s$)>0 height obj%,height(obj%)+2 width obj%,width(obj%)+2 if instr("movie,track_bar,scroll_bar,progress_bar",s$)=0 then font_bold obj% end_if ' ***** fin du traitement spécifique à l'entrée de la souris ' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet if instr("memo,edit,list,scene3d,combo,check",s$)>0 color obj%,220,220,255 if instr("scene3d",s$)=0 then set_focus obj% end_if if s$="form" then to_foreground obj% ' ===== fin des traitements selon le type d'objet return
' ------------------- évènement souris sortante détecté par la DLL ----- mouseout: if f_dedans%=0 then return : ' souris déjà dehors ? ignorer f_dedans% = 0 : ' mémoriser que la souris est dehors ' ***** ici, on place le traitement spécifique à la sortie de la souris item_add 304,"DLE: souris sortie" if s$="alpha" font_color obj%,0,0,0 end_if if instr("button,scene2d,movie,track_bar,scroll_bar,progress_bar",s$)>0 height obj%,height(obj%)-2 width obj%,width(obj%)-2 if instr("movie,track_bar,scroll_bar,progress_bar",s$)=0 then font_bold_off obj% end_if ' ***** fin du traitement spécifique à la sortie de la souris ' ===== ici, on trouve des traitements à effectuer selon le type d'obbjet if instr("memo,edit,list,scene3d,combo,check",s$)>0 color obj%,210,210,255 if instr("scene3d",s$)=0 then set_focus obj% end_if if s$="form" then to_foreground obj% ' ===== fin des traitements selon le type d'objet return
clickformbouton: item_add 304,"PANORAMIC: click bouton" to_foreground obj% return
' ------------------- routines de configuration des objets test --- communs1: obj% = obj% + 1 top obj%,10 left obj%,300 on_click obj%,clickobj return communs1bis: top obj%+1000,70 left obj%+1000,300 on_click obj%+1000,clickobjbis return
communs1ter: obj% = obj% + 1 top obj%,70 left obj%,500 on_click obj%,clickobj return
communs2: obj% = obj% + 1 top obj%,10 left obj%,300 return
communs3: obj% = obj% + 1 main_menu obj%+1000 parent obj%,obj%+1000 caption 11,"Sous-menu " on_click obj%,clickobj return
communs4: top obj%+1000,30 : left obj%+1000,30 : caption obj%+1000,"Cliquer ici" on_click obj%+1000,clickformbouton return ' ------------------- évènement PANORAMIC ON_CLICK des objets teste --- clickobj: item_add 304,"PANORAMIC: Click objet" return
' ------------------- évènement PANORAMIC ON_CLICK sur second OPTION --- clickobjbis: item_add 304,"PANORAMIC: Click objet" return
' -------------------désactiver objet test et cacher tout -------- cacher: hide obj% : ' cacher l'objet if s$="option" then hide obj%+1000 : ' cacher aussi la seconde option ' si l'objet peut intercepter les clics, alors déactiver l'interception if hndtab%(obj%)=1 then res% = dll_call1("ClickClearHook",handle(obj%)) ' restaurer l'écran pour pouvoir lancer un nouveau test hide 104 : show 103 obj% = 0 : f_simple% = 0 active 102 return
' -------------------charger,les objets MEM, LIST et COMBO avec quelques lignes memolistcombo: clear obj% for i%=1 to 8 item_add obj%,s$+" ligne "+str$(i%) next i% return
' -------------------montrer l'objet à tester et intercepter les clics montrer: inactive 102 s$ = trim$(item_index$(102)) : ' récupérer le nom de l'objet if s$="" then return : ' rien choisi ? obj% = item_index(102) : ' récuper le ID de l'objet choisi clear 304 : ' effacer le mémo pour la trace item_add 304,"Objet "+s$ : ' signaler le nom de l'objet f_dedans% = 0 : ' supposer "souris est dehors' ' traitements spécifiques pour tester un objet ----------------- select obj%
'---------- scene3d case 1 color obj%,210,210,255 : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- button case 2 caption obj%,"Bouton" : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- edit case 3 color obj%,210,210,255 : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- memo case 4 color obj%,210,210,255 : show obj% gosub memolistcombo res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- combo case 5 item_add 304,"+++ ne marche pas !" color obj%,210,210,255 : show obj% gosub memolistcombo res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- alpha case 6 caption obj%,"Alpha" : font_color obj%,0,0,0 : show obj% ' res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) on_click obj%,clickobj : ' car BUG sur handle() pour ALPHA ! hide 103 : show 104 '---------- form case 7 caption obj%,"Form" show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) to_foreground obj% hide 103 : show 104 ' ---------- list case 8 color obj%,210,210,255 : show obj% gosub memolistcombo res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- check case 9 color obj%,210,210,255 : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- option case 10 ' pour OPTION, une seconde option est automatiquement créée et ' affichée, avec le numéro obj%+1000, mais seule l'objet obj% ' est utilisé pour intercepter les clics par la DLL. color obj%,210,210,255 : show obj% : show obj%+1000 res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- sub_menu case 11 item_add 304,"+++ ne marche pas !" caption obj%,"Sous-menu pas de curseur" : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- movie case 12 color obj%,210,210,255 : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- track_bar case 13 show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- scroll_bar case 14 position obj%,30 : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- progress_bar case 15 position obj%,30 : show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 '---------- scene2d case 16 show obj% res% = dll_call2("ClickSetHook",handle(obj%),handle(302)) hide 103 : show 104 end_select return
Dans le combo de choix des objets, on peut choisir "form", et une nouvelle form s'affiche à droite, comportant un bouton. Tous les évènements souris sur cette form sont interceptés tant que le curseur reste dans la "zone client", à l'exclusion des bords et de la barre d'entête. Le bouton présent sur cette forme n'est pas compris non plus: dès que la souris entre dans le bouton, on signalé "sortie de la souris de l'objet surveillé", et inversement. Un clic sur le bouton déclenche l'évènement on_clic normal de Panoramic, alors qu'un clic sur la form déclenche un évènement par la DLL. | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! Dim 29 Jan 2012 - 15:45 | |
| Bonjour Klaus, Franchement, c'est extraordinaire ce que tu fais! Ta dll clickintercept, c'est du tonnerre! Je viens d'essayer ton petit programme, c'est top! Bon, moi je me demandais, un sprite ou un picture, dans un scene 2d avec les coordonnées de la souris, on peut le rendre clickable. Mais dans un scene 3d, un objet 3d comme un cube ou une sphère ou un mesh, vu qu'il y a 3 coordonnées x,y,z pour le situer dans l'espace, ça me paraît plus difficile, voir quasiment impossible à rendre clickable. Si on se déplace dans l'espace 3d et que l'on tourne autour d'un cube ou que celui-ci tourne sur lui-même sur un des 3 axes, il faudrait qu'il soit clikable. Je ne sais pas si tu saisis ma question. Cordialement | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! Dim 29 Jan 2012 - 18:30 | |
| Oh, je comprends très bien ta question. Mais je dois te renvoyer à Jack: en effet, à mon niveau, je n'ai aucun moyen de savoir quel objet 3D a été visé. Tout ce que je peux dire à mon niveau, c'est ceci: - un objet 3D peut recevoir un évènement ON_CLICK. On peut donc savoir qu'un clic a eu lieu. - dans la routine ON_CLICK, on peut utiliser MOUSE_X_LEFT_DOWN et MOUSE_Y_DOWN pour avoir les coordonnées du clic
Bien sûr, cela représente les coordonnées dans la "fenêtre de vision" que représente la SCENE3D dans le monde 3D qui se trouve derrière. En tout cas, on peut se le représenter comme suit. On peut alors édicter quelques règles, certes parfaitement artificielles, pour traiter ces coordonnées. On peut par exemple assumer qu'on touche le premier objet rencontré perpendiculairement à la SCENE3D, en respectant les coordonnées x et y. On peut aussi imaginer un pointe de fuite quelque part au loin, spécifié par des coordonnées fixes; on trouve alors l'objet sur la ligne d'intersection entre le point cliqué et le point de fuite. D'autres conventions sont possibles. A toi d'imaginer ta solution. | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! Dim 29 Jan 2012 - 21:42 | |
| Merci de ta réponse. C'est bien ce que j'avais compris. Seul Jack pourrais faire quelquechose là dessus, mais c'est pas gagné. A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! Dim 29 Jan 2012 - 22:17 | |
| Et qu'est-ce que tu penses de mon idée de projeter un axe, par exemple perpendiculairement à la surface de la SCENE3D et retenir le premier objet que cet axe rencontre ? Ce serait l'objet englobant les coordonnées (x,y) du clic de souris avec la valeur z la moins élevée ? | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! Dim 29 Jan 2012 - 22:57 | |
| Oui, tu veux faire un point de fuite à partir de la coordonées x,y pour te représenter un axe imaginaire "zp" perpendiculaire au point x,y, et dès que tu rencontres l'objet sur cet axe tu récupères la coordonée que tu peux interpolée par rapport au vrai axe z. C'est ça que tu veux faire? | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! Dim 29 Jan 2012 - 23:15 | |
| Oui et non. A mon niveau, dans la DLL, je n'au AUCUN moyen de savoir ce qu'il y a dans la SCENE3D. Pour moi, c'est juste une surface rectangulaire. C'est toi qui, à partir des coordonnées x/y d'un clic, dois effectuer cette projection pour retrouver le premier objet 3D rencontré. Tu en connais les coordonnées, et je n'ai aucun moyen d'interroger une SCENE3D pour savoir ce qu'elle a dans le ventre. Les objets 3D, tout comme les SPRITE dans un SCENE2D, un PICTURE ou un ALPHA. Ce ne sont pas des objets Windows.
Tout ce que je peux te donner (et ça marche déjà sur une SCENE3D) c'est de te donner le type d'évènement (clic gauche, clic droit, double-clic) et les coordonnées associées. Mais c'est toi qui feras le projection en direction de l'axe z à partir du point (x,y). | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| | | | Contenu sponsorisé
| Sujet: Re: Nouvelle DLL: intercepter clic gauche, double et droit ! | |
| |
| | | | Nouvelle DLL: intercepter clic gauche, double et droit ! | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |