Das ist ein Fehler von PureBasic. Für Ownerdraw Menus muss PB intern aufSTARGÅTE hat geschrieben:Ist das nun ein Fehler in Windows oder in PureBasic? Bug?
die Nachricht #WM_MENUCHAR reagieren und selbst einen entsprechenden
Eintrag auswählen.
Alles dokumentiert in MSDN. Ich denke die PB-Entwickler haben es einfach vergessen.
Hier ein Beispiel-Code wie es geht:
Code: Alles auswählen
Enumeration
#Window
#Menu
#MenuItem_New
#MenuItem_Open
#MenuItem_Save
#MenuItem_Sub1
#MenuItem_Sub2
EndEnumeration
Macro HIWORD(a) : ( (a >> 16) & $FFFF ) : EndMacro
Macro LOWORD(a) : ( a & $FFFF ) : EndMacro
Macro MAKELRESULT(a,b) : ( (b << 16) | (a & $FFFF) ) : EndMacro
;Structure MENUINFO
; cbSize.l
; fMask.l
; dwStyle.l
; cyMax.l
; hbrBack.i
; dwContextHelpID.l
; dwMenuData.i
;EndStructure
#MNC_EXECUTE = 2
#MNC_SELECT = 3
Procedure callback(WindowID, Message, wParam, lParam)
If Message = #WM_MENUCHAR And HIWORD(wParam) = #MF_POPUP
search$ = "&"+LCase(Chr(LOWORD(wParam)))
count = GetMenuItemCount_(lParam)
mii.MENUITEMINFO\cbSize = SizeOf(MENUITEMINFO)
For i = 0 To count-1
subMenu = GetSubMenu_(lParam,i)
If subMenu
item$ = Space(100)
GetMenuString_(lParam,GetMenuItemID_(lParam,i),@item$,Len(item$),#MF_BYCOMMAND)
Debug item$ ; empty -> HOW TO GET A OpenSubMenu() String for FindString() using search$ ???
ProcedureReturn MAKELRESULT(i,#MNC_EXECUTE)
Else
item$ = GetMenuItemText(#Menu, GetMenuItemID_(lParam,i))
If FindString(LCase(item$),search$,0)
ProcedureReturn MAKELRESULT(i,#MNC_EXECUTE)
EndIf
EndIf
Next i
EndIf
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
OpenWindow(#Window, 0, 0, 800, 600, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CreateImageMenu(#Menu, WindowID(#Window));,#PB_Menu_ModernLook)
;CreateMenu(#Menu, WindowID(#Window))
MenuTitle("&Datei")
MenuItem(#MenuItem_New, "&Neu")
MenuItem(#MenuItem_Open, "&Öffnen")
MenuItem(#MenuItem_Save, "&Speichern")
MenuBar()
OpenSubMenu("S&ub") ; begin sub-menu
MenuItem( #MenuItem_Sub1, "&abc")
MenuItem( #MenuItem_Sub2, "&def")
CloseSubMenu()
SetWindowCallback(@callback())
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Menu
Debug EventMenu()
EndSelect
ForEver
weiß nicht wo PB das intern speichert. GetMenuString_() und GetMenuItemInfo_()
geben mir keinen Text zurück.
Für die normalen Items habe ich hier den Text mit GetMenuItemText(#Menu, ...) geholt.
Achtung, #Menu ist hier fest eingebaut!
Für SubItems bekomme ich leider gar keinen Text und kann somit auch nicht
"&" + gedrückte Taste mit dem Text vergleichen.
Wer diese Methode selbst bei sich einbauen will, kann keine SubMenus verwenden.
Das PB-Team sollte das noch einbauen. Kann man als Bug oder missing Feature
melden, wobei das eigentlich -meiner Meinung nach- eher ein Fehler ist und schon
funktionieren sollte und könnte.
Das Gegenteil ist der Fall. MS kümmert sich weiter um die Tastatur-Unterstützung,ts-soft hat geschrieben:Im moment sieht es so aus, das MS Menüs und Tastatur-Unterstützung vernachlässigt, da der durchschnittliche
Windows-User damit wohl überfordert ist. Deshalb Ribbons und immer mehr der Übergang zum
Touchscreen.
und auch Ribbons kann man mit der Tastatur schnell steuern - auch mit ALT wie bisher Menus.
Siehe Beispielsweise dort: use-the-keyboard-to-work-with-ribbon-programs
Für mehr Infos mal selbst suchen nach "Ribbon Shortcuts" oder "Ribbon + keyboard"
und die neue Menu-Toolbar-Kombination bedienen lernen.
