Seite 1 von 1

[Win] Set/GetMenuItemTextEx()

Verfasst: 02.09.2009 16:57
von HeX0R
Da es leider immernoch keine Möglichkeit gibt, die Texte eines Submenüs nachträglich zu ändern,
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
Ein Beispiel:

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