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 |
|
|
| Menu contextuel | |
| | |
Auteur | Message |
---|
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Menu contextuel Jeu 6 Déc 2012 - 17:52 | |
| Bonsoir, A défaut de jeu (qui ont tendance à capoter à chaque fois...je sais par pourquoi... ) cela vous dis de réfléchir sur un projet commun : la création par exemple d'un système de menu contextuel ? Bignono as déjà plus ou moins proposé quelque chose mais cela peut certainement s’améliorer... Je vous donne mon idée : Un menu contextuel doit TOUJOURS se trouver au-dessus de tout autres objets... donc exit les PICTURES en direct. il faut passer peut être par un form (sans bordure) qui contiendrai un PICTURE... Le truc c'est de pouvoir aussi avoir la possibilité de rajouter des sous-menu... Ça permettrai aux novices de voir comment aborder un problème, de voir toute la démarche nécessaire AVANT d'écrire une ligne de code, etc... et pourquoi pas, de participer aussi ?... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Jeu 6 Déc 2012 - 18:02 | |
| En faisant abstraction des sous-menus, tu pourrais choisir un LIST. Créé en dernier, il sera toujours au-dessus de tout. Il y a le ON_CLICK qui donne le numéro de ligne cliquée par ITEM_INDEX(numero_de_list). | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Jeu 6 Déc 2012 - 18:07 | |
| Oui pourquoi pas le LIST... mais cela oblige d'avoir le menu contextuel DANS le formulaire. Tu me diras, c'est pas bien grave... Faut quand même que je vérifie que le LIST se retrouvera systématiquement au-dessus de tout autre objet... | |
| | | Invité Invité
| Sujet: Re: Menu contextuel Jeu 6 Déc 2012 - 18:18 | |
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Jeu 6 Déc 2012 - 18:43 | |
| Rien n'empêche de placer le LIST dans une FORM avec BORDER_SMALL (pour qu'on puisse la déplacer ou fermer). Le LIST, c'est juste pour faciliter la reconnaissance de l'option choisie. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Menu contextuel Jeu 6 Déc 2012 - 19:29 | |
| Bonne idée Nardo,
Oui le LIST dans un FORM que l'on place en premier plan avec TO_FOREGROUND
A+ | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 0:45 | |
| C'est vrai que le LIST parait bien mais tant que l'on a pas cliqué dessus, l'élément survolé n'est pas sélectionné/surligné (hover en css). Une autre solution serait peut etre de mettre un picture dans un FORM et de gérer le survol/selection comme pour une GLIST (en plus simple bien sur) Cosmos apparemment a également fait son popup à partir d'un picture dans un FORM
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 1:25 | |
| Quelque soit l'objet en Panoramic, tu ne peux gérer le survol que grâce à un timer, ce qui alourdit considérablement. J'ai fait une petite maquette, avec un menu contextuel par F1, sur la form 0 et sur le EDIT 1. La structure est préparée pour le MEMO 2 _ à compléter: - Code:
-
label key0, key1, key2, sel0, sel1, sel2
on_key_up 0,key0
edit 1 : top 1,10 : left 1,10 on_key_up 1,key1 memo 2 : top 2,40 : left 2,10 on_key_up 2,key2 end
key0: if scancode=112 then menu0() return
key1: if scancode=112 then menu1() return
key2: if scancode=112 then menu2() return
sub menu0() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,60 : width 10,80 list 11 : parent 11,10 : full_space 11 item_add 11,"Sortir" item_add 11,"Full_space" on_click 11,sel0 end_sub
sub menu1() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,60 : width 10,120 top 10,top(1)+15 : left 10,left(1)+width(1) list 11 : parent 11,10 : full_space 11 item_add 11,"Mettre en secret" item_add 11,"Mettre en normal" on_click 11,sel1 end_sub
sub menu2() end_sub
sel0: if item_index(11)=1 then terminate if item_index(11)=2 then full_space 0 return
sel1: if item_index(11)=1 then secret_on 1 if item_index(11)=2 then secret_off 1 return sel2: return
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 8:00 | |
| Bonjour, Klaus, pourquoi tu dis qu'un timer alourdi considérablement ? Si celui-ci est actif uniquement que quand le menu est affiché (c'est l'évènement du click droit qui active le timer), il n'y a pas véritablement de charge. Normalement lorsque l'on demande l'affichage d'un tel menu, il n'y a pas d'autres "taches" en cours.... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 9:27 | |
| Pourqoui ? C'est parce qu'on n'a pas d'évènement ON_RIGHT_CLICK, justement. ET il faudrait un timer pour tester en permanence si MOUSE_RIGHT_DOWN(x)=1 de tous les objets possibles pour savoir si on a fait un clic droit, et cela ne peut se faire qu'avec un timer. Tu imagines ? Toutes les 100 milli-secondes, faire ce test pour tous les objets ? Non, c'est trop lourd. Tant qu'on n'a pas de vrai évènement ON_RIGHT_CLICK, il faut utiliser ON_KEY_UP et choisir une touche quelconque (comme F1 dans mon exemple), pour l'affichage d'un menu contextuel. Par contre, on peut alors, une fois que le menu est affiché, utiliser un timer pour l'effacer, car il ne sera utilisé qu'une seule fois, puis désactivé. Voici le programme posté cette nuit, avec un timer qui fait disparaître le menu contextuel sur le EDIT, dès qu'on a cliqué sur une des options: - Code:
-
label key0, key1, key2, sel0, sel1, sel2, tmr
timer 100 : timer_off 100 : timer_interval 100,100 on_timer 100,tmr on_key_up 0,key0
edit 1 : top 1,10 : left 1,10 on_key_up 1,key1
memo 2 : top 2,40 : left 2,10 on_key_up 2,key2
end
tmr: timer_off 100 if object_exists(10)=1 then delete 10 return
key0: if scancode=112 then menu0() return
key1: if scancode=112 then menu1() return
key2: if scancode=112 then menu2() return
sub menu0() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,60 : width 10,80 list 11 : parent 11,10 : full_space 11 item_add 11,"Sortir" item_add 11,"Full_space" on_click 11,sel0 end_sub
sub menu1() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,60 : width 10,120 top 10,top(1)+15 : left 10,left(1)+width(1) list 11 : parent 11,10 : full_space 11 item_add 11,"Mettre en secret" item_add 11,"Mettre en normal" on_click 11,sel1 end_sub
sub menu2() end_sub
sel0: select item_index(11) case 1: terminate case 2 full_space 0 timer_on 100 end_select return
sel1: select item_index(11) case 1: secret_on 1 case 2: secret_off 1 end_select timer_on 100 return
sel2: return
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 10:31 | |
| Ok Klaus, je comprend... dommage qu'il n'existe pas le ON_RIGHT_CLICK... Puisque l'on est dans la proposition de code, j'ai pensé à ceci, en partant d'un evenement clavier : - Code:
-
LABEL TestKey InitConst()
LEFT 0,SCREEN_X/2 : TOP 0,SCREEN_Y/2
edit 1 : top 1,10 : left 1,10 on_key_up 1,TestKey
memo 2 : top 2,40 : left 2,10 on_key_up 2,TestKey
FORM 200:BORDER_HIDE 200: HIDE 200 :WIDTH 200,102:HEIGHT 200,Hauteur+2 PICTURE 201:PARENT 201,200:WIDTH 201,105:HEIGHT 201,Hauteur 2D_TARGET_IS 201 2D_PEN_COLOR 128,128,128 2D_LINE 100,5,100,Hauteur+1:2D_LINE 100,Hauteur+1,5,Hauteur+1 2D_PEN_COLOR 200,200,200 : 2D_RECTANGLE 0,0,100,Hauteur LABEL Test,pTime DIM x,y: ' ,x1,y1 DIM actif:actif=0 DIM s:s=0 DIM NumItem TIMER 202:TIMER_INTERVAL 202,100:ON_TIMER 202,pTime:TIMER_OFF 202
END
SUB InitConst() DIM_LOCAL w,h DIM CAPTION_HEIGHT%, BORDER_WIDTH% w=WIDTH(0):h=HEIGHT(0) HIDE 0:HEIGHT 0,0: CAPTION_HEIGHT% = height(0) ' WIDTH 0, 100: BORDER_WIDTH% = (width(0)-100)/2 : ' ca marche plus... :( BORDER_WIDTH% = 8 : ' valeur empirique (valable sous XP) WIDTH 0,w:HEIGHT 0,h SHOW 0 DIM NB_ITEM:NB_ITEM = 7 ' Hauteur de notre menu : 3px de marge haute + 3 px de marge basse DIM MargeH:MargeH=3 DIM MargeB:MargeB=3 DIM Hauteur : Hauteur = (NB_ITEM * 16)+MargeH+MargeB DIM NumObj END_SUB
TestKey: if scancode=112 NumObj=NUMBER_KEY_UP TIMER_ON 202 end_if return
pTime: IF actif = 0 x= MOUSE_X_POSITION(NumObj) : y= MOUSE_Y_POSITION(NumObj) actif = 1:ShowMenu(1) NumItem=0 ELSE ' Le menu est actif : on vérifie que l'on est toujours dedans IF MOUSE_X_POSITION(NumObj)<>x OR MOUSE_Y_POSITION(NumObj)<>y actif=0:ShowMenu(0) NumItem=0 TIMER_OFF 202 ELSE ' on redessine seulement le menu si l'item pointé n'est plus le même IF MOUSE_Y_POSITION(201)> (NumItem*16)+MargeH THEN DrawMenu() IF MOUSE_Y_POSITION(201)< ((NumItem-1)*16)+MargeH THEN DrawMenu() TIMER_ON 202 END_IF END_IF CAPTION 0,STR$(NumItem) RETURN
Test: CreateMenu() RETURN
SUB ShowMenu(s) LEFT 200,LEFT(0)+LEFT(NumObj)+x-10 TOP 200,TOP(0)+TOP(NumObj)+y+CAPTION_HEIGHT%-BORDER_WIDTH% IF s=1 SHOW 200 ELSE HIDE 200 END_IF END_SUB
SUB DrawMenu() DIM_LOCAL i,y PRINT_TARGET_IS 201 FOR i=1 TO NB_ITEM y=((i-1)*16)+MargeH PRINT_LOCATE 15,y IF MOUSE_Y_POSITION(201)>=y AND MOUSE_Y_POSITION(201)<y+16 NumItem=i 2d_fill_color 49,106,197 : 2d_pen_color 49,106,197 font_color 201,255,255,255 ELSE 2d_fill_color 255,255,255 : 2d_pen_color 255,255,255 font_color 201,0,0,0 END_IF 2d_rectangle 3,y,100-3,y+16 PRINT " Item ";i NEXT i PRINT_TARGET_IS 0 END_SUB Ce que je n'aime pas dans le code ci-dessus, c'est le bidouillage pour faire disparaitre le menu. J'ai regardé les différentes tentative à ce sujet, et rien ne m'a vraiment convaincu : il reste toujours un form planqué derrière un autre... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 11:11 | |
| Regarde le source que j'ai posté ci-dessus. La form ne reste pas.
Le problème, c'est qu'on ne peut pas supprimer une form dans une routine d'évènement appartenant à cette même form. C'est pourquoi je déclenche un timer qui s'en charge, indépendamment de la routine évènement appelée lors du clic. Et ça marche. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 11:45 | |
| Oui j'ai vu ton code : pour fermer le menu, tu dois être obligé de cliquer sur un item ou de fermer "manuellement" le FORM. Mais ce n'est pas tout à fait le comportement d'un menu contextuel... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 11:57 | |
| Alors là, c'est simple : - Code:
-
label key0, key1, key2, sel0, sel1, sel2, tmr, tmr1
timer 100 : timer_off 100 : timer_interval 100,100 on_timer 100,tmr timer 101 : timer_off 101 : timer_interval 101,2500 on_timer 101,tmr1 on_key_up 0,key0
edit 1 : top 1,10 : left 1,10 on_key_up 1,key1
memo 2 : top 2,40 : left 2,10 on_key_up 2,key2
end
tmr: timer_off 100 if object_exists(10)=1 then delete 10 return
tmr1: timer_off 101 if object_exists(10)=1 then delete 10 return
key0: if scancode=112 then menu0() return
key1: if scancode=112 then menu1() return
key2: if scancode=112 then menu2() return
sub menu0() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,60 : width 10,80 list 11 : parent 11,10 : full_space 11 item_add 11,"Sortir" item_add 11,"Full_space" on_click 11,sel0 timer_on 101 end_sub
sub menu1() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,60 : width 10,120 top 10,top(1)+15 : left 10,left(1)+width(1) list 11 : parent 11,10 : full_space 11 item_add 11,"Mettre en secret" item_add 11,"Mettre en normal" on_click 11,sel1 timer_on 101 end_sub
sub menu2() end_sub
sel0: select item_index(11) case 1: terminate case 2 full_space 0 timer_on 100 end_select return
sel1: select item_index(11) case 1: secret_on 1 case 2: secret_off 1 end_select timer_on 100 return
sel2: return
Le menu se referme tout seul, s'il n'est pas utilisé ! | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 12:57 | |
| | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 13:03 | |
| Je laisse pas tombé Jean-Claude Je ne contredit Klaus pour le plaisir de le contredire... (et j'espère qu'il ne le voit pas comme cela) Quand il y a des arguments convaincants, je suis tout à fait prêt de les accepter. C'est ce qui fait progresser les choses et apporte des éléments de discussion intéressants... Sachant que pour un problème donné, il existe plusieurs solutions; débattre sur le bien fondé de telle ou telle solution est toujours enrichissant. J'aimerai que d'autres personnes apportent leur avis/leurs idées également, c'est un peu le but de ce topic... PS: J'ai pas encore regardé ton code Klaus... | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 13:11 | |
| Bien sur je suis d'accord, il ne faut pas laisser tomber. C'était juste une plaisanterie pour souligner la rapidité et l’efficacité des réponses de Klaus.
Je reste attentif pour la suite car une routine de "menu contextuel" sera une grande chose pour nous tous.
A+
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 13:46 | |
| ah ah, cette ruse de sioux ! A ta solution Klaus, je rajouterai bien un réarmement du timer 101 lorsque l'on bouge la souris sur la list 11... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 13:59 | |
| Ah, ça serait super ! Malheureusement, on n'a pas d'évènements ON_MOUSE_MOVE, ON_MOUSE_IN ou ON_MOUSE_OUT. En en revient au problème initial: pour faire cela, il faudrait un timer permanent dont l'évènement scrute la position de la souris pour éventuellement déclencher une action ! Avec tous les conflits que cela peut apporter avec d'autres timers au niveau d'une application, etc. C'est pourquoi mon timer 101, dimensionné à 2,5 secondes, est un compromis, et en fonction des besoins, on peut faire varier ce délai. Et lorsqu'on clique sur une ligne, le timer 100 est activé qui supprime le menu de toutes façons. D'ailleurs, pourquoi ne par faire une ligne "Abandon", comme dans cet exemple: - Code:
-
label key0, key1, key2, sel0, sel1, sel2, tmr, tmr1
timer 100 : timer_off 100 : timer_interval 100,100 on_timer 100,tmr timer 101 : timer_off 101 : timer_interval 101,2500 on_timer 101,tmr1 on_key_up 0,key0
edit 1 : top 1,10 : left 1,10 on_key_up 1,key1
memo 2 : top 2,40 : left 2,10 on_key_up 2,key2
end
tmr: timer_off 100 if object_exists(10)=1 then delete 10 return
tmr1: timer_off 101 if object_exists(10)=1 then delete 10 return
key0: if scancode=112 then menu0() return
key1: if scancode=112 then menu1() return
key2: if scancode=112 then menu2() return
sub menu0() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,80 : width 10,80 list 11 : parent 11,10 : full_space 11 item_add 11,"Sortir" item_add 11,"Full_space" item_add 11,"Abandon" on_click 11,sel0 timer_on 101 end_sub
sub menu1() if object_exists(10)=1 then delete 10 form 10 : border_small 10 : height 10,80 : width 10,120 top 10,top(1)+15 : left 10,left(1)+width(1) list 11 : parent 11,10 : full_space 11 item_add 11,"Mettre en secret" item_add 11,"Mettre en normal" item_add 11,"Abandon" on_click 11,sel1 timer_on 101 end_sub
sub menu2() end_sub
sel0: select item_index(11) case 1: terminate case 2 full_space 0 timer_on 100 end_select timer_on 100 return
sel1: select item_index(11) case 1: secret_on 1 case 2: secret_off 1 end_select timer_on 100 return
sel2: return
| |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 15:16 | |
| Je comprend ta réticence vis à vis des timers mais je doute que l'on puisse s'en passer pour ce genre de chose. Tu utilises actuellement 2 timers: 1 pour fermer le FORM après une action 1 pour fermer le FORM après timeout. Les 2 font la même chose, seule la base de temps change. Je pense que dans ce que tu proposes, on peut s'en passer au moins d'un... (il faut juste redéfinir le TIMER_INTERVAL) Dans la version ci-dessous : j'utilise 2 timers: 1 Pour gérer l'affichage de l'item sélectionné 1 pour fermer le FORM sur time-out En réfléchissant un peu, je dois également pouvoir en utiliser qu'un seul. -> Ajouter un cpt dans le 1er timer (celui avec la bdt à 100ms) pour générer le timeout... - Code:
-
LABEL TestKey InitConst()
LEFT 0,SCREEN_X/2 : TOP 0,SCREEN_Y/2
edit 1 : top 1,10 : left 1,10 on_key_up 1,TestKey memo 2 : top 2,40 : left 2,10 on_key_up 2,TestKey
ALPHA 3:CAPTION 3," Sélectionnez un objet puis cliquez sur F1":TOP 3,TOP(2)+HEIGHT(2)+10
FORM 200:BORDER_HIDE 200: HIDE 200 :WIDTH 200,102:HEIGHT 200,Hauteur+2 PICTURE 201:PARENT 201,200:WIDTH 201,105:HEIGHT 201,Hauteur 2D_TARGET_IS 201 2D_PEN_COLOR 128,128,128 2D_LINE 100,5,100,Hauteur+1:2D_LINE 100,Hauteur+1,5,Hauteur+1 2D_PEN_COLOR 200,200,200 : 2D_RECTANGLE 0,0,100,Hauteur LABEL pTime,pTime2,MenuClick DIM x,y,NumItem
TIMER 202:TIMER_INTERVAL 202,100:ON_TIMER 202,pTime:TIMER_OFF 202 TIMER 203:TIMER_INTERVAL 203,2000:ON_TIMER 203,pTime2:TIMER_OFF 203 ON_CLICK 201,MenuClick END
' ------------------------------------------------------------------------------ ' ------------------------------------------------------------------------------ SUB InitConst() DIM_LOCAL w,h DIM CAPTION_HEIGHT%, BORDER_WIDTH% w=WIDTH(0):h=HEIGHT(0) HIDE 0:HEIGHT 0,0: CAPTION_HEIGHT% = height(0) BORDER_WIDTH% = 8 : ' valeur empirique (valable sous XP) WIDTH 0,w:HEIGHT 0,h SHOW 0 ' Hauteur de notre menu : 3px de marge haute + 3 px de marge basse DIM MargeH:MargeH=3 DIM MargeB:MargeB=3 DIM NB_ITEM:NB_ITEM = 7 DIM Hauteur : Hauteur = (NB_ITEM * 16)+MargeH+MargeB DIM NumObj END_SUB
TestKey: if scancode=112 NumObj=NUMBER_KEY_UP TIMER_ON 202 end_if return
MenuClick: ShowMenu(0) MESSAGE "Objet :"+STR$(NumObj)+" Click sur item "+STR$(NumItem) NumItem=0 RETURN
pTime: IF NumItem=0 x= MOUSE_X_POSITION(NumObj) : y= MOUSE_Y_POSITION(NumObj) ShowMenu(1) NumItem=0-1 ELSE ' Le menu est actif : on vérifie que l'on est toujours dedans IF x < 0 ShowMenu(0) NumItem=0 TIMER_OFF 202:TIMER_OFF 203 ELSE ' on redessine seulement le menu si l'item pointé n'est plus le même IF x> ((NumItem*16)+MargeH) AND x<(NB_ITEM*16)+MargeH THEN DrawMenu() IF x< (((NumItem-1)*16)+MargeH) AND x> MargeH THEN DrawMenu() x=MOUSE_Y_POSITION(201) TIMER_ON 202 END_IF END_IF RETURN
pTime2: x=0-1 RETURN
SUB ShowMenu(s) LEFT 200,LEFT(0)+LEFT(NumObj)+x-10 TOP 200,TOP(0)+TOP(NumObj)+y+CAPTION_HEIGHT%-BORDER_WIDTH% IF s=1 SHOW 200 ELSE HIDE 200:TIMER_OFF 202:TIMER_OFF 203 END_IF END_SUB
SUB DrawMenu() DIM_LOCAL i,y TIMER_OFF 203 PRINT_TARGET_IS 201 FOR i=1 TO NB_ITEM y=((i-1)*16)+MargeH PRINT_LOCATE 15,y IF MOUSE_Y_POSITION(201)>=y AND MOUSE_Y_POSITION(201)<y+16 NumItem=i 2d_fill_color 49,106,197 : 2d_pen_color 49,106,197 font_color 201,255,255,255 ELSE 2d_fill_color 255,255,255 : 2d_pen_color 255,255,255 font_color 201,0,0,0 END_IF 2d_rectangle 3,y,100-3,y+16 PRINT " Item ";i NEXT i PRINT_TARGET_IS 0 TIMER_ON 203 END_SUB | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 15:45 | |
| Je regarde ça de très loin depuis le boulot par ce que je ne peux pas trop analyser, mais je pense que l'on s'approche à grand pas de la solution ... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 17:08 | |
| Très joli, Nardo26 ! Ce sera difficile de trouver mieux ! | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 17:58 | |
| Merci Klaus, mais c'est encore pas très convaincant comme système : C'est saccadé et loin d'être fluide.... il y a bien une solution mais cela risque de devenir une usine à gaz: Prévoir non pas 1 image mais 3: Dessiner à l'avance le item-1 et le item+1 dans des images tampon sans compter que je ne suis pas sûr que le résultat sera flagrant... Puis il reste à faire en sorte que ces menus soient faciles à mettre en place... Je vais regarder ta méthode pour voir si on peut simplifier le code... | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Menu contextuel Ven 7 Déc 2012 - 23:55 | |
| Bonsoir à tous, Merci à Jean-Claude qui a ressorti mon code du menu contextuel dans un autre post. Et merci d'avoir ouvert un sujet sur le menu contextuel. Dans mon code, j'utilise un timer avec les évènements boutons gauche et droit de la souris pour savoir si on a cliqué sur le bouton droit de la souris. Et j'utilise un list dans lequel sont les choix possibles. Comme disait Nardo, Il est difficile voir impossible de se passer de timer pour ce genre de code. Le code de Nardo est très séduisant et je l'aime bien. J'ai donc essayé de faire un autre code pour faire un menu contextuel. Bien entendu, j'utilise toujours un timer, mais au lieu de scruter les boutons gauche et droit de la souris, j'utilise scancode pour savoir si le bouton droit de la souris a été actionné. Et au lieu d'utiliser un list, j'ai pris un grid réduit à une colone! Rien d'extraordinaire, mais ça fonctionne bien chez moi. Alors, je vous le donne: - Code:
-
dim t label clicdroit,menu,fin main_menu 1 sub_menu 2:parent 2,1:caption 2,"Menu" sub_menu 3:parent 3,2:caption 3,"Ouvrir":on_click 3,menu sub_menu 4:parent 4,2:caption 4,"Sauver":on_click 4,menu sub_menu 5:parent 5,2:caption 5,"Quitter":on_click 5,menu sub_menu 6:parent 6,1:caption 6,"Edition" sub_menu 7:parent 7,6:caption 7,"Chercher":on_click 7,menu sub_menu 8:parent 8,6:caption 8,"Remplacer":on_click 8,menu
grid 10:hide 10:width 10,124:height 10,155:bar_none 10 grid_column 10,1:grid_one_column_width 10,1,120 grid_row 10,7:grid_one_row_height 10,1,0.1 grid_write 10,2,1,"MENU CONTEXTUEL" grid_write 10,3,1,"Ouvrir":grid_write 10,4,1,"Sauver":grid_write 10,5,1,"Chercher" grid_write 10,6,1,"Remplacer":grid_write 10,7,1,"Fermer"
timer 100:timer_interval 100,1:on_timer 100,clicdroit end
menu: timer_off 100 if clicked(3)=1 then ouvrir() if clicked(4)=1 then sauver() if clicked(5)=1 then goto fin if clicked(7)=1 then chercher() if clicked(8)=1 then remplacer() timer_on 100 return
clicdroit: if scancode<>2 then return left 10,mouse_x_position(0):top 10,mouse_y_position(0) timer_off 100 show 10 while clicked(10)=0 end_while t=grid_y_to_row(10,mouse_y_position(10)):menu(t):fermer() timer_on 100 return
sub menu(t) select t case 3:ouvrir() case 4:sauver() case 5:chercher() case 6:remplacer() case 7:fermer() end_select end_sub
sub ouvrir() message "ouverture du fichier" end_sub
sub sauver() message "enregistrement du fichier" end_sub
sub chercher() message "mot à chercher" end_sub
sub remplacer() message "remplacer un mot" end_sub
sub fermer() hide 10 end_sub
fin: timer_off_all:terminate A+ | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Menu contextuel Sam 8 Déc 2012 - 0:07 | |
| Effectivement, ça marche bien.
Mais dans l'état actuel de Panoramic, impossible de se passer d'un timer (ici, timer 100), pour tester si le clic droit a été fait. Le timer est désactivé le temps du traitement d'un menu, pis réactivé après. Simple et efficace. | |
| | | Contenu sponsorisé
| Sujet: Re: Menu contextuel | |
| |
| | | | Menu contextuel | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |