kommt hier, bis es soweit ist, Abhilfe.
Bei Imagemenüs war es ein wenig knifflig, und ich weiss nicht,
ob ich das so mit dem LocalReAlloc_() einfach so machen kann/darf,
aber es funktioniert.
Der Index wird einfach immer, unabhängig von der ID, von 0 von oben nach unten gezählt.
Code: Alles auswählen
Procedure.s GetMenuItemTextEx(Menu, Item)
Protected menufile, minfo.MENUITEMINFO, a$
If IsMenu_(MenuID(Menu))
menufile = GetSubMenu_(MenuID(Menu), 0)
If Item < GetMenuItemCount_(menufile)
minfo\cbSize = SizeOf(MENUITEMINFO)
minfo\fmask = #MIIM_TYPE | #MIIM_DATA
GetMenuItemInfo_(menufile, Item, #True, @minfo)
If minfo\fType = 0
;Normal Menu
a$ = Space(256)
GetMenuString_(menufile, Item, @a$, 256, #MF_BYPOSITION)
ElseIf minfo\fType = #MFT_OWNERDRAW
;Image menu
If minfo\dwItemData
a$ = PeekS(PeekI(minfo\dwItemData))
EndIf
EndIf
EndIf
EndIf
ProcedureReturn a$
EndProcedure
Procedure SetMenuItemTextEx(Menu, Item, Text.s)
Protected menufile, minfo.MENUITEMINFO, *mem
If IsMenu_(MenuID(Menu))
menufile = GetSubMenu_(MenuID(Menu), 0)
If Item < GetMenuItemCount_(menufile)
minfo\cbSize = SizeOf(MENUITEMINFO)
minfo\fmask = #MIIM_TYPE | #MIIM_DATA
GetMenuItemInfo_(menufile, Item, #True, @minfo)
If minfo\fType = 0
;Normal Menu
minfo\fmask = #MIIM_STRING
minfo\fType = #MFT_STRING
minfo\dwTypeData = @Text
SetMenuItemInfo_(menufile, Item, #True, @minfo)
ElseIf minfo\fType = #MFT_OWNERDRAW
;Image menu
If minfo\dwItemData
*mem = PeekI(minfo\dwItemData)
If LocalSize_(*mem) < StringByteLength(Text) + SizeOf(CHARACTER)
*mem = LocalReAlloc_(*mem, StringByteLength(Text) + SizeOf(CHARACTER), #LMEM_MOVEABLE)
If *mem
PokeI(minfo\dwItemData, *mem)
EndIf
EndIf
If *mem
PokeS(*mem, Text)
SetMenuItemInfo_(menufile, Item, #True, @minfo)
EndIf
EndIf
EndIf
EndIf
EndIf
EndProcedure
Code: Alles auswählen
OpenWindow(0, 400, 200, 200, 100, "Menu Example")
CreateImageMenu(0, WindowID(0))
MenuTitle("Project")
MenuItem(1, "Open")
MenuItem(2, "Save")
MenuItem(3, "Save as")
OpenSubMenu("Bla")
MenuItem(4, "Blubb")
CloseSubMenu()
MenuItem(5, "Close")
Debug GetMenuItemTextEx(0, 3)
SetMenuItemTextEx(0, 3, "Affenbrotbäume wachsen nicht aufm Dachboden")
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow