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 |
---|
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Un menu contextuel [résolu] Dim 7 Aoû 2016 - 15:21 | |
| Bonjour à tous ! Voila les faits, je recherchais le moyen de réaliser un menu contextuel (clic de droite). Quelque chose de simple mais efficace entièrement en Panoramic. je ne voulait pas prendre de DLL ! Je commence donc par introduire un traitement de la souris par un IF MOUSE_RIGHT_DOWN(0)=1 THEN ... Jusque là pas de problème, je réussi à mettre un pseudo menu en place avec des lignes du menu qui sont en fait des ALPHAs. Vient ensuite le moment ou j'ajoute des sous-programmes en SUB pour le traitements et là bizarrement le sous-programme appelé tourne en boucle. Certains me diront que cela vient du timer, et je répondrai que j'utilise cette façon de faire depuis un certain temps sans problème. C'est aussi la méthode employée dans GPP ! Comme nous l'avons déjà soulevé par le passé, j'incrimine plutôt la gestion de la souris et ses instructions MOUSE_RIGHT_... et autres ! Faites le test pour mieux comprendre... Avez vous une idée du problème ? - Code:
-
' -----------------------------------------------------------------------------------------------------------------
' CREATION D'UN MENU CONTEXTUEL (CLICK DE DROITE) - Dernière version du 27.08.2016 par MiNiBuG
' -----------------------------------------------------------------------------------------------------------------
' Création du menu par la SUB creation_menu_contextuel(nb%,t$)
' Vous devez passer 2 paramètres dans la SUB : ' 1 - le numéro du PANEL (nenu contextuel) ' 2 - l'ensemble des lignes de texte du menu et des icones selon les modalités suivantes :
' Pour chaque ligne du menu indiquez : ' le texte du menu suivi du caractère '/'. ' le chemin de l'icone suivi du caractère '*'. Si aucune icone, rajoutez juste le caractère "*" après '/'. ' Les lignes vides sont identifiées par '_' toujours suivi de "/*" soit les 3 caractères suivants : "_/*"
' Exemple : "ligne 1/C:\images\icone1.bmp*_/*ligne 2/*ligne 3/*"
' Lors de l'éxecution du programme, un code apparait. Il s'agit de la gestion des clicks sur le menu. ' Un simple CTRL+V dans le programme permet de coller le code pour la gestion des sous_programmes
' -----------------------------------------------------------------------------------------------------------------
LABEL menu_principal , menu_intervale
DIM nb% , t$ , click%
' Formatage des paramètres du menu contextuel t$="Ouvrir fichier/D:\BASIC\GPP\systeme\icones\02.bmp*Sauvegarder fichier/D:\BASIC\GPP\systeme\icones\03.bmp*" t$=t$+"_/*Fermer fichier/D:\BASIC\GPP\systeme\icones\04.bmp*_/*Quitter/D:\BASIC\GPP\systeme\icones\13.bmp*"
' Création du menu contextuel creation_menu_contextuel(1,t$)
TIMER 15 : ON_TIMER 15,menu_intervale
END
' Gestion du clic gauche standard (gestion des sous_programmes correspondant) menu_principal: TIMER_OFF 15 click%=NUMBER_CLICK ' Gestion des click du menu contextuel IF click%=2 OR click%=3 THEN HIDE 1 : ouvrir_fichier() : TIMER_ON 15 : RETURN IF click%=4 OR click%=5 THEN HIDE 1 : sauvegarder_fichier() : TIMER_ON 15 : RETURN IF click%=7 OR click%=8 THEN HIDE 1 : fermer_fichier() : TIMER_ON 15 : RETURN IF click%=10 OR click%=11 THEN HIDE 1 : TERMINATE TIMER_ON 15 RETURN
' Gestion du clic droit et affichage du menu contextuel (vérification à chaque seconde par le timer) menu_intervale: TIMER_OFF 15 : CAPTION 0,"Clic de droite sur cette fenêtre pour afficher le menu contextuel..." IF SHOW(1)=1 IF MOUSE_X_POSITION(0)<(LEFT(1)) OR MOUSE_X_POSITION(0)>(LEFT(1)+WIDTH(1)) OR MOUSE_Y_POSITION(0)<(TOP(1)) OR MOUSE_Y_POSITION(0)>(TOP(1)+HEIGHT(1)) THEN HIDE 1 ELSE IF MOUSE_RIGHT_DOWN(0)=1 THEN SHOW 1 : LEFT 1,MOUSE_X_RIGHT_DOWN(0)-5 : TOP 1,MOUSE_Y_RIGHT_DOWN(0)-5 END_IF TIMER_ON 15 RETURN
' Sous-programme permettant la création du menu contextuel SUB creation_menu_contextuel(nb%,t$) DIM_LOCAL pos% , menu$ , icone$ , num% , panel% , cmen$ PANEL nb% : HIDE nb% : PARENT nb%,0 : COLOR nb%,240,240,240 : panel%=nb% : num%=0 WHILE t$<>"" nb%=nb%+1 : num%=num%+1 ALPHA nb% : PARENT nb%,1 : FONT_COLOR nb%,0,0,0 : TOP nb%,num%*20-14 : FONT_SIZE nb%,9 : FONT_NAME nb%,"Segoe UI" pos%=INSTR(t$,"*") : menu$=LEFT$(t$,INSTR(t$,"/")-1) IF INSTR(t$,"/")+1=INSTR(t$,"*") : icone$="" : ELSE : icone$=MID$(t$,INSTR(t$,"/")+1,INSTR(t$,"*")-INSTR(t$,"/")-1) : END_IF t$=RIGHT$(t$,LEN(t$)-pos%) IF menu$="_" TOP nb%,num%*20-19 : WHILE TEXT_WIDTH(menu$,nb%)<WIDTH(1)-10 : menu$=menu$+"_" : LEFT nb%,5 : END_WHILE : CAPTION nb%,menu$ : INACTIVE nb% ELSE WHILE TEXT_WIDTH(menu$,nb%)<WIDTH(1)-35 : menu$=menu$+" " : LEFT nb%,30 : CAPTION nb%,menu$ : END_WHILE : ON_CLICK nb%,menu_principal IF icone$<>"" nb%=nb%+1 : PICTURE nb% : PARENT nb%,1 : LEFT nb%,4 : TOP nb%,TOP(nb%-1)-2 : WIDTH nb%,17 : HEIGHT nb%,17 : FILE_LOAD nb%,icone$ : STRETCH_ON nb% : ON_CLICK nb%,menu_principal ELSE LEFT nb%,5 END_IF ' UNE FOIS LE MENU REALISE VOUS POUVEZ SUPPRIMER LES LIGNES CI-DESSOUS ********************************** IF icone$<>"" : ' * cmen$=cmen$+"IF click%="+STR$(nb%-1)+" OR click%="+STR$(nb%)+" THEN "+TRIM$(menu$)+"()"+CHR$(13) : ' * ELSE : ' * cmen$=cmen$+"IF click%="+STR$(nb%)+" THEN "+TRIM$(menu$)+"()"+CHR$(13) : ' * END_IF : ' * ' ******************************************************************************************************* END_IF END_WHILE HEIGHT panel%,num%*20+10 ' UNE FOIS LE MENU REALISE VOUS POUVEZ SUPPRIMER LES LIGNES CI-DESSOUS ************************************************************************************** CLIPBOARD_STRING_COPY cmen$ : ' * t$="Le menu ci_dessous est dans le presse-papier."+chr$(13)+"Inserez le dans votre programme par un CTRL+V."+CHR$(13)+CHR$(13)+CLIPBOARD_STRING_PASTE$ : ' * MESSAGE t$+CHR$(13)+"Une fois le code inséré dans votre programme,"+chr$(13)+"Supprimer toutes les lignes entre ***** et *****." : ' * ' *********************************************************************************************************************************************************** END_SUB
' Execution des sous-programmes sélectionnés
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
Dernière édition par Minibug le Jeu 8 Sep 2016 - 7:27, édité 17 fois | |
| | | 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] Dim 7 Aoû 2016 - 17:38 | |
| Salut Minibug - Minibug a écrit:
- … et là bizarrement le sous-programme appelé tourne en boucle.
J’ai testé ton code et je te donne une solution qui fera que le sous-programme ne tourne plus en boucle. Ça ne résout peut-être pas le problème, mais c’est une idée comme toutes les idées de Papydall qui ne sont pas toujours efficaces ! Ajoute des RETURN après les tests IF click% = … - Code:
-
IF click%=2 THEN HIDE 1 : ouvrir_fichier() : return IF click%=3 THEN HIDE 1 : sauvegarder_fichier() : return IF click%=5 THEN HIDE 1 : fermer_fichier() : return IF click%=7 THEN HIDE 1 : TERMINATE
Tu peux aussi utiliser SELECT … CASE … END_SELECT (c’est plus élégant ! ) - Code:
-
select click% case 2 : HIDE 1 : ouvrir_fichier() : return case 3 : HIDE 1 : sauvegarder_fichier() : return case 5 : HIDE 1 : fermer_fichier() : return case 7: terminate end_select
REMARQUE: Tu peux supprimer sans crainte TIMER_INTERVAL 15,1000 puisque le timer_interval est de 1000 ms par défaut. | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Un menu contextuel [résolu] Dim 7 Aoû 2016 - 18:12 | |
| salut papydall, dans ton 1er exemple, effectivement les return peuvent être nécessaires après chaque traitement, mais peut-être pas dans ton second exemple (select case), beaucoup plus élégant, je te l'accorde, puisque après traitement d'une ligne on va directement sur le End_Select, et donc le Return. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Dim 7 Aoû 2016 - 18:18 | |
| Bonsoir à tous les deux Désolé Papydall mais ton astuce ne fonctionne pas ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Un menu contextuel [résolu] Dim 7 Aoû 2016 - 18:24 | |
| | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Dim 7 Aoû 2016 - 18:29 | |
| Non ! je viens de trouver la solution et du même coup le problème ! J'ai fais 2 menus : un pour les appels TIMER et l'autre pour les sous-programmes. Et voila... En fait le timer appelait le menu toute les secondes et exécuter le sous-programme qui contenait la valeur click%. C'est tout simple... mais il fallait y penser. Je viens de mettre le code à jour. Il permet la création d'un menu contextuel simple avec des sauts de lignes. L'affichage du menu se fait à la position du clic droit. Dès que la souris sort du menu la fenêtre est cachée. | |
| | | 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] Dim 7 Aoû 2016 - 22:03 | |
| Salut Minibug.
Bon, tu as trouvé la solution tout seul comme un grand, mais tu as utilisé l’excellente « super extra géniale » idée papydallienne du RETURN et ça marche parfaitement bien. Tu as de la chance car le RETURN n’est pas une marque déposée, donc tu ne dois rien à papydall , sauf l’apéritif peut-être après les vacances ? | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Dim 7 Aoû 2016 - 22:30 | |
| | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 8 Aoû 2016 - 14:07 | |
| Bravo Minibug!
J' ai profité d' un moment d' évasion pour tester ton code et cela fonctionne très bien.
| |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Lun 8 Aoû 2016 - 18:12 | |
| Merci, je vais continuer l'amélioration... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Sam 13 Aoû 2016 - 18:42 | |
| Je viens de mettre à jour le code. Maintenant, on a la possibilité de rajouter des icones. J'ai mis la création du menu contextuel dans une SUB pour rendre l'usage plus simple. La SUB de création du menu se lance par creation_menu_contextuel(x%,t$)x% donnera le point de départ à la numérotation des objets. x% correspondant au numéro d'objet du PANEL (fenêtre du menu contextuel).t$ correspond à l'ensemble du texte du menu et des chemins de chaque icônes. Il suffit donc d'identifier le menu en utilisant la méthode suivante : t$="Ouvrir fichier/D:\icones\02.bmp*" t$=t$+"Sauvegarder fichier/D:\icones\03.bmp*" t$=t$+"_/*" t$=t$+"Fermer fichier/D:\icones\04.bmp*" t$=t$+"_/*" t$=t$+"Quitter/D:\icones\13.bmp*"Les règles à respecter sont : Mettre le "/" après le texte du menu à afficher et avant le chemin de l'icone. Mettre le "*" à la fin du chemin. Le caractère "_" sert a insérer un ligne vide de séparation. On peut aussi créer un menu sur une seule ligne comme par exemple : t$="Ouvrir fichier/*Sauvegarder fichier/*_/*Fermer fichier/*" Il s'agit dans ce cas d'un menu sans icônes et avec un saut de ligne sur le 3eme menu. Pour terminer, les clics sont possibles à la fois sur les menus et les icônes. Les icônes étant en fait des PICTUREs adaptés au format de la ligne de texte. Voila... C'est tout pour aujourd'hui ! à bientôt pour la suite... | |
| | | bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: Un menu contextuel [résolu] Dim 14 Aoû 2016 - 19:28 | |
| Bonjour minibug, J'ai testé ton menu contextuel. Il est très bien et fonctionne super. Je l'adopte! Mais où as-tu eu ces icones? Ils m'intéressent! A bientôt... | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Dim 14 Aoû 2016 - 21:12 | |
| Bonsoir Bignono ! Ca fait plaisir de te lire. Pour les icones, certaines sont de mon cru et d'autres ont été téléchargés sur le Web mais je ne sais plus ou ? Tu peut les retrouver pour la plupart dans GPP. Je vais encore tenter quelques améliorations... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un menu contextuel [résolu] Lun 15 Aoû 2016 - 9:24 | |
| Bonjour à tous! Pas mal du tout minibug, je vais garder ça aussi ; Mais il y a un bug: si tu ne met pas d'icône, cliquer sur 'fermer fichier' me retourne 'sauvegarder fichier' dans le caption. Tu devrais t'arranger pour que dans le cas du trait, tu aies 2 numéro d'objet, ainsi tous les alphas auraient un numéro pair et toutes les icônes auraient un numéro impair. Cela simplifira la gestion du click. | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Lun 15 Aoû 2016 - 9:59 | |
| Bonjour Silverman ! Bonne idée ! je vais étudier cela... Cela dit, une fois le menu installé, c'est à toi de calculé les numéros des objets comme dans n'importe quel programme. Mais c'est vrai que si l'on prévoit une icone dans tous les cas, les numeros des objets seront plus simple à gérer. En contrepartie, on risque de créer des objets inutiles.. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un menu contextuel [résolu] Lun 15 Aoû 2016 - 13:18 | |
| J'ai remarqué que dans la toute premère version que tu avais posté, tu as eu des pb pour détecter correctement la position de la souris sur un panel qui contient des alphas. Je propose ce code que j'ai adapté à ton menu contextuel, qui résoud ça. - Code:
-
' screen to client ' silverman, janvier 2016
' variables pour les buffers dim lpPoint$ dim lpPoint_ptr%
dim tmplpPoint$ dim tmplpPoint_ptr%
' variables pour la souris dim sourisX%,sourisY%
' créer un buffer pour 2 LONG(donc 8 bytes) nuls lpPoint$=string$(8,chr$(0))
' créer un buffer pour 2 LONG(donc 8 bytes) nuls tmplpPoint$=string$(8,chr$(0))
dll_on "user32"
' construire un menu contextuel avec un panel et des alphas DATA "Ouvrir fichier" , "Sauvegarder fichier" , "_" , "Fermer fichier" ,"_" ,"Quitter" ' LABEL menu1 , menu2
DIM nb% , t$ :' , pos% , t$ , click%
full_space 0
PANEL 1 : PARENT 1,0 : LEFT 1,rnd(700) : TOP 1,rnd(500) : HEIGHT 1,124 :width 1,300 : COLOR 1,240,240,240
FOR nb%=2 to 7 ALPHA nb% : PARENT nb%,1 : FONT_COLOR nb%,0,0,0 : LEFT nb%,5 : TOP nb%,nb%*20-36 : READ t$ : 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%,nb%*20-41 : WHILE TEXT_WIDTH(t$,nb%)<WIDTH(1)-10 : t$=t$+"_" : CAPTION nb%,t$ : END_WHILE ELSE WHILE TEXT_WIDTH(t$,nb%)<WIDTH(1)-10 : t$=t$+" " : CAPTION nb%,t$ : END_WHILE CAPTION nb%,t$ END_IF NEXT nb%
' dans la barre de titre du form 0, afficher les coordonnées de la souris survolant le menu repeat position_souris() until scancode=1
TERMINATE
sub position_souris() dim_local null,x%,y% ' obtient et mémorise la position de la souris: GET_BUFFER_PTR(adr(lpPoint_ptr%),adr(lpPoint$)) :' ' récupère l'adresse réelle du buffer null=dll_call1("GetCursorPos",lpPoint_ptr%) :' obtient les coordonnées de la souris null=dll_call2("ScreenToClient",handle(1),lpPoint_ptr%) :' convertis les en coordonnées du panel ' copie les coordonnées souris contenu dans le buffer, dans les variables x% et y% READ_BUFFER_LONG(adr(x%),lpPoint_ptr%,0) READ_BUFFER_LONG(adr(y%),lpPoint_ptr%,4)
' limite les coordonnées au panel if x%>0 and y%>0 and x%<=width(1) and y%<=height(1) sourisX%=x% sourisY%=y% end_if
' affichage caption 0,"x="+str$(sourisX%)+" y="+str$(sourisY%) end_sub
sub WRITE_BUFFER_LONG(adr_destination%,buffer_position%,long%) ' LONG = 4 BYTEs ' adr_destination% = adresse destination ' long% = –2147483648 < LONG < 2147483647 poke adr_destination%+buffer_position%,peek(adr(long%)) poke adr_destination%+1+buffer_position%,peek(adr(long%)+1) poke adr_destination%+2+buffer_position%,peek(adr(long%)+2) poke adr_destination%+3+buffer_position%,peek(adr(long%)+3) end_sub
sub READ_BUFFER_LONG(adr_destination%,adr_source%,buffer_position%) ' LONG = 4 BYTEs ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un LONG, –2147483648 < LONG < 2147483647 poke adr_destination%,peek(adr_source%+buffer_position%) poke adr_destination%+1,peek(adr_source%+1+buffer_position%) poke adr_destination%+2,peek(adr_source%+2+buffer_position%) poke adr_destination%+3,peek(adr_source%+3+buffer_position%) end_sub
sub GET_BUFFER_PTR(adr_destination%,adr_source%) ' retrouve l'adresse du pointeur poke adr_destination%,peek(adr_source%) poke adr_destination%+1,peek(adr_source%+1) poke adr_destination%+2,peek(adr_source%+2) poke adr_destination%+3,peek(adr_source%+3) 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] Lun 15 Aoû 2016 - 13:57 | |
| Oui mais non !!! Je voulais faire un menu sans aucune dll comme je l'ai dit dès le premier post. Sinon j'aurai utilisé la dll de Klaus ou il y a tout ce dont j'ai besoin... dommage ! | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Sam 20 Aoû 2016 - 15:03 | |
| Bonjour à tous et bon weekend ! Je continu l'amélioration du code sur le menu contextuel. J'ai suivi les conseils de Silverman, en ajoutant un message qui permet la récupération du menu dans le presse papier. En fait dès que votre menu contextuel est construit correctement, vous avez un message qui vous indique que vous pouvez par un CTRL+V insérer les lignes du menu. A ce moment là, il ne vous reste plus qu'a insérer ces lignes par le CTRL+V et supprimer les lignes repérées dans le programme qui sont maintenant inutiles. Comme cela, vous n'avez plus à vous tracasser des numéros des objets du menu... Le code tout au début du post est à jour ! A bientôt pour la suite... | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un menu contextuel [résolu] Sam 20 Aoû 2016 - 17:01 | |
| dans la SUB creation_menu_contextuel, essaye ça: - Code:
-
IF menu$="_" TOP nb%,num%*20-19 : WHILE TEXT_WIDTH(menu$,nb%)<WIDTH(1)-10 : menu$=menu$+"_" : LEFT nb%,5 : END_WHILE : CAPTION nb%,menu$ : inactive nb% c'est plus esthétique je trouve | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Sam 20 Aoû 2016 - 18:33 | |
| Excellente idée Silverman ! Je viens de corrigé. Le CAPTION dans la boucle WHILE / END-WHILE n'avait aucun intérêt et je n'avais pas pensé à l'instruction INACTIVE... Il est vrai que je passe peu de temps sur Panoramic actuellement et ce topic est l'occasion pour moi de me donné un peu d'entrain. J'ouvre très peu mon éditeur et mon cerveau est plutôt au ralentit ! | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Sam 27 Aoû 2016 - 15:39 | |
| Bonjour a tous ! Je suis toujours dans mon menu contextuel et j'améliore petit à petit la procédure. la semaine dernière suite à la proposition de Silverman, j'ai rajouté la création automatique du code pour le menu de gestion. Il vous offre toute la gestion des clicks sur un plateau par un simple CTRL+V à insérer dans votre programme. Le nom des procédures (SUB) corresponds au texte du menu. Le code sur le premier post est mis à jour. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un menu contextuel [résolu] Sam 27 Aoû 2016 - 17:00 | |
| Voici un code dérivé du menu contextuel, et je suis confronté à un problème; bien que logique, il ne peut pas fonctionner. Je ne trouve pas de soultion. Quelqu'un a une idée? - Code:
-
' But: ' trouver un algorithme pour déterminer à coup sûr que la souris est bien dans le panel ' 3 contraintes: ' 1) pas de dll ' 2) le panel 101 doit être cliquable ' 3) le timer ne doit pas être inférieur à 50 dim dans_le_menu% dim souris0X% , souris0Y% , cpt%
label menu2 , menu1
panel 101 : top 101,200 : left 101,200 : on_click 101,menu1
TIMER 15 : ON_TIMER 15,menu2 timer_interval 15,50
' debug form 999 top 999,700 : left 999,1500 alpha 1000 : top 1000,0 : left 1000,5 : parent 1000,999 alpha 1001 : top 1001,20 : left 1001,5 : parent 1001,999 alpha 1002 : top 1002,40 : left 1002,5 : parent 1002,999 alpha 1003 : top 1003,60 : left 1003,5 : parent 1003,999 alpha 1004 : top 1004,80 : left 1004,5 : parent 1004,999 alpha 1005 : top 1005,100 : left 1005,5 : parent 1005,999 alpha 1006 : top 1006,120 : left 1006,5 : parent 1006,999 picture 1010 : parent 1010,999 : left 1010,200 :2d_target_is 1010 : ' picture qui indique si on est dans le panel par changement de couleur
END
menu2: timer_off 15 ' souris0X%=MOUSE_X_POSITION(0) souris0Y%=MOUSE_Y_POSITION(0)
IF ( souris0X% < LEFT(101) ) or ( souris0X% > (LEFT(101)+WIDTH(101)) ) or ( souris0Y% < TOP(101) ) or ( souris0Y% > (TOP(101)+HEIGHT(101)) ) dans_le_menu%=0 else dans_le_menu%=1 end_if
' debug ' if dans_le_menu%=1 color 1010,0,255,0 :' vert, on est dans le panel else color 1010,255,0,0 :' rouge, on y est pas end_if ' caption 1001,str$(mouse_x_position(0)) ' caption 1002,str$(mouse_y_position(0)) caption 1003,str$(mouse_x_position(101)) ' caption 1004,str$(mouse_y_position(101)) caption 1005,str$(LEFT(101)) caption 1006,str$(LEFT(101)+WIDTH(101)) timer_on 15 return menu1: cpt%=cpt%+1 caption 0,"panel 101 cliqué "+str$(cpt%)+" fois" return
Dernière édition par silverman le Sam 27 Aoû 2016 - 18:46, édité 2 fois | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu contextuel [résolu] Sam 27 Aoû 2016 - 17:44 | |
| Bonjour Silverman ! Voila ce que je peut te proposer : - Code:
-
dim souris0X% , souris0Y% , souris101X% , souris101Y% , cpt%
label menu2 , menu1
panel 101 : top 101,200 : left 101,200 : on_click 101,menu1
TIMER 15 : timer_interval 15,300 : ON_TIMER 15,menu2
' debug form 999 : top 999,0 : left 999,700 : WIDTH 999,400 alpha 1000 : top 1000,0 : left 1000,5 : parent 1000,999 alpha 1001 : top 1001,20 : left 1001,5 : parent 1001,999 alpha 1002 : top 1002,40 : left 1002,5 : parent 1002,999 alpha 1003 : top 1003,60 : left 1003,5 : parent 1003,999 alpha 1004 : top 1004,80 : left 1004,5 : parent 1004,999 alpha 1005 : top 1005,100 : left 1005,5 : parent 1005,999 alpha 1006 : top 1006,120 : left 1006,5 : parent 1006,999 picture 1010 : parent 1010,999 : left 1010,200 :2d_target_is 1010 : ' picture qui indique si on est dans le panel par changement de couleur
END
menu2: timer_off 15 IF ( souris0X% <> MOUSE_X_POSITION(0) ) OR ( souris0Y% <> MOUSE_Y_POSITION(0) ) color 1010,255,0,0 : souris0X%=MOUSE_X_POSITION(0) : souris0Y%=MOUSE_Y_POSITION(0) END_IF
IF ( souris101X% <> MOUSE_X_POSITION(101) ) OR ( souris101Y% <> MOUSE_Y_POSITION(101) ) color 1010,0,255,0 : souris101X%=MOUSE_X_POSITION(101) : souris101Y%=MOUSE_Y_POSITION(101) END_IF
caption 1001,str$(mouse_x_position(0)) : caption 1002,str$(mouse_y_position(0)) caption 1003,str$(mouse_x_position(101)) : caption 1004,str$(mouse_y_position(101)) caption 1005,str$(LEFT(101)) : caption 1006,str$(LEFT(101)+WIDTH(101))
timer_on 15 return
menu1: cpt%=cpt%+1 caption 0,"panel 101 cliqué "+str$(cpt%)+" fois" return C'est pas encore parfait, mais c'est peut être un début. J'ai passé le TIMER a 300 milliseconde afin de ne pas effectuer trop de cycles. Et j'ai ensuite fais 2 tests. un qui vérifie la position de la souris sur le FORM avec les variables de sa précédente position. l'autre qui vérifie la position de la souris sur le PANEL avec les variables de sa précédente position. Si les variables de l'un des 2 changent, alors on est sur cet objet ! | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Un menu contextuel [résolu] Sam 27 Aoû 2016 - 18:59 | |
| Pas mal! Merci, et ça marche beaucoup mieux avec un timer à 50 ms. Ca devrait le faire voilà ce que je cherchais à imiter, c'est la version avec dll: - Code:
-
' variables pour les buffers dim lpPoint$ dim lpPoint_ptr%
dim tmplpPoint$ dim tmplpPoint_ptr%
' variables pour la souris dim sourisX%,sourisY%
' créer un buffer pour 2 LONG(donc 8 bytes) nuls lpPoint$=string$(8,chr$(0))
' créer un buffer pour 2 LONG(donc 8 bytes) nuls tmplpPoint$=string$(8,chr$(0))
dll_on "user32"
' **********************************************************************************************************************************
dim dans_le_menu% dim souris0X% , souris0Y% , souris101X% , souris101Y% , cpt%
label menu2 , menu1
panel 101 : top 101,200 : left 101,200 : on_click 101,menu1
TIMER 15 : timer_interval 15,50 : ON_TIMER 15,menu2
' debug form 999 : top 999,0 : left 999,700 : WIDTH 999,400 alpha 1000 : top 1000,0 : left 1000,5 : parent 1000,999 alpha 1001 : top 1001,20 : left 1001,5 : parent 1001,999 alpha 1002 : top 1002,40 : left 1002,5 : parent 1002,999 alpha 1003 : top 1003,60 : left 1003,5 : parent 1003,999 alpha 1004 : top 1004,80 : left 1004,5 : parent 1004,999 alpha 1005 : top 1005,100 : left 1005,5 : parent 1005,999 alpha 1006 : top 1006,120 : left 1006,5 : parent 1006,999 picture 1010 : parent 1010,999 : left 1010,200 :2d_target_is 1010 : ' picture qui indique si on est dans le panel par changement de couleur
END
menu2: timer_off 15
est_ce_dans_panel(101) ' debug ' if dans_le_menu%=1 color 1010,0,255,0 :' vert, on est dans le panel else color 1010,255,0,0 :' rouge, on y est pas end_if '
timer_on 15 return
menu1: cpt%=cpt%+1 caption 0,"panel 101 cliqué "+str$(cpt%)+" fois" return
' **********************************************************************************************************************************
sub est_ce_dans_panel(num%) dim_local null%,x%,y% ' obtient et mémorise la position de la souris: GET_BUFFER_PTR(adr(lpPoint_ptr%),adr(lpPoint$)) :' ' récupère l'adresse réelle du buffer null%=dll_call1("GetCursorPos",lpPoint_ptr%) :' obtient les coordonnées de la souris
' copie les coordonnées souris contenu dans le buffer, dans les variables x% et y% READ_BUFFER_LONG(adr(x%),lpPoint_ptr%,0) READ_BUFFER_LONG(adr(y%),lpPoint_ptr%,4) null%=dll_call2("WindowFromPoint",x%,y%) :' retrouve le handle du panel survolé
if null%=handle(num%) dans_le_menu%=1 else dans_le_menu%=0 end_if end_sub
sub WRITE_BUFFER_LONG(adr_destination%,buffer_position%,long%) ' LONG = 4 BYTEs ' adr_destination% = adresse destination ' long% = –2147483648 < LONG < 2147483647 poke adr_destination%+buffer_position%,peek(adr(long%)) poke adr_destination%+1+buffer_position%,peek(adr(long%)+1) poke adr_destination%+2+buffer_position%,peek(adr(long%)+2) poke adr_destination%+3+buffer_position%,peek(adr(long%)+3) end_sub
sub READ_BUFFER_LONG(adr_destination%,adr_source%,buffer_position%) ' LONG = 4 BYTEs ' adr_destination% = adresse destination ' adr_source% = adresse adr_source ' copie un LONG, –2147483648 < LONG < 2147483647 poke adr_destination%,peek(adr_source%+buffer_position%) poke adr_destination%+1,peek(adr_source%+1+buffer_position%) poke adr_destination%+2,peek(adr_source%+2+buffer_position%) poke adr_destination%+3,peek(adr_source%+3+buffer_position%) end_sub
sub GET_BUFFER_PTR(adr_destination%,adr_source%) ' retrouve l'adresse du pointeur poke adr_destination%,peek(adr_source%) poke adr_destination%+1,peek(adr_source%+1) poke adr_destination%+2,peek(adr_source%+2) poke adr_destination%+3,peek(adr_source%+3) 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] Sam 27 Aoû 2016 - 19:21 | |
| Oui je vois... Sinon pour faire plus simple, tu as la DLL de klaus. | |
| | | 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
| |
| |
| |