[bb] Advance PopupMenu by Red [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:41

Previous topic - Next topic

BlitzBot

Title : Advance PopupMenu
Author : Red
Posted : 1+ years ago

Description : [Blitz v1.34]
It works like B+ createmenu functions...
You could append popupmenus between them.
[a http://www.blitz3dfr.com/click/clic.php?url=http://perso.wanadoo.fr/eddy.dev/projet/Popup_Menu.rar]Download the example files[/a]
Bug fixed : AppendPopupMenu, SetPopupMenuState, modify state [May 22 2003]
;********************************
Userlib file :  /userlibs/user32.decls
;********************************
.lib "user32.dll"
TrackPopupMenuEx%( mnu,flags,x,y,hwnd,tpm )
CreatePopupMenu%()
AppendMenu%(mnu,flags,menuID,txt$):"AppendMenuA"
ModifyMenu%(mnu,pos,flags,menuID,txt$):"ModifyMenuA"
DestroyMenu%(mnu)

Code example :
;create window
Global WIN = CreateWindow("Easy PopupMenu",200,200,400,100,0,1)

;create popupmenu
Global POPUP = PopupMenu()
PopupMenu("checked",1,POPUP)
PopupMenu("grayed+disabled",2,POPUP)
PopupMenu("change text",3,POPUP)
PopupMenu("",0,POPUP)
item = PopupMenu("item test",4,POPUP)
UpdatePopupMenu POPUP

Global POPUP2 = PopupMenu()
PopupMenu("See Alpha...",10,POPUP2)
PopupMenu("See Numeric...",20,POPUP2)
PopupMenu("See nothing...",30,POPUP2)
item2 = PopupMenu("MORE ITEMS HERE",40,POPUP2)
UpdatePopupMenu POPUP2

Global POPUP3 = PopupMenu()
PopupMenu("A",101,POPUP3)
PopupMenu("B",102,POPUP3)
PopupMenu("C",103,POPUP3)
UpdatePopupMenu POPUP3

Global POPUP4 = PopupMenu()
PopupMenu("1",601,POPUP4)
PopupMenu("2",602,POPUP4)
item3 = PopupMenu("3",603,POPUP4)
UpdatePopupMenu POPUP4

ModifyPopupMenuState(item3,1)

;mainloop
Repeat
;Launch PopupMenu left click
If MouseHit(1)
menu_id=ShowPopupMenu(POPUP2,WIN)
If menu_id=10 Then AppendPopupMenu(item2,POPUP3)
If menu_id=20 Then AppendPopupMenu(item2,POPUP4)
If menu_id=30
detached_menu = DetachSubMenu(item2)
If detached_menu=POPUP3 Notify "you've detached POPUP 3 :)"
EndIf
SetStatusText WIN,"menuID="+menu_id
EndIf

;Launch PopupMenu right click
If MouseHit(2)
menu_id=ShowPopupMenu(POPUP,WIN)
If menu_id=1 Then ModifyPopupMenuState(item,1);checked
If menu_id=2 Then ModifyPopupMenuState(item,2);grayed+disabled
If menu_id=3 Then ModifyPopupMenuText(item,"text changed")
SetStatusText WIN,"menuID="+menu_id
EndIf

;Exit
If WaitEvent()=$803 Then End
Forever

Blitz functions : [/i]

Code :
Code (blitzbasic) Select
; ================================
; Load popupmenu
; ================================
Type POPUP_MENU
Field txt$ = ""
Field flag
Field menu_id = 0
Field popup.POPUP_MENU = Null
Field parent.POPUP_MENU = Null
Field root =  0
End Type

Function PopupMenu%(txt$="",menu_id=0,parent=0)
Local pm.POPUP_MENU=New POPUP_MENU
Local p.POPUP_MENU=Object.POPUP_MENU(parent)
If p=Null
;root
pmpopup=pm
pmparent=Null
Else
;link parent to root of new popupmenu
If ppopup=Null
ppopup=New POPUP_MENU
ppopupparent=Null
EndIf
;node
pm xt=txt
pmmenu_id=menu_id
pmparent=ppopup
EndIf

Local ppmenu=Handle(pm)
Return ppmenu
End Function

; ================================
; Create popupmenu
; ================================

Function UpdatePopupMenu(ppmenu)
Local MF_STRING = $0
Local MF_SEPARATOR = $800
Local MF_POPUP = $10

Local MF_DISABLED=$02
Local MF_GRAYED=$01
Local MF_CHECKED=$08

Local hmenu
Local pmRoot.POPUP_MENU=Object.POPUP_MENU(ppmenu)
Local pm.POPUP_MENU
Local submenu.POPUP_MENU

If pmRootparent<>Null RuntimeError "UpdatePopupMenu works only with popupmenu root !"

;create root
pmRootoot=CreatePopupMenu()

;create menu items
For pm=Each POPUP_MENU
 
If pmparent=pmRoot
;state of item
pmflag=pmflag And (MF_CHECKED Or MF_GRAYED Or MF_DISABLED)
If pm xt=""
pmflag=pmflag Or MF_SEPARATOR
Else
pmflag=pmflag Or MF_STRING
EndIf
If pmpopup<>Null
;create submenu
submenu=pmpopup
UpdatePopupMenu Handle(submenu)
;link to menu item
pmflag=pmflag Or MF_POPUP And ~MF_SEPARATOR
pmmenu_id=submenuoot
EndIf

;create item
hmenu=pmparentoot
AppendMenu hmenu,pmflag,pmmenu_id,pm xt$
EndIf
Next
End Function

; ================================
; Append a popupmenu
; ================================

Function AppendPopupMenu(ppmenu,ppmenuToAppend)
Local MF_BYPOSITION = $400

Local MF_STRING = $0
Local MF_POPUP = $10

Local hmenu
Local pm.POPUP_MENU=Object.POPUP_MENU(ppmenu)
Local pmA.POPUP_MENU=Object.POPUP_MENU(ppmenuToAppend)
Local pm_.POPUP_MENU

If pm=Null Or pmA=Null
RuntimeError "A parameter misses in AppendPopupMenu Call..."
EndIf
If pmparent=Null And pmApopupparent<>Null  
RuntimeError "AppendPopupMenu needs a popupmenu item and a popupmenu root !"
EndIf


;broke last link
DetachSubMenu ppmenu

;link
For pm_=Each POPUP_MENU
If pm_=pm
Exit
Else
If pm_parent=pmparent Then pos=pos+1
EndIf
Next
pmflag=MF_STRING Or MF_POPUP Or MF_BYPOSITION
pmpopup=pmA

;update item
hmenu=pmparentoot
ModifyMenu hmenu,pos,pmflag,pmpopupoot,pm xt

End Function

; ================================
; Detach a submenu
; ================================

Function DetachSubMenu%(ppmenu)
Local MF_STRING = $0
Local MF_POPUP = $10
Local MF_BYPOSITION = $400

Local pm_.POPUP_MENU
Local pm.POPUP_MENU=Object.POPUP_MENU(ppmenu)
Local pmD.POPUP_MENU

If pmparent=Null Then RuntimeError " DetachPopupMenu : it's a popupmenu root, there's nothing to detach !"

;link
For pm_=Each POPUP_MENU
If pm_=pm
Exit
Else
If pm_parent=pmparent Then pos=pos+1
EndIf
Next
pmD=pmpopup
pmpopup=Null
pmflag=MF_STRING Or MF_BYPOSITION

;update menu
DestroyMenu pmparentoot
UpdatePopupMenu Handle(pmparent)

;recreate submenu
If pmD<>Null
DestroyMenu pmDoot
UpdatePopupMenu Handle(pmD)
EndIf

Return Handle(pmD)
End Function

; ================================
; Modify text
; ================================

Function ModifyPopupMenuText$(ppmenu,txt$)
Local pm.POPUP_MENU=Object.POPUP_MENU(ppmenu)

If pmparent=Null Then RuntimeError "ModifyPopupMenuText does not work with popupmenu root !"

Local hmenu=pmparentoot
Local oldtxt$=pm xt
pm xt=txt
ModifyMenu hmenu,pmmenu_id,pmflag,pmmenu_id,pm xt

Return oldtxt$
End Function

; ================================
; Modify state
; ================================

Function ModifyPopupMenuState(ppmenu,state) ;1=checked ;2=grayed ;4=disabled
Local MF_DISABLED=$02
Local MF_GRAYED=$01
Local MF_CHECKED=$08
Local pm.POPUP_MENU=Object.POPUP_MENU(ppmenu)

If pmparent=Null Then RuntimeError "ModifyPopupMenuState does not work with popupmenu root !"

pmflag=0
If (state And $01) Then pmflag=MF_CHECKED
If (state And $02) Then pmflag=pmflag Or MF_GRAYED
If (state And $04) Then pmflag=pmflag Or MF_DISABLED

Local hmenu=pmparentoot
ModifyMenu hmenu,pmmenu_id,pmflag,pmmenu_id,pm xt

End Function

; ================================
; Get state
; ================================

Function GetPopupMenuState%(ppmenu)
Local MF_DISABLED=$02
Local MF_GRAYED=$01
Local MF_CHECKED=$08
Local pm.POPUP_MENU=Object.POPUP_MENU(ppmenu)

If pmparent=Null Then RuntimeError "ModifyPopupMenuState does not work with popupmenu root !"

If (pmflag And MF_CHECKED) Then state=1
If (pmflag And MF_GRAYED)  Then state=state Or 2
If (pmflag And MF_DISABLED) Then state=state Or 4

Return state
End Function

; ================================
; Show popupmenu at mouse position
; ================================

Function ShowPopupMenu%(ppmenu,win=0)
Local TPM_RETURNCMD = $100
Local pm.POPUP_MENU=Object.POPUP_MENU(ppmenu)
Local hmenu=pmoot

If win=0 Then win=ActiveWindow()

Local menu_id=TrackPopupMenuEx(hmenu,TPM_RETURNCMD,MouseX(),MouseY(),QueryObject(win,1),0)
Return menu_id
End Function


Comments : none...