FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  MembresMembres  Connexion  
Derniers sujets
» Logiciel de planétarium.
Un menu contextuel [résolu] Emptypar Pedro Sam 23 Nov 2024 - 15:50

» Un autre pense-bête...
Un menu contextuel [résolu] Emptypar Froggy One Jeu 21 Nov 2024 - 15:54

» Récupération du contenu d'une page html.
Un menu contextuel [résolu] Emptypar Pedro Sam 16 Nov 2024 - 14:04

» Décompilation
Un menu contextuel [résolu] Emptypar JL35 Mar 12 Nov 2024 - 19:57

» Un album photos comme du temps des grands-mères
Un menu contextuel [résolu] Emptypar jjn4 Mar 12 Nov 2024 - 17:23

» traitement d'une feuille excel
Un menu contextuel [résolu] Emptypar jjn4 Jeu 7 Nov 2024 - 3:52

» Aide-mémoire mensuel
Un menu contextuel [résolu] Emptypar jjn4 Lun 4 Nov 2024 - 18:56

» Des incomprèhension avec Timer
Un menu contextuel [résolu] Emptypar Klaus Mer 30 Oct 2024 - 18:26

» KGF_dll - nouvelles versions
Un menu contextuel [résolu] Emptypar Klaus Mar 29 Oct 2024 - 17:58

» instructions panoramic
Un menu contextuel [résolu] Emptypar maelilou Lun 28 Oct 2024 - 19:51

» Figures fractales
Un menu contextuel [résolu] Emptypar Marc Ven 25 Oct 2024 - 12:18

» Panoramic et Scanette
Un menu contextuel [résolu] Emptypar Yannick Mer 25 Sep 2024 - 22:16

» Editeur d étiquette avec QR évolutif
Un menu contextuel [résolu] Emptypar JL35 Lun 23 Sep 2024 - 22:40

» BUG QR Code DelphiZXingQRCode
Un menu contextuel [résolu] Emptypar Yannick Dim 22 Sep 2024 - 11:40

» fichier.exe
Un menu contextuel [résolu] Emptypar leclode Ven 20 Sep 2024 - 19:02

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Novembre 2024
LunMarMerJeuVenSamDim
    123
45678910
11121314151617
18192021222324
252627282930 
CalendrierCalendrier
Le Deal du moment : -55%
Friteuse sans huile – PHILIPS – Airfryer ...
Voir le deal
49.99 €

 

 Un menu contextuel [résolu]

Aller en bas 
+2
papydall
Minibug
6 participants
Aller à la page : 1, 2  Suivant
AuteurMessage
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 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
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 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 !  tongue
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 ! )  tongue
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.
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 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.
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 7 Aoû 2016 - 18:18

Bonsoir à tous les deux


Désolé Papydall mais ton astuce ne fonctionne pas ! drunken
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
JL35




Nombre de messages : 7112
Localisation : 77
Date d'inscription : 29/11/2007

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 7 Aoû 2016 - 18:24

Aïe !
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 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.  Wink

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.
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
papydall

papydall


Nombre de messages : 7017
Age : 74
Localisation : Moknine (Tunisie) Entre la chaise et le clavier
Date d'inscription : 03/03/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 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 ?
Revenir en haut Aller en bas
http://papydall-panoramic.forumarabia.com/
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 7 Aoû 2016 - 22:30

Laughing Laughing Laughing
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Yannick




Nombre de messages : 8635
Age : 53
Localisation : Bretagne
Date d'inscription : 15/02/2010

Un menu contextuel [résolu] Empty
MessageSujet: re   Un menu contextuel [résolu] EmptyLun 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.
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyLun 8 Aoû 2016 - 18:12

Merci, je vais continuer l'amélioration...
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 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.

Un menu contextuel [résolu] Menu_c11

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... drunken
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
bignono

bignono


Nombre de messages : 1127
Age : 67
Localisation : Val de Marne
Date d'inscription : 13/11/2011

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 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...
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyDim 14 Aoû 2016 - 21:12

Bonsoir Bignono !

Ca fait plaisir de te lire. Wink

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...
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyLun 15 Aoû 2016 - 9:24

Bonjour à tous!

Pas mal du tout minibug, je vais garder ça aussi Very Happy ; 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.
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyLun 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.. Very Happy
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyLun 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
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptyLun 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 ! Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 20 Aoû 2016 - 15:03

Bonjour à tous et bon weekend ! cheers

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... Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 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
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 20 Aoû 2016 - 18:33

Excellente idée Silverman ! cheers

Je viens de corrigé.Wink  
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 ! Laughing
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 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.

Un menu contextuel [résolu] Messag11
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 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
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 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 !
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
silverman

silverman


Nombre de messages : 970
Age : 52
Localisation : Picardie
Date d'inscription : 18/03/2015

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 27 Aoû 2016 - 18:59

Pas mal! Merci, et ça marche beaucoup mieux avec un timer à 50 ms. Ca devrait le faire Very Happy

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
Revenir en haut Aller en bas
Minibug

Minibug


Nombre de messages : 4570
Age : 58
Localisation : Vienne (86)
Date d'inscription : 09/02/2012

Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] EmptySam 27 Aoû 2016 - 19:21

Oui je vois...

Sinon pour faire plus simple, tu as la DLL de klaus. Wink
Revenir en haut Aller en bas
http://gpp.panoramic.free.fr
Contenu sponsorisé





Un menu contextuel [résolu] Empty
MessageSujet: Re: Un menu contextuel [résolu]   Un menu contextuel [résolu] Empty

Revenir en haut Aller en bas
 
Un menu contextuel [résolu]
Revenir en haut 
Page 1 sur 2Aller à la page : 1, 2  Suivant
 Sujets similaires
-
» Menu personalisé avec icones et menu contextuel
» Menu contextuel
» Menu Contextuel - Click de droite
» Créer un EXE depuis le menu contextuel de Windows
» Menu inserted twice ???

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Un problème avec PANORAMIC?-
Sauter vers: