PopupMenu avec Icônes et couleurs personnalisables
Publié : jeu. 29/janv./2004 10:47
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
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