A MenuBar() made it crash and some adjustments. Here is the new code.
Code: Select all
; Example Of Another MenuItem Help
; (c) 2003 - By FSW ; http://forums.purebasic.com/english/viewtopic.php?p=39116
;
; do whatever you want with it
; 20160801 adapted by Al_the_dutch; a.o. the use of FangBeast's GetStatusBarText to save&restore the text
; and being able to have the helpitems in the same location as the menuitems itself.
; do whatever you want with it
EnableExplicit
#Window = 4900
#MenuFocus = 287
#Menu = 4900
#MenuOffset = 4900
#MenuTitles = 100
Enumeration #MenuOffset ; 4900
#Menu1
#Menu2
#Menu3
#Menu4
#Menu5
#Menu6
#StatusBar
EndEnumeration
#MenuLast = #Menu6 ; set it to the last #Menu
Global Dim MenuHelp.s(#MenuLast - #MenuOffset + #MenuTitles) ; The first 100 are for the MenuTitle's
;==========================================================================================================================
; Get the text from a specified statusbar and field in that statusbar
; From Fangbeast in http://www.forums.purebasic.com/english/viewtopic.php?f=13&t=45850
;==========================================================================================================================
Procedure.s GetStatusBarText(StatusbarNumber, FieldNumber)
Protected StringBufferLength.l, StringBuffer.s
StringBufferLength = SendMessage_(StatusBarID(StatusbarNumber), #SB_GETTEXTLENGTH, FieldNumber, 0)
If StringBufferLength
StringBuffer = Space(StringBufferLength)
SendMessage_(StatusBarID(StatusbarNumber), #SB_GETTEXT, FieldNumber, @StringBuffer)
If StringBuffer
ProcedureReturn PeekS(@StringBuffer)
Else ; Return an empty string as nothing was retrieved despite the buffer length being initialised
ProcedureReturn ""
EndIf
Else
ProcedureReturn "There are no characters to be retrieved"
EndIf
EndProcedure ; GetStatusBarText
;==========================================================================================================================
; END Fangbeast
;==========================================================================================================================
Procedure LoWord (var)
ProcedureReturn var & $FFFF
EndProcedure ; LoWord
Procedure MyWindowCallback(WindowID.l, Message.l, wParam.l, lParam.l)
Static OldText$, bGotItAlready.b = #False
Protected wParamLo.w, lParamLo.w
If Not bGotItAlready
OldText$ = GetStatusBarText(#StatusBar, 0)
bGotItAlready = #True
EndIf
wParamLo = LoWord(wParam)
lParamLo = LoWord(lParam)
If wParamLo < 0 Or wParamLo - #MenuOffset + #MenuTitles > ArraySize(MenuHelp()) ; 20160802 MenuBar ed
ProcedureReturn #PB_ProcessPureBasicEvents
EndIf
If Message = #MenuFocus And wParamLo <= #MenuTitles
StatusBarText(#StatusBar, 0, MenuHelp(wParamLo),#PB_StatusBar_Center)
ElseIf Message = #MenuFocus
StatusBarText(#StatusBar, 0, MenuHelp(wParamLo - #MenuOffset + #MenuTitles),#PB_StatusBar_Center)
ElseIf Message = 32
If lParamLo = 5 ; menu
StatusBarText(#StatusBar, 0, "Choose the menu item to get details",#PB_StatusBar_Center)
ElseIf lParamLo = 1 ; client area ; you need this to cancel the text
StatusBarText(#StatusBar, 0, OldText$)
EndIf
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure ; MyWindowCallback
Procedure MenuItemHelp(Item.l, Txt$)
If Item <= #MenuTitles
MenuHelp(Item) = Txt$
Else
MenuHelp(Item - #MenuOffset + #MenuTitles) = Txt$
EndIf
EndProcedure ; MenuItemHelp
;Main
If OpenWindow(#Window,0,0,320,240,"Menu Help Text In Statusbar", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CreateMenu(#Menu,WindowID(#Window))
MenuTitle("File")
MenuItemHelp(0, "File Title: Help Text")
MenuItem(#Menu1,"File 1")
MenuItemHelp(#Menu1, "File 1: Help Text")
MenuBar()
MenuItem(#Menu2,"File 2")
MenuItemHelp(#Menu2, "File 2: A Much Longer Help Text")
MenuItem(#Menu3,"File 3")
MenuItemHelp(#Menu3, "File 3: This Is The Longest Help Text. Believe Me!")
MenuTitle("Edit")
MenuItemHelp(1, "Edit Title: Help Text")
MenuItem(#Menu4,"Edit 1")
MenuItemHelp(#Menu4, "Edit 1: Help Text")
MenuItem(#Menu5,"Edit 2")
MenuItemHelp(#Menu5, "Edit 2: A Much Longer Help Text")
MenuItem(#Menu6,"Edit 3")
MenuItemHelp(#Menu6, "Edit 3: This Is The Longest Help Text. Believe Me!")
CreateStatusBar(#StatusBar, WindowID(#Window))
AddStatusBarField(#PB_Ignore) ; automatically resize this field ;20160801 added
StatusBarText(#StatusBar, 0, "The current statusbar text",#PB_StatusBar_Center) ;20160801 added
SetWindowCallback(@MyWindowCallback())
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End ; EndItAll