PopupMenu avec Icônes et couleurs personnalisables

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

PopupMenu avec Icônes et couleurs personnalisables

Message par Le Soldat Inconnu »

Salut,

ce que je met en ligne ici, c'est l'ancien code de mon logiciel PopupMenu Edétiteur.

Ce code permet de réaliser des popupmenus avec icônes et couleur perso aussi facilement qu'un popupmenu classique.
mon code reprend toutes les fonction d'un popupmenu classiques (seulement moi, il faut rajouter un xp à la fin des fonctions). donc pour réaliser un popupmenu, c'est super simple et parès, mon code ce démerde pour réaliser, afficher et gérer le popupmenu

ce code est rapide et sans bug donc amusé vous bien

Code : Tout sélectionner

;- PopupMenuXP 

Structure VarPopupMenu 
  Txt.s 
  Type.l 
  Cible.l 
  ImgID.l 
  PosX.l 
  PosY.l 
  Taille.l 
  Largeur.l 
  Hauteur.l 
  Colonne.l 
  Affichage.l 
  Etat.l 
EndStructure 

Dim PopupMenu.VarPopupMenu(200, 9) 
Dim DimPopupMenu.l(9) 
Global NumPopupMenu.l, PosPopupMenu.l, NumSubMenu.l, PopupMenuFontID.l, PopupMenuWindow.l, PopupMenuLargeurEcran.l, PopupMenuHauteurEcran.l, PopupMenuReturn.l 
NumPopupMenu = -1 
#StartImg = 300 
#StartWindow = 100 

; >> couleur du popupmenu 
; ceci permet de personaliser la couleur de votre popupmenu 

Structure Color 
  Bordure.l 
  Bande.l 
  Fond.l 
  SelectionElement.l 
  SelectionMenu.l 
  Effet.l 
EndStructure 

Global PopupmenuColor.Color 

PopupmenuColor\Bordure = RGB(172, 168, 153) ; couleur de bordure du popupmenu 
PopupmenuColor\Bande = RGB(246, 243, 226) ; couleur de la bande servant à recevoir les icones 
PopupmenuColor\Fond = RGB(255, 255, 255) ; couleur du fond du popupmenu 
PopupmenuColor\SelectionElement = RGB(33, 165, 33) ; couleur quand la souris est au dessus d'un élément 
PopupmenuColor\SelectionMenu = RGB(130, 130, 130) ; couleur quand la souris est au dessus d'un menu ( RGB(49, 106, 197) ) 
PopupmenuColor\Effet = 0 ; Effet de relief si = 1 

; >> procedures 

Procedure CreatePopupMenuXP(n.l) 
  NumPopupMenu = n 
  PosPopupMenu = 0 
  NumSubMenu = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = "" 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\PosY = 3 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 3 
EndProcedure 

Procedure ClosePopupMenuXP() 
  PosPopupMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = "" 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -2 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 3 
  DimPopupMenu(NumPopupMenu) = PosPopupMenu 
  NumPopupMenu = -1 
EndProcedure 

Procedure OpenSubMenuXP(Text.s, ImageHandle.l) 
  PosPopupMenu + 1 
  NumSubMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = Text 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = NumSubMenu 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = ImageHandle 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 18 
  PosPopupMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = "" 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 3 
EndProcedure 

Procedure CloseSubMenuXP() 
  PosPopupMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = "" 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -2 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 3 
EndProcedure 

Procedure MenuBarXP() 
  PosPopupMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = "" 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -3 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 7 
EndProcedure 

Procedure NextMenuColXP() 
  ; fin de colonne 
  PosPopupMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = "" 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -4 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 3 
  
  ; debut nouvelle colonne 
  PosPopupMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = "" 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -5 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = -1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 3 
EndProcedure 

Procedure MenuItemXP(Target.l, Text.s, ImageHandle.l) 
  PosPopupMenu + 1 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Txt = Text 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Type = 0 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Cible = Target 
  PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID = ImageHandle 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = 18 
  PopupMenu(PosPopupMenu, NumPopupMenu)\Etat = 0 
  DimPopupMenu(NumPopupMenu) = PosPopupMenu 
EndProcedure 

Procedure SetMenuItemStateXP(n.l, Target.l, State.l) 
  For i = 0 To DimPopupMenu(n) 
    If Target = PopupMenu(i, n)\Cible 
      PopupMenu(i, n)\Etat = State 
    EndIf 
  Next 
EndProcedure 

Procedure.l GetMenuItemStateXP(n.l, Target.l) 
  For i = 0 To DimPopupMenu(n) 
    If Target = PopupMenu(i, n)\Cible 
      ProcedureReturn PopupMenu(i, n)\Etat 
    EndIf 
  Next 
EndProcedure 

Procedure DisableMenuItemXP(n.l, Target.l, State) 
  For i = 0 To DimPopupMenu(n) 
    If Target = PopupMenu(i, n)\Cible 
      PopupMenu(i, n)\Etat = State * 2 
    EndIf 
  Next 
EndProcedure 

Procedure PopupMenuSize(Depart.l) 
  Protected Position.l, nb.l, WidthPopupMenu.l, Retour.l, n.l, HightPopupMenu.l, Colonne.l, count.l 
  
  HightPopupMenu = 0 
  WidthPopupMenu = 0 
  Colonne = 0 
  
  Position = 3 
  n = PosPopupMenu + 1 
  
  Repeat 
    Retour = 0 
    n + 1 
    
    If PopupMenu(n, NumPopupMenu)\Type = -1 
      count = 1 
      Repeat 
        n + 1 
        If PopupMenu(n, NumPopupMenu)\Type = -1 
          count + 1 
        EndIf 
        If PopupMenu(n, NumPopupMenu)\Type = -2 
          count - 1 
        EndIf 
      Until count = 0 
      Retour = 1 
    Else 
      Position = Position + PopupMenu(n, NumPopupMenu)\Taille 
      If Position > HightPopupMenu : HightPopupMenu = Position : EndIf 
      If PopupMenu(n, NumPopupMenu)\Type = -4 
        Position = 0 
      EndIf 
    EndIf 
    
  Until PopupMenu(n, NumPopupMenu)\Type = -2 And Retour = 0 
  
  Position = 0 
  
  Repeat 
    Retour = 0 
    PosPopupMenu + 1 
    
    nb.l = TextLength(PopupMenu(PosPopupMenu, NumPopupMenu)\Txt) 
    If nb > WidthPopupMenu : WidthPopupMenu = nb : EndIf 
    
    PopupMenu(PosPopupMenu, NumPopupMenu)\PosX = Colonne 
    PopupMenu(PosPopupMenu, NumPopupMenu)\PosY = Position 
    Position = Position + PopupMenu(PosPopupMenu, NumPopupMenu)\Taille 
    
    If PopupMenu(PosPopupMenu, NumPopupMenu)\Type > 0 
      PopupMenuSize(PosPopupMenu + 1) 
      Retour = 1 
    ElseIf PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -4 
      PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = HightPopupMenu - Position + 3 
      Colonne + 1 
      Position = 0 
    EndIf 
    
  Until PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -2 And Retour = 0 
  
  PopupMenu(PosPopupMenu, NumPopupMenu)\Taille = HightPopupMenu - Position + 3 
  
  PopupMenu(Depart, NumPopupMenu)\Largeur = WidthPopupMenu + 42 
  PopupMenu(Depart, NumPopupMenu)\Hauteur = HightPopupMenu 
  PopupMenu(Depart, NumPopupMenu)\Colonne = Colonne 
  
EndProcedure 

Procedure CreatePopupMenuImage(Depart.l) 
  Protected WidthPopupMenu.l, Retour.l, HndDraw.l, HightPopupMenu.l, Colonne.l, Fin.l, Debut.l, nb.f, cte.f, relief.l 
  
  WidthPopupMenu = PopupMenu(Depart, NumPopupMenu)\Largeur 
  HightPopupMenu = PopupMenu(Depart, NumPopupMenu)\Hauteur 
  Colonne = PopupMenu(Depart, NumPopupMenu)\Colonne 
    
  relief = 3 * HightPopupMenu 
  If relief > 1000 
    relief = 1000 
  EndIf 
  
  Debut = 0 
  Fin = 1 
  
  Repeat 
    Retour = 0 
    PosPopupMenu + 1 
    
    If PopupMenu(PosPopupMenu, NumPopupMenu)\PosX > 0 
      Debut = 1 
    EndIf 
    If PopupMenu(PosPopupMenu, NumPopupMenu)\PosX = Colonne 
      Fin = 0 
    EndIf 
    
    Select PopupMenu(PosPopupMenu, NumPopupMenu)\Type 
        
      Case -1 
        CreateImage(#StartImg + PosPopupMenu, WidthPopupMenu, 3) 
        StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, 3, PopupmenuColor\Bordure) 
        Box(1, 1, WidthPopupMenu - 2 + Fin, 2, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 1, 20, 2, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 1 To 2 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        StopDrawing() 
        
      Case -2 
        CreateImage(#StartImg + PosPopupMenu, WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille) 
        StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille, PopupmenuColor\Bordure) 
        Box(1, 0, WidthPopupMenu - 2 + Fin, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 3, PopupmenuColor\Fond) 
        Box(1 - Debut, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 3, WidthPopupMenu - 2 + Debut + Fin, 2, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 0, 20, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 1, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 0 To PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 2 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        StopDrawing() 
        
      Case -3 
        CreateImage(#StartImg + PosPopupMenu, WidthPopupMenu, 7) 
        StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, 7, PopupmenuColor\Bordure) 
        Box(1, 0, WidthPopupMenu - 2 + Fin, 7, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 0, 20, 7, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 0 To 6 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        Line(23, 3, WidthPopupMenu - 26 + Fin, 0, PopupmenuColor\Bordure) 
        StopDrawing() 
        
      Case -4 
        CreateImage(#StartImg + PosPopupMenu, WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille) 
        StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille, PopupmenuColor\Bordure) 
        Box(1, 0, WidthPopupMenu - 2 + Fin, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 3, PopupmenuColor\Fond) 
        Box(1 - Debut, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 3, WidthPopupMenu - 2 + Debut + Fin, 2, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 0, 20, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 1, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 0 To PopupMenu(PosPopupMenu, NumPopupMenu)\Taille - 2 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        StopDrawing() 
        
      Case -5 
        CreateImage(#StartImg + PosPopupMenu, WidthPopupMenu, 3) 
        StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, 3, PopupmenuColor\Bordure) 
        Box(1 - Debut, 1, WidthPopupMenu - 2 + Debut + Fin, 2, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 1, 20, 2, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 1 To 2 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        StopDrawing() 
        
      Default 
        CreateImage(#StartImg + PosPopupMenu, WidthPopupMenu, 18) 
        HndDraw = StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, 18, PopupmenuColor\Bordure) 
        Box(1, 0, WidthPopupMenu - 2 + Fin, 18, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 0, 20, 18, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 0 To 17 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID > 0 
          DrawIconEx_(HndDraw, 3, 1, PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID, 16, 16, 0, 0, 3) 
        EndIf 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\Etat = 1 
          DrawingMode(2) 
          Line(7, 8, 3, 3) 
          Line(7, 9, 3, 3) 
          Line(7, 10, 3, 3) 
          Line(10, 11, 6, -6) 
          Line(10, 12, 6, -6) 
          Line(10, 13, 6, -6) 
        EndIf 
        Locate(26, 2) 
        DrawingMode(1) 
        FrontColor(0, 0, 0) 
        DrawingFont(PopupMenuFontID) 
        DrawText(PopupMenu(PosPopupMenu, NumPopupMenu)\Txt) 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\Type > 0 
          Line(WidthPopupMenu - 10, 6, 0, 7) 
          Line(WidthPopupMenu - 9, 7, 0, 5) 
          Line(WidthPopupMenu - 8, 8, 0, 3) 
          Line(WidthPopupMenu - 7, 9, 0, 1) 
        EndIf 
        StopDrawing() 
        
        CreateImage(#StartImg + PosPopupMenu + 200, WidthPopupMenu, 18) 
        HndDraw = StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, 18, PopupmenuColor\Bordure) 
        Box(1, 0, WidthPopupMenu - 2 + Fin, 18, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 0, 20, 18, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 0 To 17 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID > 0 
          DrawIconEx_(HndDraw, 3, 1, PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID, 16, 16, 0, 0, 3) 
        EndIf 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\Etat = 1 
          DrawingMode(2) 
          Line(7, 8, 3, 3) 
          Line(7, 9, 3, 3) 
          Line(7, 10, 3, 3) 
          Line(10, 11, 6, -6) 
          Line(10, 12, 6, -6) 
          Line(10, 13, 6, -6) 
        EndIf 
        DrawingMode(1) 
        Box(23, 0, WidthPopupMenu - 26, 18, 0) 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\Type = 0 
          Box(24, 1, WidthPopupMenu - 28, 16, PopupmenuColor\SelectionElement) 
        Else 
          Box(24, 1, WidthPopupMenu - 28, 16, PopupmenuColor\SelectionMenu) 
        EndIf 
        Locate(26, 2) 
        FrontColor(255, 255, 255) 
        DrawingFont(PopupMenuFontID) 
        DrawText(PopupMenu(PosPopupMenu, NumPopupMenu)\Txt) 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\Type > 0 
          Line(WidthPopupMenu + 12, 6, 0, 7) 
          Line(WidthPopupMenu + 13, 7, 0, 5) 
          Line(WidthPopupMenu + 14, 8, 0, 3) 
          Line(WidthPopupMenu + 15, 9, 0, 1) 
        EndIf 
        StopDrawing() 
        
        CreateImage(#StartImg + PosPopupMenu + 400, WidthPopupMenu, 18) 
        HndDraw = StartDrawing(ImageOutput()) 
        Box(0, 0, WidthPopupMenu, 18, PopupmenuColor\Bordure) 
        Box(1, 0, WidthPopupMenu - 2 + Fin, 18, PopupmenuColor\Fond) 
        If PopupmenuColor\Effet = 0 
          Box(1, 0, 20, 18, PopupmenuColor\Bande) 
        Else 
          couleur1.l = Red(PopupmenuColor\Bande) 
          couleur2.l = Green(PopupmenuColor\Bande) 
          couleur3.l = Blue(PopupmenuColor\Bande) 
          For n = 0 To 17 
            nb = (n + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY) / HightPopupMenu 
            cte = 0.55 * Pow(nb, 3) - 1.3 * Pow(nb, 2) + 0.45 * nb + 0.95 
            Line(1, n, 20, 0, RGB(couleur1 * cte, couleur2 * cte, couleur3 * cte)) 
            cte = 255 - relief * (nb - nb * nb) 
            Plot(21, n, RGB(cte, cte, cte)) 
          Next 
        EndIf 
        If PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID > 0 
          DrawIconEx_(HndDraw, 3, 1, PopupMenu(PosPopupMenu, NumPopupMenu)\ImgID, 16, 16, 0, 0, 3) 
        EndIf 
        Locate(26, 2) 
        DrawingMode(1) 
        FrontColor(172, 168, 153) 
        DrawingFont(PopupMenuFontID) 
        DrawText(PopupMenu(PosPopupMenu, NumPopupMenu)\Txt) 
        StopDrawing() 
        
    EndSelect 
    
    If PopupMenu(PosPopupMenu, NumPopupMenu)\Type > 0 
      CreatePopupMenuImage(PosPopupMenu + 1) 
      Retour = 1 
    EndIf 
    
  Until PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -2 And Retour = 0 
  
EndProcedure 

Procedure CreatePopupMenuWindow(Depart.l) 
  Protected Window.l, Retour.l, WidthPopupMenu.l 
  
  PopupMenuWindow + 1 
  Window = #StartWindow + PopupMenuWindow 
  WidthPopupMenu = PopupMenu(Depart, NumPopupMenu)\Largeur 
  
  OpenWindow(Window, 850, 150 + 130 * PopupMenuWindow, PopupMenu(Depart, NumPopupMenu)\Colonne * WidthPopupMenu + WidthPopupMenu, PopupMenu(Depart, NumPopupMenu)\Hauteur, #PB_Window_BorderLess | #PB_Window_Invisible, Str(Window)) 
  SetWindowPos_(WindowID(), -1, 0, 0, 0, 0, #SWP_NOSIZE | #SWP_NOMOVE) 
  SetWindowLong_(WindowID(), #GWL_EXSTYLE, GetWindowLong_(WindowID(), #GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW) ; choix de la barre d'outil réduite 
  
  CreateGadgetList(WindowID(Window)) 
  Repeat 
    Retour = 0 
    PosPopupMenu + 1 
    
    If PopupMenu(PosPopupMenu, NumPopupMenu)\Etat = 2 
      ImageGadget(#StartImg + PosPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosX * WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosY, PopupMenu(Depart, NumPopupMenu)\Largeur, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille, UseImage(#StartImg + PosPopupMenu + 400)) 
      SetWindowLong_(GadgetID(#StartImg + PosPopupMenu), #GWL_STYLE, GetWindowLong_(GadgetID(#StartImg + PosPopupMenu), #GWL_STYLE) & ~#SS_NOTIFY) 
    Else 
      ImageGadget(#StartImg + PosPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosX * WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosY, PopupMenu(Depart, NumPopupMenu)\Largeur, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille, UseImage(#StartImg + PosPopupMenu)) 
      SetWindowLong_(GadgetID(#StartImg + PosPopupMenu), #GWL_STYLE, GetWindowLong_(GadgetID(#StartImg + PosPopupMenu), #GWL_STYLE) & ~#SS_NOTIFY) 
    EndIf 
        
    If PopupMenu(PosPopupMenu, NumPopupMenu)\Type > 0 
      CreatePopupMenuWindow(PosPopupMenu + 1) 
      UseWindow(Window) 
      UseGadgetList(WindowID(Window)) 
      Retour = 1 
    EndIf 
    
  Until PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -2 And Retour = 0 
EndProcedure 

Procedure DisplayMenuWindow(Window.l, Depart.l, PosWinX.l, PosWinY.l, PosMenuX.l, PosMenuY.l, TailleX.l, TailleY.l) 
  Protected WinX.l, WinY.l, count.l, MouseX.l, MouseY.l, Retour.l, NewWinX.l, NewWinY.l, NewMenu.l 
  
  UseWindow(Window) 
  UseGadgetList(WindowID(Window)) 
  ActivateWindow() 
  MoveWindow(PosWinX, PosWinY) 
  HideWindow(Window, 0) 
  
  WinX = WindowWidth() 
  WinY = WindowHeight() 
  WidthPopupMenu = PopupMenu(Depart, NumPopupMenu)\Largeur 
  
  NewMenu = 0 
  
  Repeat 
    Event = WindowEvent() 
    
    ; position de la souris 
    GetCursorPos_(CursorPos.RECT) 
    MouseX = CursorPos\Left 
    MouseY = CursorPos\Top 
    
    PosPopupMenu = Depart 
    
    Repeat 
      PosPopupMenu + 1 
      Retour = 0 
      
      If PopupMenu(PosPopupMenu, NumPopupMenu)\Type >= 0 And PopupMenu(PosPopupMenu, NumPopupMenu)\Etat <> 2 
        If MouseY >= PosWinY + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY And MouseY < PosWinY + PopupMenu(PosPopupMenu, NumPopupMenu)\PosY + PopupMenu(PosPopupMenu, NumPopupMenu)\Taille And MouseX >= PosWinX + PopupMenu(PosPopupMenu, NumPopupMenu)\PosX * WidthPopupMenu And MouseX <= PosWinX + PopupMenu(PosPopupMenu, NumPopupMenu)\PosX * WidthPopupMenu + WidthPopupMenu 
          If PopupMenu(PosPopupMenu, NumPopupMenu)\Affichage = 0 
            PopupMenu(PosPopupMenu, NumPopupMenu)\Affichage = 1 
            ; FreeGadget(#StartImg + PosPopupMenu) 
            ; ImageGadget(#StartImg + PosPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosX * WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosY, PopupMenu(Depart, NumPopupMenu)\Largeur, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille, UseImage(#StartImg + PosPopupMenu + 300)) 
            SetGadgetState(#StartImg + PosPopupMenu, UseImage(#StartImg + PosPopupMenu + 200)) 
          EndIf 
          
          If PopupMenu(PosPopupMenu, NumPopupMenu)\Type = 0 
            If Event = #WM_LBUTTONDOWN 
              PopupMenuReturn = PopupMenu(PosPopupMenu, NumPopupMenu)\Cible 
            EndIf 
          Else 
            NewMenu = PosPopupMenu 
          EndIf 
          
        Else 
          If PopupMenu(PosPopupMenu, NumPopupMenu)\Affichage = 1 
            PopupMenu(PosPopupMenu, NumPopupMenu)\Affichage = 0 
            ; FreeGadget(#StartImg + PosPopupMenu) 
            ; ImageGadget(#StartImg + PosPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosX * WidthPopupMenu, PopupMenu(PosPopupMenu, NumPopupMenu)\PosY, PopupMenu(Depart, NumPopupMenu)\Largeur, PopupMenu(PosPopupMenu, NumPopupMenu)\Taille, UseImage(#StartImg + PosPopupMenu)) 
            SetGadgetState(#StartImg + PosPopupMenu, UseImage(#StartImg + PosPopupMenu)) 
          EndIf 
          
        EndIf 
      ElseIf PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -1 
        count = 1 
        Repeat 
          
          PosPopupMenu + 1 
          
          If PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -1 
            count + 1 
          EndIf 
          If PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -2 
            count - 1 
          EndIf 
          
        Until count = 0 
        Retour = 1 
      EndIf 
      
    Until PopupMenu(PosPopupMenu, NumPopupMenu)\Type = -2 And Retour = 0 
    
    If MouseX < PosWinX Or MouseX > PosWinX + WinX Or MouseY < PosWinY Or MouseY > PosWinY + WinY 
      If MouseX < PosMenuX Or MouseX > PosMenuX + TailleX Or MouseY < PosMenuY Or MouseY > PosMenuY + TailleY 
        PopupMenuReturn = -2 
      EndIf 
    EndIf 
    
    If NewMenu > 0 
      
      NewWinX = PosWinX + PopupMenu(NewMenu, NumPopupMenu)\PosX * WidthPopupMenu + WidthPopupMenu - 3 
      NewWinY = PosWinY + PopupMenu(NewMenu, NumPopupMenu)\PosY - 3 
      
      If NewWinX + PopupMenu(NewMenu + 1, NumPopupMenu)\Largeur * (PopupMenu(NewMenu + 1, NumPopupMenu)\Colonne + 1) > PopupMenuLargeurEcran 
        NewWinX = PosWinX + PopupMenu(NewMenu, NumPopupMenu)\PosX * WidthPopupMenu + 3 - PopupMenu(NewMenu + 1, NumPopupMenu)\Largeur * (PopupMenu(NewMenu + 1, NumPopupMenu)\Colonne + 1) 
      EndIf 
      If NewWinY + PopupMenu(NewMenu + 1, NumPopupMenu)\Hauteur > PopupMenuHauteurEcran 
        NewWinY = PosWinY + 3 - PopupMenu(NewMenu + 1, NumPopupMenu)\Hauteur + PopupMenu(NewMenu, NumPopupMenu)\PosY + PopupMenu(NewMenu, NumPopupMenu)\Taille 
      EndIf 
      
      DisplayMenuWindow(#StartWindow + PopupMenu(NewMenu, NumPopupMenu)\Type, NewMenu + 1, NewWinX, NewWinY, PosWinX + PopupMenu(NewMenu, NumPopupMenu)\PosX * WidthPopupMenu, PosWinY + PopupMenu(NewMenu, NumPopupMenu)\PosY, WidthPopupMenu, PopupMenu(NewMenu, NumPopupMenu)\Taille) 
      
      UseWindow(Window) 
      UseGadgetList(WindowID(Window)) 
      ActivateWindow() 
      If PopupMenuReturn = -2 
        PopupMenuReturn = -1 
      EndIf 
      NewMenu = 0 
      
    EndIf 
    
    If GetFocus_() <> WindowID() 
      PopupMenuReturn = -3 
    EndIf 
    
  Until Event = #PB_EventCloseWindow Or PopupMenuReturn <> - 1 
  
  HideWindow(Window, 1) 
  
EndProcedure 

Procedure DisplayPopupMenuXP(n.l, MouseX.l, MouseY.l) 
  NumPopupMenu = n 
  PopupMenuReturn = -1 
  
  PopupMenuFontID = LoadFont(0, "Tahoma", 8, #PB_Font_HighQuality) 
  If PopupMenuFontID = 0 
    PopupMenuFontID = LoadFont(0, "Arial", 8, #PB_Font_HighQuality) 
  EndIf 
  
  ; 
  CreateImage(#StartImg, 1, 1) 
  StartDrawing(ImageOutput()) 
  DrawingFont(PopupMenuFontID) 
  PosPopupMenu = -1 
  PopupMenuSize(0) 
  StopDrawing() 
  FreeImage(#StartImg) 
  
  ; création des images 
  PosPopupMenu = -1 
  CreatePopupMenuImage(0) 
  
  ; création des fenêtre 
  PosPopupMenu = -1 
  PopupMenuWindow = -1 
  CreatePopupMenuWindow(0) 
  
  ; on récupère la taille de l'écran 
  SystemParametersInfo_(#SPI_GETWORKAREA, 0, @Taille_Ecran.RECT, 0) 
  PopupMenuLargeurEcran = Taille_Ecran\Right - Taille_Ecran\Left 
  PopupMenuHauteurEcran = Taille_Ecran\Bottom - Taille_Ecran\Top 
  
  ; on positionne la fenêtre de départ 
  If MouseX = 0 And MouseY = 0 
    GetCursorPos_(CursorPos.RECT) 
    MouseX.l = CursorPos\Left - 3 
    MouseY.l = CursorPos\Top - 3 
  EndIf 
  
  If MouseX + PopupMenu(0, NumPopupMenu)\Largeur + 5 > PopupMenuLargeurEcran 
    MouseX = PopupMenuLargeurEcran - PopupMenu(0, NumPopupMenu)\Largeur - 5 
  EndIf 
  If MouseY + PopupMenu(0, NumPopupMenu)\Hauteur + 5 > PopupMenuHauteurEcran 
    MouseY = PopupMenuHauteurEcran - PopupMenu(0, NumPopupMenu)\Hauteur - 5 
  EndIf 
  If MouseX - 5 < 0 
    MouseX = 5 
  EndIf 
  If MouseY - 5 < 0 
    MouseY = 5 
  EndIf 
  
  DisplayMenuWindow(#StartWindow, 0, MouseX, MouseY, 0, 0, GetSystemMetrics_(#SM_CXSCREEN), GetSystemMetrics_(#SM_CYSCREEN)) 
  
  For n = 0 To PopupMenuWindow 
    CloseWindow(#StartWindow + n) 
  Next 
  For n = 0 To DimPopupMenu(NumPopupMenu) 
    FreeImage(#StartImg + n) 
    If PopupMenu(n, NumPopupMenu)\Type = -4 Or PopupMenu(n, NumPopupMenu)\Type = -2 
      PopupMenu(n, NumPopupMenu)\Taille = 3 
    EndIf 
    If PopupMenu(n, NumPopupMenu)\Type >= 0 
      FreeImage(#StartImg + n + 200) 
      FreeImage(#StartImg + n + 400) 
    EndIf 
  Next 
  NumPopupMenu = -1 
  
EndProcedure 














;- Test du PopupMenuXP 








; Réglage des couleurs (Optionnel) 

PopupmenuColor\Bordure = RGB(172, 168, 153) ; couleur de bordure du popupmenu 
PopupmenuColor\Bande = RGB(246, 243, 226) ; couleur de la bande servant à recevoir les icones 
PopupmenuColor\Fond = RGB(255, 255, 255) ; couleur du fond du popupmenu 
PopupmenuColor\SelectionElement = RGB(33, 165, 33) ; couleur quand la souris est au dessus d'un élément 
PopupmenuColor\SelectionMenu = RGB(130, 130, 130) ; couleur quand la souris est au dessus d'un menu ( RGB(49, 106, 197) ) 
PopupmenuColor\Effet = 0 ; Effet de relief si = 1 


; Debut de l'exemple 

CreatePopupMenuXP(1) 
; CreatePopupMenuXP(PopupMenuXP) 
; On crée un nouveau PopupMenuXP, il y a 10 PopupMenuXP disponible (de 0 à 9) 
; Le nombre d'élément maximum est de 200 par PopupMenuXP (Les séparations, débuts et fins de menu, etc... sont comptés comme des éléments) 

MenuItemXP(0, "Salut", ExtractSmallIconFile("C:\Program files\")) 
; MenuItemXP(Cible, Texte$, ImageID) 
; si ImageID = 0, on n'affiche pas d'image 

MenuItemXP(1, "Bonjour", 0) 

MenuBarXP() 
; Ligne de séparation 

OpenSubMenuXP("Menu 1", 0) 
; OpenSubMenuXP(Texte$, ImageID) 
; Ouvre un sous-menu 

MenuItemXP(3, "Re Salut", 0) 
DisableMenuItemXP(1, 3, 1) 
; DisableMenuItemXP(PopupMenuXP, Cible, Etat) 

NextMenuColXP() 

OpenSubMenuXP("Menu 3", 0) 

MenuItemXP(3, "Je me casse", 0) 

CloseSubMenuXP() 

MenuItemXP(4, "Re Bonjour", 0) 
SetMenuItemStateXP(1, 4, 1) 
; SetMenuItemStateXP(PopupMenuXP, Cible, Etat) 

CloseSubMenuXP() 
; Ferme un sous-menu 

NextMenuColXP() 
; Changement de colonne 

MenuItemXP(2, "Au revoir", ExtractSmallIconFile("C:\Program files\PureBasic\PureBasic.exe")) 

MenuBarXP() 

OpenSubMenuXP("Menu 2", 0) 

MenuItemXP(5, "A bientôt", 0) 

CloseSubMenuXP() 


ClosePopupMenuXP() 
; Il ne faut pas oublié de fermé le PopupMenuXP 

DisplayPopupMenuXP(1, 0, 0) 
; DisplayPopupMenuXP(PopupMenuXP, x, y) 
; Si x et y sont nuls, le PopupMenu est placé sous la souris. 


; Quand on clique sur un élément, PopupMenuReturn prends la valeur de la cible de l'Item cliqué 
If PopupMenuReturn >= 0 
  Debug PopupMenuReturn 
  
  ; A la fin du traitement du retour du menu, il faut penser à mettre PopupMenuReturn = -1 
  PopupMenuReturn = -1
EndIf
Dernière modification par Le Soldat Inconnu le ven. 28/janv./2005 21:00, modifié 1 fois.
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est vraiment bien ce programme, je ne sais pas si l'affichage est aussi bien sur win98, car je rencontre des problèmes dans un prog pour afficher des icones mais il manque pas un truc si je clique sur un item il se passe rien.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Excellent :D

mais surement moins bon que le nouveau code ( :?: )
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

C'est dommage que ce code ne simule pas le comportement d'un menu; tel qu'il est je le trouve difficilement exploitable (c'est un avis personnel).
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

oui mais c'est pas simple, le nouveau code est spécialisé pour mon logiciel PopupMenu Editeur et pas très exploitable ailleur, il faudrai que je prenne le temps de le mettre propre pour permettre une utilisation aisée ailleurs.

La différence, c'est essentiellement la rapidité du code pour afficher un menu avec un skin (dans celui-ci, y'a que les couleurs de personnalisable) et une meilleur gestion de l'animation du menu.
il est également possible de mettre des icônes 32*32 ou 16*16, ce sur quoi je me défoule en ce moment.
c'est d'ailleurs de la que vient mon problème de support des icônes XP de la part de la fonction SHGetFileInfo
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

tiens, je viens de regarder mon code ci dessus, elle est pas si vieille, cette version. il y a la possibilité de faire des colonnes, du relief, etc...
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Je me repete mais si on clique sur un item il se passe quoi?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Il renvoie le numéro de l'item cliqué dans la variable globale PopupMenuReturn

en fait, on affiche le menu avec DisplayPopupMenuXP(1, 0, 0)
et direct derrière, on teste la valeur de PopupMenuReturn
si elle est négative, pas d'item du menu cliqué
sinon, on a le numéro de l'item cliqué dans PopupMenuReturn

ça donne un truc du genre

Code : Tout sélectionner

CreatePopupMenuXP(1)
MenuItemXP(#Item1, "Bonjour", 0)
MenuItemXP(#Item2, "Au revoir", 0)
ClosePopupMenuXP()

DisplayPopupMenuXP(1, 0, 0)
Select PopupMenuReturn
  Case #Item1
    debug "Appui sur Bonjour"
  Case #Item2
    debug "Appui sur Au revoir"
EndSelect
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

J'ai bien compris mais ça fonctionne pas, m'enfin c'est pas grave.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

8O je regarde

trouvé l'erreur, c'est à cause de la dernière version de PB sur les ImageGadget, c'est pas très grave, je corrige et je mets en ligne
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

c'est OK :wink:
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre