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 |
|
|
| Un menu contextuel [résolu] | |
| | |
Auteur | Message |
---|
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: Un menu contextuel [résolu] Sam 27 Aoû 2016 - 22:16 | |
| Salut tout le monde. Toutes ces idées, tous ces codes, toutes ces remarques, etc. sont bons (bonnes), mais je ne vois pas (bien que j’eusse chaussé mes lunettes ) le lien entre le sujet « Un menu contextuel (sans bizarrerie) » et la rubrique « Un bug dans PANORAMIC ? » N’est-il pas mieux que ce soit dans « Vos sources, vos utilitaires à partager » ou bien dans « Présentation et bavardage » ? ça va, OK, je sors … | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Dim 28 Aoû 2016 - 0:08 | |
| bonsoir Papydall ! Comme tu l'as constaté dans les premiers posts ou tu as d'ailleurs participé, il y avait un dysfonctionnement dans le programme. Depuis celui-ci est corrigé. Voila le pourquoi du comment ! Maintenant si tu sors... tu sais pourquoi. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un menu contextuel [résolu] Lun 29 Aoû 2016 - 13:01 | |
| Je sais qu'il y a la dll de Klaus, mais le challenge était de le faire en panoramic pur. En voici la version final que je vais intégrer au menu contextuel: - Code:
-
dim souris0X% , souris0Y% , souris101X% , souris101Y% dim oldsouris0X% , oldsouris0Y% , oldsouris101X% , oldsouris101Y% dim mov1% , dans_le_menu% dim testa% , testb% , testc% , testd% , teste% , otestf% , testf%
dim cpt% dim debug%
label menu2 , menu1
full_space 0
panel 101 : top 101,500 : left 101,900 : on_click 101,menu1
' debug form 999 : top 999,35 : left 999,1500 : WIDTH 999,400 : height 999,400 ' for debug%=1000 to 1012 alpha debug% : top debug%,(debug%-1000)*20 : left debug%,5 : parent debug%,999 next debug% ' picture 2010 : parent 2010,999 : left 2010,200 :2d_target_is 2010 : ' picture qui indique si on est dans le panel par changement de couleur
' TIMER 15 : timer_interval 15,50 : ON_TIMER 15,menu2 END
menu2: timer_off 15
souris0X%=MOUSE_X_POSITION(0) : souris0Y%=MOUSE_Y_POSITION(0) souris101X%=MOUSE_X_POSITION(101) : souris101Y%=MOUSE_Y_POSITION(101)
if (((souris0X%-oldsouris0X%)>=0) and (souris0X%<=left(101))) testa%=1 else testa%=0 end_if
if (((souris0X%-oldsouris0X%)<=0) and (souris0X%>=(left(101)+width(101)))) testb%=2 else testb%=0 end_if
if (((souris0Y%-oldsouris0Y%)>=0) and (souris0Y%<=top(101))) testc%=4 else testc%=0 end_if
if (((souris0Y%-oldsouris0Y%)<=0) and (souris0Y%>=(top(101)+height(101)))) testd%=8 else testd%=0 end_if
' utile seulement dans le cas ou l'on deplace le panel sous la souris if (souris0X%>left(101)) and (souris0X%<(left(101)+width(101))) and (souris0Y%>top(101)) and (souris0Y%<(top(101)+height(101))) teste%=16 else teste%=0 end_if
testf%=testa%+testb%+testc%+testd%+teste%
IF ( oldsouris101X% <> souris101X% ) OR ( oldsouris101Y% <> souris101Y% ) dans_le_menu% = 1 mov1%=1 END_IF
if testf%<>otestf% if mov1%=0 or testf%=0 dans_le_menu% = 0 end_if end_if
if dans_le_menu% = 1 color 2010 , 0 , 255 , 0 else color 2010 , 255 , 0 , 0 end_if
' oldsouris0X% = souris0X% : oldsouris0Y% = souris0Y% oldsouris101X% = souris101X% : oldsouris101Y% = souris101Y% mov1%=0 otestf%=testf% timer_on 15 return
menu1: cpt%=cpt%+1 caption 0,"panel 101 cliqué "+str$(cpt%)+" fois" to_foreground 999 return Ce n'est pas idéal, car ça marche que si le form 0 est vide.
Dernière édition par silverman le Mar 30 Aoû 2016 - 11:56, édité 1 fois | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Lun 29 Aoû 2016 - 20:04 | |
| Wait and see... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un menu contextuel [résolu] Mar 30 Aoû 2016 - 21:37 | |
| Voilà! - Code:
-
' panoramic 0927i8 / windows XP ' ' menu contextuel ' ' ' ' Silverman , août 2016
' Sans dll, on ne peut pas facilement détecter si un objet qui contient des objets est survolé, ni les numéros d'objets survolés. ' ' Pour cela, la technique employé consiste à superposer 3 objets: ' 1 pour pour détecter le click et la position de la souris(objet caché) ' 1 pour afficher les objets du menu ' 1 pour détecter le numéro des objets(zonage; objet caché)
DATA "Ouvrir fichier" , "Sauvegarder fichier" , "_" , "Fermer fichier" ,"_" ,"Quitter" DATA "eod"
LABEL menu1 , menu2 , null_menu
dim souris0X% , souris0Y% , souris101X% , souris101Y% dim oldsouris0X% , oldsouris0Y% , oldsouris101X% , oldsouris101Y% dim dans_le_menu% , vers_le_panel% , old_vers_le_panel% , force_mouvement% dim click% , ne_pas_montrer% , ticks_start , pos% , oldpos% , hilite% DIM nb% , t$ , increment% , objet_valid% dim context%
full_space 0
context%=97 :' objet context%+1 et context%+2 réservés !!! panel context%+1 : hide context%+1 : width context%+1,185 : height context%+1,4+(6*20) :' hauteur pour 6 objets de 20 pixels de haut ON_CLICK context%+1,null_menu :' détecte le click et la position de la souris ' PANEL context% : parent context%,context%+1 : full_space context% : COLOR context%,240,240,240 : inactive context% :' affiche les objets picture context%+2 : parent context%+2,context%+1 : full_space context%+2 : inactive context%+2 :' detecte le numéro des objets(zonage) ' ' fabrique le menu contextuel 2d_target_is context%+2 READ t$ : nb%=context%+2 repeat nb%=nb%+1 increment%=increment%+1 ALPHA nb% : PARENT nb%,context% : FONT_COLOR nb%,0,0,0 : LEFT nb%,5 : TOP nb%,(1+increment%)*20-36 : CAPTION nb%,t$ FONT_SIZE nb%,9 : FONT_NAME nb%,"Segoe UI" ON_CLICK nb%,menu1 :' ' IF t$="_" FONT_COLOR nb%,200,200,200 : TOP nb%,(1+increment%)*20-41 : WHILE TEXT_WIDTH(t$,nb%)<WIDTH(context%)-10 : t$=t$+"_" : END_WHILE : CAPTION nb%,t$ : inactive nb% objet_valid%=0 ELSE WHILE TEXT_WIDTH(t$,nb%)<WIDTH(context%)-10 : t$=t$+" " : CAPTION nb%,t$ : END_WHILE objet_valid%=1 END_IF ' ' fabrique les zones de click 2d_fill_color bin_and(nb%,255),bin_and(nb%,65280)/256,objet_valid% : 2d_pen_color bin_and(nb%,255),bin_and(nb%,65280)/256,objet_valid% :' transforme les numéros d'objet en code couleur 2d_rectangle 5 , 0+(increment%-1)*20 , width(context%+2)-3 , 0-0+(increment%*20) ' READ t$ until lower$(t$)="eod"
CAPTION 0,"Clic de droite sur cette fenêtre pour afficher le menu contextuel..."
TIMER 15 : ON_TIMER 15,menu2 timer_interval 15,50 :' 20 fois par seconde
END ' ##############################################################################
menu1: TIMER_OFF 15
click%=number_click ' 1ère ligne = context%+3 = 100 IF click%=100 : ouvrir_fichier() : end_if IF click%=101 : sauvegarder_fichier() : end_if IF click%=103 : fermer_fichier() : end_if IF click%=105 : TERMINATE : end_if
TIMER_ON 15 RETURN
menu2: TIMER_OFF 15 ' test de la souris pour déterminer si elle est dans le panel souris0X%=MOUSE_X_POSITION(0) : souris0Y%=MOUSE_Y_POSITION(0) ' if show(context%+1)=0 dans_le_menu% = 0 else ' souris101X%=MOUSE_X_POSITION(context%+1) : souris101Y%=MOUSE_Y_POSITION(context%+1) ' ' dans le cas ou l'on fait apparaitre le panel sous la souris: if (souris0X%>left(context%+1)) and (souris0X%<(left(context%+1)+width(context%+1))) and (souris0Y%>top(context%+1)) and (souris0Y%<(top(context%+1)+height(context%+1))) :' par defaut, serait-on dans le panel? vers_le_panel%=1 :' on vient de cliquer droit, donc on est dedans else if (((souris0X%-oldsouris0X%)>=0) and (souris0X%<=left(context%+1))) or (((souris0X%-oldsouris0X%)<=0) and (souris0X%>=(left(context%+1)+width(context%+1)))) or (((souris0Y%-oldsouris0Y%)>=0) and (souris0Y%<=top(context%+1))) or (((souris0Y%-oldsouris0Y%)<=0) and (souris0Y%>=(top(context%+1)+height(context%+1)))) :' ou bien s'en approche t-on? vers_le_panel%=1 :' oui, on s'en approche(c'est aussi l'état par défaut de la souris si elle ne bouge pas) else vers_le_panel%=0 :' non, on s'en éloigne end_if end_if ' IF ( oldsouris101X% <> souris101X% ) OR ( oldsouris101Y% <> souris101Y% ) :' y a t-il un mouvement sur le panel? dans_le_menu% = 1 :' oui, alors par défaut, on est dans le menu END_IF ' if vers_le_panel%<>old_vers_le_panel% :' y a t-il eu un mouvement en dehors du panel? if vers_le_panel%=0 :' si on s'éloigne dans_le_menu% = 0 :' c'est qu'on est en dehors end_if end_if end_if
' action si dans le panel if dans_le_menu% = 1 ne_pas_montrer%=0 objet_valid% = color_pixel_blue( context%+2,mouse_x_position(context%+1),mouse_y_position(context%+1) ) ' if objet_valid%=1 :' est-ce un numéro d'objet valide? pos%=color_pixel_red(context%+2,mouse_x_position(context%+1),mouse_y_position(context%+1))+(color_pixel_green(context%+2,mouse_x_position(context%+1),mouse_y_position(context%+1))*256) :' oui, retrouve le ' if oldpos%<>pos% or hilite%=0 :' allume le surlignage hilite%=1 if oldpos%=0 then oldpos%=pos% :' au 1er click droit, oldpos% peut être égal à 0 SI objet_valid% = 0 !! COLOR oldpos%,240,240,240 : font_color oldpos%,0,0,0 COLOR pos%,49,106,197 : font_color pos%,255,255,255 oldpos%=pos% end_if else :' le numero d'objet est invalide ' if hilite%=1 :' éteint le surlignage hilite%=0 COLOR pos%,240,240,240 : font_color pos%,0,0,0 end_if end_if else :' on est pas dans le menu ' if hilite%=1 :' éteint le surlignage hilite%=0 COLOR pos%,240,240,240 : font_color pos%,0,0,0 end_if ' if ne_pas_montrer%=0 :' démarre un chronomètre ticks_start=NUMBER_TICKS ne_pas_montrer%=1 end_if ' if NUMBER_TICKS>(ticks_start+500) :' le temps d'affichage est dépassé, cache le menu if show(context%+1)=1 : hide context%+1 : end_if end_if end_if
' le click droit IF MOUSE_RIGHT_DOWN(0)=1 force_mouvement%=1-force_mouvement% :' forcer un mouvement du panel pour rafraichir les coordonnées de la souris(celles sur le panel) ' if (souris0X%+width(context%+1)) >= width(0) :' ne pas dépasser la largeur du form 0 left context%+1,width(0)-width(context%+1)-10+force_mouvement% else LEFT context%+1,MOUSE_X_RIGHT_DOWN(0)-10+force_mouvement% end_if ' if (souris0Y%+height(context%+1)+35) >= height(0) :' ne pas dépasser la hauteur du form 0 top context%+1,height(0)-height(context%+1)-35+force_mouvement% else TOP context%+1,MOUSE_Y_RIGHT_DOWN(0)-10+force_mouvement% end_if ' SHOW context%+1 pause 20 :' laisser passer du temps pour que la souris puisse correctement détecter le panel objet_valid% = color_pixel_blue( context%+2,mouse_x_position(context%+1),mouse_y_position(context%+1) ) :' est-ce un numéro d'objet valide? ' if objet_valid% = 1 :' si ce qui est sous la souris peut être surligné, alors... pos%=color_pixel_red(context%+2,mouse_x_position(context%+1),mouse_y_position(context%+1))+(color_pixel_green(context%+2,mouse_x_position(context%+1),mouse_y_position(context%+1))*256) :' retrouve le numéro d'objet sous la souris if oldpos%=0 then oldpos%=pos% COLOR oldpos%,240,240,240 : font_color oldpos%,0,0,0 :' éteint l'ancien surlignage COLOR pos%,49,106,197 : font_color pos%,255,255,255 :' surligne ce qui est sous la souris oldpos%=pos% end_if end_if
' met à jour les variables oldsouris0X% = souris0X% : oldsouris0Y% = souris0Y% oldsouris101X% = souris101X% : oldsouris101Y% = souris101Y% old_vers_le_panel%=vers_le_panel% TIMER_ON 15 RETURN
null_menu: if objet_valid%=1 :' est-ce un numéro d'objet valide? trigger_click pos% :' on simule un click en envoyant le numéro caché sous la souris, dans la variable système NUMBER_CLICK HIDE context%+1 end_if return
SUB ouvrir_fichier() CAPTION 0,"Ouvrir fichier" END_SUB
SUB sauvegarder_fichier() CAPTION 0,"Sauvegarder fichier" END_SUB
SUB fermer_fichier() CAPTION 0,"Fermer fichier" END_SUB
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Mar 30 Aoû 2016 - 22:46 | |
| Bravo Silverman, c'est un beau défi ! J'y avais aussi pensé mais je trouve cela trop encombrant dans un programme pour un simple menu... Mais le principal est là, c'est possible en Panoramic pure et c'est le principal ! Encore Bravo ! | |
| | | Contenu sponsorisé
| Sujet: Re: Un menu contextuel [résolu] | |
| |
| | | | Un menu contextuel [résolu] | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |