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 déroulant type "Side Bar" | |
| | |
Auteur | Message |
---|
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Un menu déroulant type "Side Bar" Sam 6 Déc 2014 - 22:33 | |
| Sur les pages internet, on a souvent un menu vertical, représenté par une liste verticale de titres. Un clic sur un de ces titres décale les autres vers le bas et fait apparaître le détail des fonctions. Un autre clic sur ce titre replie le tout et retasse l'affichage. J'ai reproduit ce comportement en Panoramic pur, sans recourir à une DLL. Voici un exemple: - Code:
-
' test_menu_deroulant.bas
nouveau_menu_deroulant(100,30,30,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")
nouveau_menu_deroulant(120,30,60,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Wingdings",10,1,1,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4") ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5") ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6") ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")
nouveau_menu_deroulant(140,30,90,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption") ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")
end
' ==================================================================================== ' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE. ' Paramètres: ' no% = numéro de l'objet de base à utiliser (no% et no%+1 doivent être libres) ' x%, y% = position du coin en haut à gauche du menu* ' mr%,mg%, mb% = couleurs RGB du fond du menu ' ==================================================================================== sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%, label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if n_menus_deroulants% = n_menus_deroulants% + 1 table_menus_deroulants%(n_menus_deroulants%) = no% actuel_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,200 : height no%,25 color no%,mr%,mg%,mb% on_click no%,click_menu_deroulant end_sub
' ==================================================================================== ' Cette procédure écrit le titre du menu dans un menu existant. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' titre$ = texte à afficher ' font$ = nom de la police ' sz% = taille de la police ' sg%, si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%) if sg%<>0 then font_bold no% if si%<>0 then font_italic no% font_size no%,sz% font_color no%,fr%,fg%,fb% print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 20,1 print titre$ end_sub
' ==================================================================================== ' Cette procédure prépare le corps du menu pour un certain nombre de lignes. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' nlig% = nombre de lignes de détail pour ce menu ' mr%, mg%, mb% = couleur RBG du fond du corps du menu ' font$ = police des lignes de détail ' sz% = taille de la police ' sg%,si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%) dim_local no1% no1% = no% + 1 picture no1% : hide no1% top no1%,top(no1%-1)+25 : left no1%,left(no1%-1) width no1%,200 : height no1%,25*nlig% font_name no1%,font$ color no1%,mr%,mg%,mb% if sg%<>0 then font_bold no1% if si%<>0 then font_italic no1% font_size no1%,sz% font_color no1%,fr%,fg%,fb% on_click no1%,click_menu_deroulant_ligne end_sub
' ==================================================================================== ' Cette procédure écrit une ligne de détail dans le corps d'un menu ' no% = numéro d'objet de base du menu visé ' nlig% = numéro de la lignevisée (1,2, ...) ' texte$ = texte à afficher ' ==================================================================================== sub ligne_menu_deroulant(no%,nlig%,texte$) dim_local no% no1% = act% + 1 print_target_is no1% 2d_target_is no1% 2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1) print_locate 20,(nlig%-1)*25+1 print texte$ end_sub
' ==================================================================================== ' cette procédure ne dois en aucun cas être modifiée ! ' ==================================================================================== click_menu_deroulant: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click if hide(number_click+1)=1 if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if show number_click+1 else if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if hide number_click+1 end_if return end_if next i_menus_deroulants% return
' ==================================================================================== ' cette routine doit être adaptée pour lancer les fonctions de l'application ! ' ==================================================================================== click_menu_deroulant_ligne: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click-1 actuel_menu_deroulant_y% = mouse_y_left_down(number_click) actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25) message "Menu déroulant "+str$(i_menus_deroulants%)+" ligne "+str$(actuel_menu_deroulant_y%) return end_if next i_menus_deroulants% return Amusez-vous ! | |
| | | Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Un menu déroulant type "Side Bar" Sam 6 Déc 2014 - 23:04 | |
| Bonsoir Klaus ! Effectivement c'est pas mal... Mais en matière de menu, je crois que quelques PANEL pourraient faire la même chose ?? J'ai déjà testé cela, on peux faire des boutons colorés avec un texte selon nos besoins. Et là du coup en ligne de code c'est plus simple pour peu que l'on fasse une boucle pour la création des panels et les titres en data et quelques ligne suffisent !! | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Sam 6 Déc 2014 - 23:33 | |
| C'est vrai. C'est juste une autre façon de faire, copiée sur le comportement des "sidebars" de certaines pages Web. | |
| | | 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 déroulant type "Side Bar" Dim 7 Déc 2014 - 1:04 | |
| Hello Klaus
En exécutant ton code : Erreur : (35) Name already defined.Line : 110
En effet en ligne 110, tu déclares dim_local no% alors que no% est un paramètre de la sub. Je pense que tu veux dire no1%. Autre chose, la variable act% n’est déclarée nulle part.
Bon j'y retourne pour mieux voir. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Dim 7 Déc 2014 - 1:08 | |
| Tu as raison, Papydall. Un mélange de sources lors d'une correction... Voici le code valide: - Code:
-
' test_menu_deroulant.bas
nouveau_menu_deroulant(100,30,30,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")
nouveau_menu_deroulant(120,30,60,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Wingdings",10,1,1,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4") ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5") ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6") ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")
nouveau_menu_deroulant(140,30,90,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption") ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")
end
' ==================================================================================== ' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE. ' Paramètres: ' no% = numéro de l'objet de base à utiliser (no% et no%+1 doivent être libres) ' x%, y% = position du coin en haut à gauche du menu* ' mr%,mg%, mb% = couleurs RGB du fond du menu ' ==================================================================================== sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 if (object_exists(no%)+object_exists(no%+1))>0 message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !' exit_sub end_if dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants%, label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if n_menus_deroulants% = n_menus_deroulants% + 1 table_menus_deroulants%(n_menus_deroulants%) = no% actuel_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,200 : height no%,25 color no%,mr%,mg%,mb% on_click no%,click_menu_deroulant end_sub
' ==================================================================================== ' Cette procédure écrit le titre du menu dans un menu existant. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' titre$ = texte à afficher ' font$ = nom de la police ' sz% = taille de la police ' sg%, si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%) if sg%<>0 then font_bold no% if si%<>0 then font_italic no% font_size no%,sz% font_color no%,fr%,fg%,fb% print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 20,1 print titre$ end_sub
' ==================================================================================== ' Cette procédure prépare le corps du menu pour un certain nombre de lignes. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' nlig% = nombre de lignes de détail pour ce menu ' mr%, mg%, mb% = couleur RBG du fond du corps du menu ' font$ = police des lignes de détail ' sz% = taille de la police ' sg%,si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%) dim_local no1% no1% = no% + 1 picture no1% : hide no1% top no1%,top(no1%-1)+25 : left no1%,left(no1%-1) width no1%,200 : height no1%,25*nlig% font_name no1%,font$ color no1%,mr%,mg%,mb% if sg%<>0 then font_bold no1% if si%<>0 then font_italic no1% font_size no1%,sz% font_color no1%,fr%,fg%,fb% on_click no1%,click_menu_deroulant_ligne end_sub
' ==================================================================================== ' Cette procédure écrit une ligne de détail dans le corps d'un menu ' no% = numéro d'objet de base du menu visé ' nlig% = numéro de la lignevisée (1,2, ...) ' texte$ = texte à afficher ' ==================================================================================== sub ligne_menu_deroulant(no%,nlig%,texte$) dim_local no1% no1% = no% + 1 print_target_is no1% 2d_target_is no1% 2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1) print_locate 20,(nlig%-1)*25+1 print texte$ end_sub
' ==================================================================================== ' cette procédure ne dois en aucun cas être modifiée ! ' ==================================================================================== click_menu_deroulant: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click if hide(number_click+1)=1 if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if show number_click+1 else if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if hide number_click+1 end_if return end_if next i_menus_deroulants% return
' ==================================================================================== ' cette routine doit être adaptée pour lancer les fonctions de l'application ! ' ==================================================================================== click_menu_deroulant_ligne: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click-1 actuel_menu_deroulant_y% = mouse_y_left_down(number_click) actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25) message "Menu déroulant "+str$(i_menus_deroulants%)+" ligne "+str$(actuel_menu_deroulant_y%) return end_if next i_menus_deroulants% return
Dernière édition par Klaus le Dim 7 Déc 2014 - 9:30, édité 1 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 déroulant type "Side Bar" Dim 7 Déc 2014 - 1:10 | |
| Exécution : OK J'y retourne pour comprendre le pourquoi du comment. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Dim 7 Déc 2014 - 1:20 | |
| compare aussi ce que je viens de poster ici... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Dim 7 Déc 2014 - 2:51 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Dim 7 Déc 2014 - 9:15 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Dim 7 Déc 2014 - 9:32 | |
| J'ai apporté une petite modif dans le source du premier post pour assurer que les deux numéros d'objet par menu sont bien disponibles. | |
| | | Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Dim 7 Déc 2014 - 9:37 | |
| Beau travail,
Les SUB(s) ne sont pas bien compliquées à mettre en place, même s'il y a beaucoup de paramètres à renseigner.
Je note au passage l'astuce => if label("click_menu_deroulant")=0, qui rend la création du menu simple (pas besoin de se préoccuper des déclarations de variables et labels).
Bravo. A+
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Lun 8 Déc 2014 - 12:07 | |
| Merci, Jean-Claude ! Voici une nouvelle version, encore améliorée. Il y a maintenant une barre verticale optionnelle, très étroite, avec le signe "<" comme libellé. Un clic sur cette barre va faire complètement disparaître le menu (à l'exception de cette barre), et décaler tous les objets de la page vers la gauche. Le libellé de la barre passe à ">". Un nouveau clic sur cette barre remet tout en place: - Code:
-
' test_menu_deroulant.bas
alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:" memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200
barre_menu_deroulant(50,5,30,height(0)-100,255,127,127)
nouveau_menu_deroulant(100,30,30,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")
nouveau_menu_deroulant(120,30,60,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Times New Roman",10,1,1,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4") ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5") ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6") ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")
nouveau_menu_deroulant(140,30,90,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption") ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")
end
' ==================================================================================== ' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier ' Paramètres:
' ==================================================================================== sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 if object_exists(no%)>0 message "L'objets "str$(no%)+" n'est pas disponible !' exit_sub end_if dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants% dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants% label click_barre_menu_deroulant label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if barre_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,10 : height no%,h% color no%,mr%,mg%,mb% on_click no%,click_barre_menu_deroulant
font_bold no% font_size no%,10 print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 1,h%/2 print "<" end_sub
' ==================================================================================== ' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE. ' Paramètres: ' no% = numéro de l'objet de base à utiliser (no% et no%+1 doivent être libres) ' x%, y% = position du coin en haut à gauche du menu* ' mr%,mg%, mb% = couleurs RGB du fond du menu ' ==================================================================================== sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 if (object_exists(no%)+object_exists(no%+1))>0 message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !' exit_sub end_if dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants% dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants% label click_barre_menu_deroulant label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if n_menus_deroulants% = n_menus_deroulants% + 1 table_menus_deroulants%(n_menus_deroulants%) = no% actuel_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,200 : height no%,25 color no%,mr%,mg%,mb% on_click no%,click_menu_deroulant end_sub
' ==================================================================================== ' Cette procédure écrit le titre du menu dans un menu existant. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' titre$ = texte à afficher ' font$ = nom de la police ' sz% = taille de la police ' sg%, si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%) if sg%<>0 then font_bold no% if si%<>0 then font_italic no% font_size no%,sz% font_color no%,fr%,fg%,fb% print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 20,1 print titre$ end_sub
' ==================================================================================== ' Cette procédure prépare le corps du menu pour un certain nombre de lignes. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' nlig% = nombre de lignes de détail pour ce menu ' mr%, mg%, mb% = couleur RBG du fond du corps du menu ' font$ = police des lignes de détail ' sz% = taille de la police ' sg%,si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%) dim_local no1% no1% = no% + 1 picture no1% : hide no1% top no1%,top(no1%-1)+25 : left no1%,left(no1%-1) + 10 width no1%,200 : height no1%,25*nlig% font_name no1%,font$ color no1%,mr%,mg%,mb% if sg%<>0 then font_bold no1% if si%<>0 then font_italic no1% font_size no1%,sz% font_color no1%,fr%,fg%,fb% on_click no1%,click_menu_deroulant_ligne end_sub
' ==================================================================================== ' Cette procédure écrit une ligne de détail dans le corps d'un menu ' no% = numéro d'objet de base du menu visé ' nlig% = numéro de la lignevisée (1,2, ...) ' texte$ = texte à afficher ' ==================================================================================== sub ligne_menu_deroulant(no%,nlig%,texte$) dim_local no1% no1% = no% + 1 print_target_is no1% 2d_target_is no1% 2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1) print_locate 20,(nlig%-1)*25+1 print texte$ end_sub
' ==================================================================================== ' cette procédure ne dois en aucun cas être modifiée ! ' ==================================================================================== click_menu_deroulant: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click if hide(number_click+1)=1 if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if show number_click+1 else if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if hide number_click+1 end_if return end_if next i_menus_deroulants% return
' ==================================================================================== ' ==================================================================================== click_barre_menu_deroulant: if n_menus_deroulants%>0 j_menus_deroulants% = 2000 k_menus_deroulants% = 200 if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000 if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200 for i_menus_deroulants%=1 to n_menus_deroulants% left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants% left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants% next i_menus_deroulants% print_target_is number_click print_locate 1,height(number_click)/2 if j_menus_deroulants%>0 print "<" else print ">" end_if for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent ! if object_exists(i_menus_deroulants%)=1 f_menus_deroulants% = 1 if i_menus_deroulants%=barre_menu_deroulant% f_menus_deroulants% = 0 else for j_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0 if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0 next j_menus_deroulants% end_if if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants% end_if next i_menus_deroulants% end_if return ' ==================================================================================== ' cette routine doit être adaptée pour lancer les fonctions de l'application ! ' ==================================================================================== click_menu_deroulant_ligne: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click-1 actuel_menu_deroulant_y% = mouse_y_left_down(number_click) actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25) message "Menu déroulant "+str$(i_menus_deroulants%)+" ligne "+str$(actuel_menu_deroulant_y%) return end_if next i_menus_deroulants% return
EDIT La présence de la barre latérale est parfaitement optionnelle. Si l'on ne la souhaite pas, il suffit de ne pas faire appel à la procédure barre_menu_deroulant, tout simplement. EDIT J'ai décalé légèrement le sous-menu pour un meilleur visuel. Le code est à jour dans ce post.
Dernière édition par Klaus le Lun 8 Déc 2014 - 13:18, édité 1 fois | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un menu déroulant type "Side Bar" Lun 8 Déc 2014 - 12:20 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Lun 8 Déc 2014 - 15:08 | |
| Nouvelle version. Elle n'apporte rien visuellement, mais une sécurité supplémentaire. Car, dans le cas de la barre de droite qui fait disparaître le menu, tous les objets visibles sont décalés vers la gauche, et inversement. Or, il ne faut toucher, ni les objets invisibles, ni ceux qui ont un parent différent de celuidu menu. Voici la version sécurisée: - Code:
-
' test_menu_deroulant.bas
alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:" memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200
panel 3 : top 3,300 : left 3,270 edit 4 : parent 4,3 : top 4,10 : left 4,10
barre_menu_deroulant(50,5,30,height(0)-100,255,127,127)
nouveau_menu_deroulant(100,30,30,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")
nouveau_menu_deroulant(120,30,60,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Times New Roman",10,1,1,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4") ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5") ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6") ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")
nouveau_menu_deroulant(140,30,90,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption") ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")
end
' ==================================================================================== ' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier ' Paramètres:
' ==================================================================================== sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 if object_exists(no%)>0 message "L'objets "str$(no%)+" n'est pas disponible !' exit_sub end_if dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants% dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants% label click_barre_menu_deroulant label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if barre_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,10 : height no%,h% color no%,mr%,mg%,mb% on_click no%,click_barre_menu_deroulant
font_bold no% font_size no%,10 print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 1,h%/2 print "<" end_sub
' ==================================================================================== ' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE. ' Paramètres: ' no% = numéro de l'objet de base à utiliser (no% et no%+1 doivent être libres) ' x%, y% = position du coin en haut à gauche du menu* ' mr%,mg%, mb% = couleurs RGB du fond du menu ' ==================================================================================== sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 if (object_exists(no%)+object_exists(no%+1))>0 message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !' exit_sub end_if dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants% dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants% label click_barre_menu_deroulant label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if n_menus_deroulants% = n_menus_deroulants% + 1 table_menus_deroulants%(n_menus_deroulants%) = no% actuel_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,200 : height no%,25 color no%,mr%,mg%,mb% on_click no%,click_menu_deroulant end_sub
' ==================================================================================== ' Cette procédure écrit le titre du menu dans un menu existant. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' titre$ = texte à afficher ' font$ = nom de la police ' sz% = taille de la police ' sg%, si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%) if sg%<>0 then font_bold no% if si%<>0 then font_italic no% font_size no%,sz% font_color no%,fr%,fg%,fb% print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 20,1 print titre$ end_sub
' ==================================================================================== ' Cette procédure prépare le corps du menu pour un certain nombre de lignes. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' nlig% = nombre de lignes de détail pour ce menu ' mr%, mg%, mb% = couleur RBG du fond du corps du menu ' font$ = police des lignes de détail ' sz% = taille de la police ' sg%,si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%) dim_local no1% no1% = no% + 1 picture no1% : hide no1% top no1%,top(no1%-1)+25 : left no1%,left(no1%-1)+10 width no1%,200 : height no1%,25*nlig% font_name no1%,font$ color no1%,mr%,mg%,mb% if sg%<>0 then font_bold no1% if si%<>0 then font_italic no1% font_size no1%,sz% font_color no1%,fr%,fg%,fb% on_click no1%,click_menu_deroulant_ligne end_sub
' ==================================================================================== ' Cette procédure écrit une ligne de détail dans le corps d'un menu ' no% = numéro d'objet de base du menu visé ' nlig% = numéro de la lignevisée (1,2, ...) ' texte$ = texte à afficher ' ==================================================================================== sub ligne_menu_deroulant(no%,nlig%,texte$) dim_local no1% no1% = no% + 1 print_target_is no1% 2d_target_is no1% 2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1) print_locate 20,(nlig%-1)*25+1 print texte$ end_sub
' ==================================================================================== ' cette procédure ne dois en aucun cas être modifiée ! ' ==================================================================================== click_menu_deroulant: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click if hide(number_click+1)=1 if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if show number_click+1 else if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if hide number_click+1 end_if return end_if next i_menus_deroulants% return
' ==================================================================================== ' ==================================================================================== click_barre_menu_deroulant: if n_menus_deroulants%>0 j_menus_deroulants% = 2000 k_menus_deroulants% = 200 if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000 if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200 for i_menus_deroulants%=1 to n_menus_deroulants% left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants% left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants% next i_menus_deroulants% print_target_is number_click print_locate 1,height(number_click)/2 if j_menus_deroulants%>0 print "<" else print ">" end_if for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent ! if object_exists(i_menus_deroulants%)=1 f_menus_deroulants% = 1 if i_menus_deroulants%=barre_menu_deroulant% f_menus_deroulants% = 0 else for j_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0 if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0 next j_menus_deroulants% end_if if object_parent(i_menus_deroulants%)<>object_parent(table_menus_deroulants%(1)) then f_menus_deroulants% = 0 j_menus_deroulants% = object_type(i_menus_deroulants%) if j_menus_deroulants%=7 then f_menus_deroulants% = 0 if j_menus_deroulants%=12 then f_menus_deroulants% = 0 if j_menus_deroulants%=13 then f_menus_deroulants% = 0 if j_menus_deroulants%=14 then f_menus_deroulants% = 0 if j_menus_deroulants%=17 then f_menus_deroulants% = 0 if j_menus_deroulants%=18 then f_menus_deroulants% = 0 if j_menus_deroulants%=26 then f_menus_deroulants% = 0 if j_menus_deroulants%=28 then f_menus_deroulants% = 0 if j_menus_deroulants%=41 then f_menus_deroulants% = 0 if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants% end_if next i_menus_deroulants% end_if return ' ==================================================================================== ' cette routine doit être adaptée pour lancer les fonctions de l'application ! ' ==================================================================================== click_menu_deroulant_ligne: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click-1 actuel_menu_deroulant_y% = mouse_y_left_down(number_click) actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25) message "Menu déroulant "+str$(i_menus_deroulants%)+" ligne "+str$(actuel_menu_deroulant_y%) return end_if next i_menus_deroulants% return
| |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 8 Déc 2014 - 16:04 | |
| Pour un meilleur rendu, il serait bien que la barre avec le > ou < soit placée à droite du menu lorsqu'il est déplié (ou étiré comme vous voulez). | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Lun 8 Déc 2014 - 17:45 | |
| | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Lun 8 Déc 2014 - 17:49 | |
| Comme ça ? - Code:
-
' test_menu_deroulant.bas
alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:" memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200
panel 3 : top 3,300 : left 3,270 edit 4 : parent 4,3 : top 4,10 : left 4,10
barre_menu_deroulant(50,220,30,height(0)-100,255,127,127)
nouveau_menu_deroulant(100,5,30,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option")
nouveau_menu_deroulant(120,5,60,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255,"Times New Roman",10,1,1,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1") ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2") ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3") ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4") ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5") ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6") ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7")
nouveau_menu_deroulant(140,5,90,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255,"MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option") ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option") ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption") ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option")
end
' ==================================================================================== ' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier ' Paramètres:
' ==================================================================================== sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 if object_exists(no%)>0 message "L'objets "str$(no%)+" n'est pas disponible !' exit_sub end_if dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants% dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants% label click_barre_menu_deroulant label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if barre_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,10 : height no%,h% color no%,mr%,mg%,mb% on_click no%,click_barre_menu_deroulant
font_bold no% font_size no%,10 print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 1,h%/2 print "<" end_sub
' ==================================================================================== ' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE. ' Paramètres: ' no% = numéro de l'objet de base à utiliser (no% et no%+1 doivent être libres) ' x%, y% = position du coin en haut à gauche du menu* ' mr%,mg%, mb% = couleurs RGB du fond du menu ' ==================================================================================== sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 if (object_exists(no%)+object_exists(no%+1))>0 message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !' exit_sub end_if dim barre_menu_deroulant%, k_menus_deroulants%, f_menus_deroulants% dim n_menus_deroulants%, table_menus_deroulants%(50), i_menus_deroulants% dim actuel_menu_deroulant%, actuel_menu_deroulant_y%, j_menus_deroulants% label click_barre_menu_deroulant label click_menu_deroulant, click_menu_deroulant_ligne n_menus_deroulants% = 0 end_if n_menus_deroulants% = n_menus_deroulants% + 1 table_menus_deroulants%(n_menus_deroulants%) = no% actuel_menu_deroulant% = no% picture no% top no%,y% : left no%,x% : width no%,200 : height no%,25 color no%,mr%,mg%,mb% on_click no%,click_menu_deroulant end_sub
' ==================================================================================== ' Cette procédure écrit le titre du menu dans un menu existant. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' titre$ = texte à afficher ' font$ = nom de la police ' sz% = taille de la police ' sg%, si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%) if sg%<>0 then font_bold no% if si%<>0 then font_italic no% font_size no%,sz% font_color no%,fr%,fg%,fb% print_target_is no% 2d_target_is no% 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 20,1 print titre$ end_sub
' ==================================================================================== ' Cette procédure prépare le corps du menu pour un certain nombre de lignes. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' nlig% = nombre de lignes de détail pour ce menu ' mr%, mg%, mb% = couleur RBG du fond du corps du menu ' font$ = police des lignes de détail ' sz% = taille de la police ' sg%,si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%,font$,sz%,sg%,si%,fr%,fg%,fb%) dim_local no1% no1% = no% + 1 picture no1% : hide no1% top no1%,top(no1%-1)+25 : left no1%,left(no1%-1)+10 width no1%,200 : height no1%,25*nlig% font_name no1%,font$ color no1%,mr%,mg%,mb% if sg%<>0 then font_bold no1% if si%<>0 then font_italic no1% font_size no1%,sz% font_color no1%,fr%,fg%,fb% on_click no1%,click_menu_deroulant_ligne end_sub
' ==================================================================================== ' Cette procédure écrit une ligne de détail dans le corps d'un menu ' no% = numéro d'objet de base du menu visé ' nlig% = numéro de la lignevisée (1,2, ...) ' texte$ = texte à afficher ' ==================================================================================== sub ligne_menu_deroulant(no%,nlig%,texte$) dim_local no1% no1% = no% + 1 print_target_is no1% 2d_target_is no1% 2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1) print_locate 20,(nlig%-1)*25+1 print texte$ end_sub
' ==================================================================================== ' cette procédure ne dois en aucun cas être modifiée ! ' ==================================================================================== click_menu_deroulant: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click if hide(number_click+1)=1 if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if show number_click+1 else if i_menus_deroulants%<n_menus_deroulants% for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if hide number_click+1 end_if return end_if next i_menus_deroulants% return
' ==================================================================================== ' ==================================================================================== click_barre_menu_deroulant: if n_menus_deroulants%>0 j_menus_deroulants% = 2000 k_menus_deroulants% = 200 if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000 if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200 for i_menus_deroulants%=1 to n_menus_deroulants% left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants% left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants% next i_menus_deroulants% print_target_is number_click print_locate 1,height(number_click)/2 if j_menus_deroulants%>0 print "<" else print ">" end_if for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent ! if object_exists(i_menus_deroulants%)=1 f_menus_deroulants% = 1 if i_menus_deroulants%<>barre_menu_deroulant% for j_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0 if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0 next j_menus_deroulants% end_if if object_parent(i_menus_deroulants%)<>object_parent(table_menus_deroulants%(1)) then f_menus_deroulants% = 0 j_menus_deroulants% = object_type(i_menus_deroulants%) if j_menus_deroulants%=7 then f_menus_deroulants% = 0 if j_menus_deroulants%=12 then f_menus_deroulants% = 0 if j_menus_deroulants%=13 then f_menus_deroulants% = 0 if j_menus_deroulants%=14 then f_menus_deroulants% = 0 if j_menus_deroulants%=17 then f_menus_deroulants% = 0 if j_menus_deroulants%=18 then f_menus_deroulants% = 0 if j_menus_deroulants%=26 then f_menus_deroulants% = 0 if j_menus_deroulants%=28 then f_menus_deroulants% = 0 if j_menus_deroulants%=41 then f_menus_deroulants% = 0 if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants% end_if next i_menus_deroulants% end_if return ' ==================================================================================== ' cette routine doit être adaptée pour lancer les fonctions de l'application ! ' ==================================================================================== click_menu_deroulant_ligne: for i_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(i_menus_deroulants%)=number_click-1 actuel_menu_deroulant_y% = mouse_y_left_down(number_click) actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25) message "Menu déroulant "+str$(i_menus_deroulants%)+" ligne "+str$(actuel_menu_deroulant_y%) return end_if next i_menus_deroulants% return
| |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Mar 9 Déc 2014 - 0:41 | |
| Et nouvelle version: j'ai déplacé les paramètres de police, taille, attributs et couleur pour le corps d'un menu de la procédure de création du corps vers la procédure d'écriture d'une ligne. Du coup, on peut avoir des lignes aux graphismes et couleurs différentes, dans le même sous-menu: - Code:
-
' test_menu_deroulant.bas
alpha 1 : top 1,40 : left 1,250 : caption 1,"Un mémo:" memo 2 : top 2,60 : left 2,250 : width 2,300 : height 2,200
panel 3 : top 3,300 : left 3,270 edit 4 : parent 4,3 : top 4,10 : left 4,10
barre_menu_deroulant(50,220,30,height(0)-100,255,127,127)
nouveau_menu_deroulant(100,5,30,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 1","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Première option","Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,2,"Deuxième option","Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,3,"Troisième option","Century Gothic",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,4,"Quatrième option","Century Gothic",10,1,0,0,0,0)
nouveau_menu_deroulant(120,5,60,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 2","Arial",16,0,0,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,7,191,191,255) ligne_menu_deroulant(actuel_menu_deroulant%,1,"Ligne 1","Century Gothic",10,1,1,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,2,"Ligne 2","Arial",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,3,"Ligne 3","MS Serif",10,0,1,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,4,"Ligne 4","Times New Roman",10,0,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,5,"Ligne 5","Times New Roman",10,1,1,255,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,6,"Ligne 6","Times New Roman",10,1,1,0,255,0) ligne_menu_deroulant(actuel_menu_deroulant%,7,"Ligne 7","Times New Roman",10,1,1,0,0,255)
nouveau_menu_deroulant(140,5,90,127,127,255) titre_menu_deroulant(actuel_menu_deroulant%,"Mon menu 3","Arial",16,1,1,0,0,0) corps_menu_deroulant(actuel_menu_deroulant%,4,191,191,255) ligne_menu_deroulant(actuel_menu_deroulant%,1,"1ère option","MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,2,"2ème option","MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,3,"3èmeoption","MS Serif",10,1,0,0,0,0) ligne_menu_deroulant(actuel_menu_deroulant%,4,"4ème option","MS Serif",10,1,0,0,0,0)
' activer cette ligne si le menu doit être invisible au départ ! ' gosub click_barre_menu_deroulant
end
' ==================================================================================== ' Cette procédure crée la barre verticale qui permet de montrer/cacher le menu entier ' Paramètres:
' ==================================================================================== sub barre_menu_deroulant(no%,x%,y%,h%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 : ' est-ce que l'environnement doit être initialisé ? if object_exists(no%)>0 : ' est-ce que le numéro d'objet est libre ? message "L'objets "str$(no%)+" n'est pas disponible !' exit_sub end_if dim barre_menu_deroulant% : ' numéro d'objet de la barre verticale dim n_menus_deroulants% : ' nombre de lignes définies de niveau 1 dim table_menus_deroulants%(50) : ' liste des numéros d'objets de niveau 1 dim actuel_menu_deroulant% : ' dernier numéro d'objet créé de ligne de niveau 1 dim i_menus_deroulants% : ' variable d'usage interne dim j_menus_deroulants% : ' variable d'usage interne dim k_menus_deroulants% : ' variable d'usage interne dim f_menus_deroulants% : ' variable d'usage interne label click_barre_menu_deroulant : ' clic sur la barre verticale label click_menu_deroulant : ' clic sur une ligne de niveau 1 label click_menu_deroulant_ligne : ' clic sur une ligne de niveau 2 n_menus_deroulants% = 0 end_if if barre_menu_deroulant%>0 : ' est-ce que la barre verticale est déjà créée ? message "La barre verticale est déjà définie !" return end_if barre_menu_deroulant% = no% : ' mémoriser le numéro d'objet de la barre verticale picture no% : ' créer le PICTURE top no%,y% : left no%,x% : ' positionner selon les besoins width no%,10 : height no%,h% : ' et dimensionner sous forme de barre étroite color no%,mr%,mg%,mb% : ' donner la couleur de fon on_click no%,click_barre_menu_deroulant : ' et lier au traitement du clic gauche
font_bold no% : ' passer en gras font_size no%,10 : ' et en taille 12 print_target_is no% : ' cibler le PICTURE pour PRINT 2d_target_is no% : ' et pour les commandes 2D ' la ligne suivante utilise la couleur du PICTURE comme couleur de fond pour PRINT 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 1,h%/2 : ' positionner au milieu de la barre print "<" : ' et créer le libellé "réduire" end_sub
' ==================================================================================== ' Cette procédure crée un nouveau menu déroulant. Elle utilise 2 objets PICTURE. ' Paramètres: ' no% = numéro de l'objet de base à utiliser (no% et no%+1 doivent être libres) ' x%, y% = position du coin en haut à gauche du menu* ' mr%,mg%, mb% = couleurs RGB du fond du menu ' ==================================================================================== sub nouveau_menu_deroulant(no%,x%,y%,mr%,mg%,mb%) if label("click_menu_deroulant")=0 : ' est-ce que l'environnement doit être initialisé ? if (object_exists(no%)+object_exists(no%+1))>0 : ' est-ce que les numéros d'objet sont libres ? message "Les objets "str$(no%)+" et/ou "+str$(no%+1)"+" ne sont pas disponibles !' exit_sub end_if dim barre_menu_deroulant% : ' numéro d'objet de la barre verticale dim n_menus_deroulants% : ' nombre de lignes définies de niveau 1 dim table_menus_deroulants%(50) : ' liste des numéros d'objets de niveau 1 dim actuel_menu_deroulant% : ' dernier numéro d'objet créé de ligne de niveau 1 dim i_menus_deroulants% : ' variable d'usage interne dim j_menus_deroulants% : ' variable d'usage interne dim k_menus_deroulants% : ' variable d'usage interne dim f_menus_deroulants% : ' variable d'usage interne label click_barre_menu_deroulant : ' clic sur la barre verticale label click_menu_deroulant : ' clic sur une ligne de niveau 1 label click_menu_deroulant_ligne : ' clic sur une ligne de niveau 2 n_menus_deroulants% = 0 end_if n_menus_deroulants% = n_menus_deroulants% + 1 : ' compter cette ligne de niveau 1 table_menus_deroulants%(n_menus_deroulants%) = no% : ' mémoriser le numéro d'objet actuel_menu_deroulant% = no% : ' mémoriser ce numéro pour le niveau 2 à suivre picture no% : ' créer le PICTURE top no%,y% : left no%,x% : width no%,200 : height no%,25 : ' position et dimensions color no%,mr%,mg%,mb% : ' donner la couleur de fond on_click no%,click_menu_deroulant : ' et lier au traitement du clic gauche end_sub
' ==================================================================================== ' Cette procédure écrit le titre du menu dans un menu existant. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' titre$ = texte à afficher ' font$ = nom de la police ' sz% = taille de la police ' sg%, si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub titre_menu_deroulant(no%,titre$,font$,sz%,sg%,si%,fr%,fg%,fb%) font_name no%,font$ : ' choisir la police if sg%<>0 then font_bold no% : ' passer en gras si demandé if si%<>0 then font_italic no% : ' passer en italique si demandé font_size no%,sz% : ' installer la taille de la police font_color no%,fr%,fg%,fb% : ' et la couleur de l'écriture print_target_is no% : ' cibler le PICTURE pour la commande PRINT 2d_target_is no% : ' ainsi que pour les commandes 2D ' la ligne suivante utilise la couleur du PICTURE comme couleur de fond pour PRINT 2d_fill_color color_pixel_red(no%,1,1),color_pixel_green(no%,1,1),color_pixel_blue(no%,1,1) print_locate 20,1 : ' positionner le point de départ print titre$ : ' écrire le titre end_sub
' ==================================================================================== ' Cette procédure prépare le corps du menu pour un certain nombre de lignes. ' Paramètres: ' no% = numéro d'objet de base du menu visé ' nlig% = nombre de lignes de détail pour ce menu ' mr%, mg%, mb% = couleur RBG du fond du corps du menu ' ==================================================================================== sub corps_menu_deroulant(no%,nlig%,mr%,mg%,mb%) dim_local no1% : ' variable interne pour le PICTURE du sous-menu no1% = no% + 1 : ' son numéro suit celui du PICTURE de niveau 1 picture no1% : hide no1% : ' créer le PICTURE et le chacher tout de suite top no1%,top(no1%-1)+25 : ' positionner juste en-dessous du niveau 1 left no1%,left(no1%-1)+10 : ' et légèrement à droite (meilleure visibilité) width no1%,200 : height no1%,25*nlig% : ' dimensions en fonction du nombre de lignes color no1%,mr%,mg%,mb% : ' installer la couleur du fond on_click no1%,click_menu_deroulant_ligne : ' et lier au traitement du clic gauche end_sub
' ==================================================================================== ' Cette procédure écrit une ligne de détail dans le corps d'un menu ' no% = numéro d'objet de base du menu visé ' nlig% = numéro de la lignevisée (1,2, ...) ' texte$ = texte à afficher ' font$ = police des lignes de détail ' sz% = taille de la police ' sg%,si% = styles de la police (gras, italique): indicateurs 0/1 ' fr%, fg%, fb% = couleurs RGB de la police ' ==================================================================================== sub ligne_menu_deroulant(no%,nlig%,texte$,font$,sz%,sg%,si%,fr%,fg%,fb%) dim_local no1% : ' variable interne pour le PICTURE du sous-menu no1% = no% + 1 : ' son numéro suit celui du PICTURE de niveau 1 print_target_is no1% : ' cibler ce PICTURE pour PRINT 2d_target_is no1% : ' ainsi que pour les commandes 2D ' la ligne suivante utilise la couleur du PICTURE comme couleur de fond pour PRINT 2d_fill_color color_pixel_red(no1%,1,1),color_pixel_green(no1%,1,1),color_pixel_blue(no1%,1,1) print_locate 20,(nlig%-1)*25+1 : ' positionner en fonction du numéro de ligne font_name no1%,font$ : ' choisir la police if sg%<>0 then font_bold no1% : ' passer en gras si demandé if si%<>0 then font_italic no1% : ' passer en italique si demandé font_size no1%,sz% : ' installer la taille de la police font_color no1%,fr%,fg%,fb% : ' ainsi que la couleur de l'écriture print texte$ : ' imprimer la ligne end_sub
' ==================================================================================== ' cette procédure ne dois en aucun cas être modifiée ! ' ==================================================================================== click_menu_deroulant: for i_menus_deroulants%=1 to n_menus_deroulants% : ' boucle sur les menus niveau 1 if table_menus_deroulants%(i_menus_deroulants%)=number_click : ' trouvé ? if hide(number_click+1)=1 : ' actuellement caché ? if i_menus_deroulants%<n_menus_deroulants% : ' pas le dernier niveau 1 ' décaler tous les menus suivants vers le bas for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) + height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) + height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if show number_click+1 : ' montrer le sous-menu else : ' actuellement visible ! if i_menus_deroulants%<n_menus_deroulants% : ' pas le dernier niveau 1 ' décaler tous les menus suivants vers le haut for j_menus_deroulants%=i_menus_deroulants%+1 to n_menus_deroulants% top table_menus_deroulants%(j_menus_deroulants%), top(table_menus_deroulants%(j_menus_deroulants%)) - height(table_menus_deroulants%(i_menus_deroulants%)+1) top table_menus_deroulants%(j_menus_deroulants%)+1, top(table_menus_deroulants%(j_menus_deroulants%)+1) - height(table_menus_deroulants%(i_menus_deroulants%)+1) next j_menus_deroulants% end_if hide number_click+1 : ' cacher le sous-menu end_if return end_if next i_menus_deroulants% return
' ==================================================================================== ' Cette routine est appelée lors d'un clic gauche sur la barre verticale ' ==================================================================================== click_barre_menu_deroulant: if n_menus_deroulants%>0 : ' est-ce qu'il y a des menus de niveau 1 ? j_menus_deroulants% = 2000 : ' décalage pour faire apparaître le menu vertical k_menus_deroulants% = 200 : ' décalage pour tous les autres objets visibles ' les deux lignes suiva,tes gèrent le décalage s'il faut faire disparaître le menu if left(table_menus_deroulants%(1))>0 then j_menus_deroulants% = 0 - 2000 if left(table_menus_deroulants%(1))>0 then k_menus_deroulants% = 0 - 200 for i_menus_deroulants%=1 to n_menus_deroulants% : ' boucle sur les menus de niveau 1 ' décaler le menu de niveau 1 left table_menus_deroulants%(i_menus_deroulants%), left(table_menus_deroulants%(i_menus_deroulants%)) + j_menus_deroulants% ' décaler aussi sons sous-menu associé left table_menus_deroulants%(i_menus_deroulants%)+1, left(table_menus_deroulants%(i_menus_deroulants%)+1) + j_menus_deroulants% next i_menus_deroulants% print_target_is barre_menu_deroulant% : ' cibler la barre verticale pour PRINT print_locate 1,height(barre_menu_deroulant%)/2 : ' positionner au milieu de la barre if j_menus_deroulants%>0 : ' est-ce que le menu est visible ? print "<" : ' alors installer la marque "cacher" else : ' sinon print ">" : ' installer la marque "montrer" end_if for i_menus_deroulants%=1 to 200 : ' 32000 : ' limite théorique, mais c'est lent ! if object_exists(i_menus_deroulants%)=1 : ' est-ce qu'on a un objet existant ? f_menus_deroulants% = 1 : ' indiquer "il fait décaler l'objet" if i_menus_deroulants%<>barre_menu_deroulant% : ' exclure tous les objets du menu vertical for j_menus_deroulants%=1 to n_menus_deroulants% if table_menus_deroulants%(j_menus_deroulants%)=i_menus_deroulants% then f_menus_deroulants% = 0 if (table_menus_deroulants%(j_menus_deroulants%)+1)=i_menus_deroulants% then f_menus_deroulants% = 0 next j_menus_deroulants% end_if if object_parent(i_menus_deroulants%)<>object_parent(table_menus_deroulants%(1)) then f_menus_deroulants% = 0 j_menus_deroulants% = object_type(i_menus_deroulants%) if j_menus_deroulants%=7 then f_menus_deroulants% = 0 : ' FORM if j_menus_deroulants%=12 then f_menus_deroulants% = 0 : ' MAIN_MENU if j_menus_deroulants%=13 then f_menus_deroulants% = 0 : ' SUB_MENU if j_menus_deroulants%=14 then f_menus_deroulants% = 0 : ' SOUND if j_menus_deroulants%=17 then f_menus_deroulants% = 0 : ' OPEN_DIALOG if j_menus_deroulants%=18 then f_menus_deroulants% = 0 : ' SAVE_DIALOG if j_menus_deroulants%=26 then f_menus_deroulants% = 0 : ' DLIST if j_menus_deroulants%=28 then f_menus_deroulants% = 0 : ' TIMER if j_menus_deroulants%=41 then f_menus_deroulants% = 0 : ' IMAGE ' décaler l'objet si nécesssaire if f_menus_deroulants%>0 then left i_menus_deroulants%,left(i_menus_deroulants%) + k_menus_deroulants% end_if next i_menus_deroulants% end_if return ' ==================================================================================== ' cette routine doit être adaptée pour lancer les fonctions de l'application ! ' ==================================================================================== click_menu_deroulant_ligne: for i_menus_deroulants%=1 to n_menus_deroulants% : ' boucle sur les menus de niveau 1 if table_menus_deroulants%(i_menus_deroulants%)=number_click-1 : ' est-ce le menu choisi ? actuel_menu_deroulant_y% = mouse_y_left_down(number_click) : ' récuperer la coordonnée verticale du clic actuel_menu_deroulant_y% = int((actuel_menu_deroulant_y%+24)/25) : ' en déduire le numéro de ligne ' lancer ici le traitement spécifique à cette ligne pour ce menu message "Menu déroulant "+str$(i_menus_deroulants%)+" ligne "+str$(actuel_menu_deroulant_y%) return end_if next i_menus_deroulants% return EDIT J'ai ajouté une petite ligne au début, juste avant le END du programme principal. Si l'on active cette ligne, le menu vertical sera caché au démarrage, seule la barre verticale sera collée sur le bord gauche.
Dernière édition par Klaus le Mar 9 Déc 2014 - 13:23, édité 2 fois | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 9 Déc 2014 - 3:24 | |
| Superbe Klaus !Il y a un truc qui rendrait aussi bien qu' un objet query c' est qu' au lieu de décaler les objets vers la droite, cela passe par dessus les objets du form avec un fond qui pourrait être une image en forme d' onglet. Le menu prenant la main lors de son affichage. mais bon, je crois que je deviens gourmand... Edit : Si on pousse le vice, on pourrait même avoir plusieurs onglets. Bon, ca va, j' ai compris, je sors... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Mar 9 Déc 2014 - 10:20 | |
| Je crois que les onglets, ça sort du contexte du menu vertical. Et d'ailleurs, j'ai déjà un pseudo-objet TAB écrit en pur Panoramic, disponible sur mon site. On peut faire des objets TAB à plusieurs onglets, on peut placer un objet TAB sur un onglet d'un autre objet TAB, on peut gérer séparément leurs attributs graphiques... - là encore, c'est fait avec des PICTURE.
Par contre, l'autre idée "passer par-dessus les autres objets" m'aurait bien plu, mais Panoramic ne sait pas faire. Certains objets sont toujours par-dessus un PICTURE, quelque soit l'ordre de création. Et cela fait l'objet d'un signalement de bug que j'ai fait hier. J'ai donc fait le décalage des objets, ce qui est amusant aussi. | |
| | | Jicehel
Nombre de messages : 5947 Age : 52 Localisation : 77500 Date d'inscription : 18/04/2011
| Sujet: Re: Un menu déroulant type "Side Bar" Mar 9 Déc 2014 - 10:54 | |
| Après on peut se faire une procédure pour créer automatiquement des menus avec des styles prédéfinis qui appelle les procédure "basiques", mais bon c'est un peu du luxe... | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Mar 9 Déc 2014 - 13:25 | |
| J'ai fait une petite modif dans le source ci-dessus, pour montrer comment on peut faire de sorte que le menu soit caché au démarrage, avec seule la barre verticale visible, collée sur le bord gauche. Pour observer cela, il suffit d'activer la ligne qui précède la commande END. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 9 Déc 2014 - 13:28 | |
| L' effet d' ouverture par dessus les éléments du form peut être obtenu par un objet panel : - Code:
-
dim no%,Obj_alpha%,Obj_Memo%,Obj_Pan%,Obj_Edit%,Pan%,Obj_alpha1% dim x%,t% label clic
height 0,550 : width 0,700 font_name 0,"arial"
no%=no%+1 : Obj_alpha%=no% alpha no% : top no%,10 : left no%,15 : caption no%,"Un Mémo :"
no%=no%+1 : Obj_Memo%=no% Memo no% : top no%,25 : left no%,15 : height no%,250 : width no%,width(0)-36
no%=no%+1 : Obj_Pan%=no% Panel no% : top no%,300 : left no%,15 : height no%,150 : width no%,300
no%=no%+1 : Obj_Edit%=no% Edit no% : parent no%,Obj_Pan% : top no%,5 : left no%,5
no%=no%+1 : Pan%=no% Panel no% : height no%,height(0)-38 : width no%,200 : top no%,0 :left no%,-190 color no%,200,200,200
no%=no%+1 : Obj_alpha1%=no% Alpha no% : parent no%,Pan% : top no%,height(Pan%)/2 : left no%,width(pan%)-10 :caption no%,">" font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic
end
clic: if t%=0 t%=1 for x%=1 to 190 left Pan%,left(Pan%)+1 next x% caption Obj_alpha1%,"<" else t%=0 for x%=1 to 190 left Pan%,left(Pan%)-1 next x% caption Obj_alpha1%,">" end_if return | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Un menu déroulant type "Side Bar" Mar 9 Déc 2014 - 14:15 | |
| Très intéressant, Ygeronimi ! Je vais voir comment combiner cela avec mon menu... | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Mar 9 Déc 2014 - 14:18 | |
| Style onglet : - Code:
-
dim no%,Obj_Memo%,Obj_Pan%,Obj_Edit%,Pan%(10),Obj_alpha%(10) dim clck%,x%,t% label clic
height 0,540 : width 0,700 font_name 0,"arial"
no%=no%+1 : Obj_alpha%(0)=no% alpha no% : top no%,10 : left no%,15 : caption no%,"Un Mémo :"
no%=no%+1 : Obj_Memo%=no% Memo no% : top no%,25 : left no%,15 : height no%,250 : width no%,width(0)-36
no%=no%+1 : Obj_Pan%=no% Panel no% : top no%,300 : left no%,15 : height no%,150 : width no%,300
no%=no%+1 : Obj_Edit%=no% Edit no% : parent no%,Obj_Pan% : top no%,5 : left no%,5
no%=no%+1 : Pan%(1)=no% Panel no% : height no%,100 : width no%,200 : top no%,0 :left no%,-190 color no%,200,200,200 no%=no%+1 : Obj_alpha%(1)=no% Alpha no% : parent no%,Pan%(1) : top no%,(height(Pan%(1))/2)-10 : left no%,width(pan%(1))-10 :caption no%,">" font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic
no%=no%+1 : Pan%(2)=no% Panel no% : height no%,100 : width no%,200 : top no%,100 :left no%,-190 color no%,250,200,200 no%=no%+1 : Obj_alpha%(2)=no% Alpha no% : parent no%,Pan%(2) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">" font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic
no%=no%+1 : Pan%(3)=no% Panel no% : height no%,100 : width no%,200 : top no%,200 :left no%,-190 color no%,200,250,200 no%=no%+1 : Obj_alpha%(3)=no% Alpha no% : parent no%,Pan%(3) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">" font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic
no%=no%+1 : Pan%(4)=no% Panel no% : height no%,100 : width no%,200 : top no%,300 :left no%,-190 color no%,200,200,250 no%=no%+1 : Obj_alpha%(4)=no% Alpha no% : parent no%,Pan%(4) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">" font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic
no%=no%+1 : Pan%(5)=no% Panel no% : height no%,100 : width no%,200 : top no%,400 :left no%,-190 color no%,250,250,200 no%=no%+1 : Obj_alpha%(5)=no% Alpha no% : parent no%,Pan%(5) : top no%,(height(Pan%(2))/2)-10 : left no%,width(pan%(2))-10 :caption no%,">" font_size no%,12 :font_bold no% : font_color no%,255,0,0 :cursor_point no% :on_click no%,clic end
clic: clck%=number_click if clck%=Obj_alpha%(1) :Show_slide_bar_menu(1,100,5):end_if if clck%=Obj_alpha%(2) :Show_slide_bar_menu(2,100,5):end_if if clck%=Obj_alpha%(3) :Show_slide_bar_menu(3,100,5):end_if if clck%=Obj_alpha%(4) :Show_slide_bar_menu(4,100,5):end_if if clck%=Obj_alpha%(5) :Show_slide_bar_menu(5,100,5):end_if return
Sub Show_slide_bar_menu(p%,e%,n%) dim_local i% if t%=0 t%=1 if p%>1 for i%=1 to (p%-1) : hide Pan%(i%) : next i% end_if if p%<n% for i%=p%+1 to n% : hide pan%(i%) : next i% end_if height Pan%(p%),height(0)-39 top Pan%(p%),0 for x%=1 to 190 left Pan%(p%),left(Pan%(p%))+1 next x% top Obj_alpha%(p%),(height(Pan%(p%))/2)-10 caption Obj_alpha%(p%),"<" else t%=0 for x%=1 to 190 left Pan%(p%),left(Pan%(p%))-1 next x% caption Obj_alpha%(p%),">" top Pan%(p%),e%*(p%-1) height Pan%(p%),100 top Obj_alpha%(p%),(height(Pan%(p%))/2)-10 for i%=1 to n% : show Pan%(i%) : next i% end_if End_sub Notez que ce sont des essais et qu' il faut mettre un peu d' ordre pour une utilisation pratique.
Dernière édition par ygeronimi le Mar 9 Déc 2014 - 18:43, édité 2 fois (Raison : Amelioration) | |
| | | Contenu sponsorisé
| Sujet: Re: Un menu déroulant type "Side Bar" | |
| |
| | | | Un menu déroulant type "Side Bar" | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |