Seite 2 von 2

Re: Probleme bei ImageMenu mit Alt+Zeichen

Verfasst: 07.08.2011 15:19
von Danilo
STARGÅTE hat geschrieben:Ist das nun ein Fehler in Windows oder in PureBasic? Bug?
Das ist ein Fehler von PureBasic. Für Ownerdraw Menus muss PB intern auf
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
Allerdings komme ich einfach nicht ordentlich an den Text der MenuItems -
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.
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 :mrgreen: . Deshalb Ribbons und immer mehr der Übergang zum
Touchscreen.
Das Gegenteil ist der Fall. MS kümmert sich weiter um die Tastatur-Unterstützung,
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. ;)

Re: Probleme bei ImageMenu mit Alt+Zeichen

Verfasst: 07.08.2011 15:37
von ts-soft
Danilo hat geschrieben:und die neue Menu-Toolbar-Kombination bedienen lernen. ;)
Nein, möchte ich vermeiden, Ribbons sind oftmals nur schwer zur Erkennen, Menütexte kann ich leichter lesen.
Naja, wenn meine Augen besser wären, aber so behindern mich Ribbons nur, da schreib ich mir dann lieber
die Tastaturkürzel auf nen Zettel :mrgreen:
Abgesehen von den in Window 7 enthaltenen Programmen, die ich eh nicht nutze komme ich zur Zeit noch
recht selten mit diesen Ribbons in kontakt und das ist gut so.

Re: Probleme bei ImageMenu mit Alt+Zeichen

Verfasst: 07.08.2011 17:11
von c4s
@ts-soft
  • Es gibt noch wesentlich mehr TAB-Funktionen und allgemeine Standard-Tastenkürzel, die zwar in der Windows-Welt wohl bekannt sind, aber von PureBasic nicht unterstützt werden.
  • Schonmal probiert mit TAB zwischen den OptionGadgets zu wechseln?
  • Mal ist die Markierung von aktivierten Gadgets da, mal nicht. Scheinbar regelt PureBasic das nach Lust und Laune.
  • usw.
Es gibt noch mehr Ungereimtheiten, die mir aber momentan nicht einfallen.

Re: Probleme bei ImageMenu mit Alt+Zeichen

Verfasst: 07.08.2011 17:35
von ts-soft
Das mit dem Nichtsehen des Selektierten ist ein Windows Feature :mrgreen:
Kann man umschalten:

Code: Alles auswählen

SendMessage_(WindowID(ID), #WM_CHANGEUISTATE, 2 | (1 << 16), 0)
Damit OptionGadgets korrekt funktionieren, müssten Sie auf Fenstern mit DialogStil erstellt werden, die PB
aber gar nicht erstellt, was ich persönlich als gut empfinde, weil dieses dämliche unterschiedliche Verhalten
in den Messages, abhängig vom Stil kann einem zur Weißglut treiben :mrgreen:
Workaround hier: http://www.purebasic.fr/german/viewtopi ... 53#p286353

Re: Probleme bei ImageMenu mit Alt+Zeichen

Verfasst: 07.08.2011 18:44
von Danilo