Code: Select all
EnableExplicit
Enumeration
#Win
#Canvas
EndEnumeration
Enumeration
#Pop
EndEnumeration
Enumeration 1000
#MI_Toggle
EndEnumeration
; --- WinAPI: MENUITEMINFO (minimal, damit SetMenuItemInfo_() sauber klappt)
Structure MENUITEMINFO_PB Align #PB_Structure_AlignC
cbSize.l
fMask.l
fType.l
fState.l
wID.i
hSubMenu.i
hbmpChecked.i
hbmpUnchecked.i
dwItemData.i
dwTypeData.i
cch.l
hbmpItem.i
EndStructure
#MIIM_BITMAP = $00000080
Procedure SetMenuItemBitmap(Menu, ItemID, hBitmap.i)
Protected mii.MENUITEMINFO_PB
mii\cbSize = SizeOf(MENUITEMINFO_PB)
mii\fMask = #MIIM_BITMAP
mii\hbmpItem = hBitmap
SetMenuItemInfo_(MenuID(Menu), ItemID, #False, @mii) ; by command (ID), nicht by position
EndProcedure
Procedure.i MakeCheckedIcon(SrcImg, DstImg = #PB_Any)
Protected out = CopyImage(SrcImg, DstImg)
If StartDrawing(ImageOutput(out))
DrawingMode(#PB_2DDrawing_AlphaBlend)
; kleines “Badge” links oben (optional, hilft Kontrast)
Box(0, 0, 8, 8, RGBA(0, 0, 0, 110))
; Häkchen (2px “dick” durch doppelte Linien)
Protected c = RGBA(255, 255, 255, 235)
LineXY(1, 4, 3, 6, c) : LineXY(1, 5, 3, 7, c)
LineXY(3, 6, 7, 2, c) : LineXY(3, 7, 7, 3, c)
StopDrawing()
EndIf
ProcedureReturn out
EndProcedure
; --- Demo-Icons (16x16)
Procedure.i MakeBaseIcon(Color.l, Img = #PB_Any)
Protected out = CreateImage(Img, 16, 16, 32, RGBA(0,0,0,0))
If StartDrawing(ImageOutput(out))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,16,16, RGBA(0,0,0,0))
Box(1,1,14,14, Color)
StopDrawing()
EndIf
ProcedureReturn out
EndProcedure
; ---------------- Main ----------------
If OpenWindow(#Win, 0, 0, 360, 220, "PopupImageMenu – Checked Workaround", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(#Canvas, 0, 0, WindowWidth(#Win), WindowHeight(#Win))
If StartDrawing(CanvasOutput(#Canvas))
DrawText(12, 12, "Rechtsklick hier -> Popup-Menü. Item toggelt + Icon zeigt Häkchen.", RGB(30,30,30))
StopDrawing()
EndIf
; Images: normal + checked (mit Overlay)
Define imgNormal = MakeBaseIcon(RGBA(0,120,215,255))
Define imgChecked = MakeCheckedIcon(imgNormal)
; Popup-Menu
CreatePopupImageMenu(#Pop)
MenuItem(#MI_Toggle, "Option (sichtbar checked)", ImageID(imgNormal))
; initial checked
SetMenuItemState(#Pop, #MI_Toggle, 1)
SetMenuItemBitmap(#Pop, #MI_Toggle, ImageID(imgChecked))
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
If EventGadget() = #Canvas And EventType() = #PB_EventType_RightClick
DisplayPopupMenu(#Pop, WindowID(#Win))
EndIf
Case #PB_Event_Menu
Select EventMenu()
Case #MI_Toggle
Define newState = Bool(GetMenuItemState(#Pop, #MI_Toggle) = 0)
SetMenuItemState(#Pop, #MI_Toggle, newState)
If newState
SetMenuItemBitmap(#Pop, #MI_Toggle, ImageID(imgChecked))
Else
SetMenuItemBitmap(#Pop, #MI_Toggle, ImageID(imgNormal))
EndIf
EndSelect
Case #PB_Event_CloseWindow
Break
EndSelect
ForEver
EndIf