Seite 1 von 2

Ändern der Titelbezeichnungen vom Programm-Menü

Verfasst: 12.12.2004 15:38
von Andre
Folgendes Problem:
Für "Real-Time" Änderung der Lokalisierung eines Programms muss ich neben der Änderung der Gadget-Beschriftung (z.B. mittels SetGadgetText) auch die Bezeichnungen aller Menü-Punkten ändern, d.h. Menütitel und Menüeinträge.

Die einfachste Variante ist einfach das Menü mit den geänderten Bezeichnungen neu zu erstellen. So habe ich es momentan gelöst. Dies hat jedoch einen unschönen graphischen Effekt, da für den Anwender sichtbar erst das Menü kurz verschwindet und dann wieder neu aufgebaut wird.

Um dies zu vermeiden, gibt es zwei Möglichkeiten:
1.) "Einfrieren" des Programmfensters während der Menü-Änderung, um den o.g. Effekt zu vermeiden.

2.) Die andere Variante wäre, die Menü-Bezeichnungen "on-the-fly", also ohne Freigabe und Neuerstellen des Menüs zu ändern. Dies geht für Menü-Einträge auch recht einfach, dank ModifyMenu_() aus der WinAPI (Beispiel siehe h i e r). Dieser Befehl ist jedoch offensichtlich nicht für das Ändern der Titel-Bezeichnungen im Menü gedacht. Eine Alternative habe ich nicht gefunden.


Frage: Kennt jemand zu 1.) oder 2.) eine Lösungsmöglichkeit ?

Verfasst: 12.12.2004 15:42
von Deeem2031
Versuchs mal mit einem "While WindowEvent():Wend" nach dem neu erstellen des Menü's.

Verfasst: 12.12.2004 16:23
von Andre
Deeem2031 hat geschrieben:Versuchs mal mit einem "While WindowEvent():Wend" nach dem neu erstellen des Menü's.
Das kann's nicht sein, da ich ja nicht auf das "Neuzeichnen" warten möchte, sondern genau das Neuzeichnen während dem Freigeben + Neuerstellen des Menüs unterdrücken möchte.

Denn momentan sieht der User ja, wie das alte Menü verschwindet (damit auch der weitere Fensterinhalt ein Stück nach oben rutscht) und dann das neu erstellte Menü wieder erscheint (und der weitere Fensterinhalt wieder nach unten verschoben wird).

Darum möchte ich eben das Neuzeichnen des Fensters während der Menü-Änderungen komplett unterdrücken oder eben per WinAPI die Menüeinträge (das geht ja mit ModifyMenu) und die Menütitel (offen) umbenennen.

Verfasst: 12.12.2004 17:06
von Falko
@Andre
in etwa so? Schau dir alle klicks an und dann nochmal nach About.
Gruß Falko

Code: Alles auswählen

; 
; ------------------------------------------------------------ 
; 
;   PureBasic - Menu example file 
; 
;    (c) 2003 - Fantaisie Software 
; 
; ------------------------------------------------------------ 
; 

; 
; We just have to open a window and see when an event happen on the menu 
; MenuEintrag tauschen, hinzufügen und löschen. 

If OpenWindow(0, 100, 150, 195, 260, #PB_Window_SystemMenu, "PureBasic - Menu") 

  ; 
  ; Create the menu. The indent is very important here for a good lisibility 
  ; 

  hMenu = CreateMenu(0, WindowID()) 
  If hMenu 
    MenuTitle("&File") 
      MenuItem( 1, "&Load...") 
      MenuItem( 2, "&Save") 
      MenuItem( 3, "Save &As...") 
      MenuBar() 
      OpenSubMenu("&Recents") 
        MenuItem( 5, "C:\Autoexec.bat") 
        MenuItem( 6, "D:\Test.txt") 
        OpenSubMenu("&Even more !") 
          MenuItem( 12, "&Test") 
        CloseSubMenu() 
        MenuItem( 13, "C:\Ok.bat") 
      CloseSubMenu() 
      MenuBar() 
      MenuItem( 7, "&Quit") 

    MenuTitle("&Edition") 
      MenuItem( 8, "Cu&t") 
      MenuItem( 9, "&Copy") 
      MenuItem(10, "&Paste") 
      
    MenuTitle("?") 
      MenuItem(11, "&About") 
      MenuItem(14, "Men&Wechseln") 
      MenuItem(15, "Men&Hinzufügen") 
      MenuItem(16, "&Menlöschen")
      MenuItem(17, "Men&disabled/enabled") 
  EndIf 
  
  DisableMenuItem(3, 1) 
  DisableMenuItem(13, 1) 
  
  ; 
  ; This is the 'event loop'. All the user actions are processed here. 
  ; It's very easy to understand: when an action occurs, the EventID 
  ; isn't 0 and we just have to see what have happened... 
  ; 
 SetMenuDefaultItem_(hMenu,1,1); setzt den 2. Titel-Text als default  
 HiliteMenuItem_(WindowID(0),hMenu,0,#MF_BYPOSITION| #MF_HILITE); markiert den ersten Titel
 CheckMenuItem_(hMenu,1,#MF_BYCOMMAND|#MF_CHECKED); Häkchen auf Load setzen
 DrawMenuBar_(WindowID(0))
 Dummy=1
  Repeat 

    Select WaitWindowEvent() 
       Case #PB_EventMenu 
       Select EventMenuID()  ; To see which menu has been selected 

          Case 14 ; Men_Wechseln 
            ModifyMenu_(hMenu, 1, #MF_BYPOSITION,1, "&Editieren"); Titel in Deutsch ersetzen
            ModifyMenu_(hMenu, 1, #MF_BYCOMMAND,1, "&Datei Laden");Item in Deutsch ersetzen
          Case 15 ; Men_Hinzufügen 
            InsertMenu_(hMenu,3,#MF_BYPOSITION ,18,"&Hinzugefügt");Titel erweitern 
          Case 16 ; Men_Hinzufügen_löschen 
            DeleteMenu_(hMenu,3,#MF_BYPOSITION);Titel löschen
          Case 17 ; Men_Hinzufügen_löschen 
            Dummy=Dummy*-1
            If Dummy=-1
              Maker=#MF_GRAYED
            Else
              Maker=#MF_ENABLED
            EndIf
            EnableMenuItem_(hMenu,1,#MF_BYPOSITION|Maker);Titel disabled oder #MF_DISABLED #MF_ENABLED		
          Default 
            MessageRequester("Info", "MenuItem: "+Str(EventMenuID()), 0) 
          EndSelect 
          DrawMenuBar_(WindowID(0))
      Case #WM_CLOSE ; #PB_EventCloseWindow 
        Quit = 1 

    EndSelect 

  Until Quit = 1 

EndIf 

End  

Verfasst: 12.12.2004 17:18
von FloHimself

Code: Alles auswählen

OpenWindow(0, 0,0, 150, 200, #PB_Window_ScreenCentered|#PB_Window_SystemMenu, "Menu") 

  hMenu_Deutsch.l = CreateMenu(1, WindowID())
  MenuTitle("Datei")    
  MenuTitle("Einstellungen")
  MenuItem(1, "Englische Menüs")
  
  hMenu_English.l = CreateMenu(2, WindowID())
  MenuTitle("File")    
  MenuTitle("Options")    
  MenuItem(1, "German Menus")

Repeat 
  Select WaitWindowEvent() 
    Case #PB_EventCloseWindow: End 
    Case #PB_EventMenu
      If flag = 0
        SetMenu_(WindowID(0), hMenu_Deutsch)
        flag = 1
      Else 
        SetMenu_(WindowID(0), hMenu_English)
        flag = 0
      EndIf
      
  EndSelect 
ForEver 

Verfasst: 12.12.2004 21:36
von Andre
@Flo: danke, die Lösung mit dem zweiten Menü macht genau was ich gesucht habe. :mrgreen:

Dieser Code ist jetzt "bloß" noch entsprechend anzupassen, um für die unbekannte (und theoretisch unbegrenzte) Anzahl an verschiedenen Sprachen zu funktionieren. Aber das krieg ich mit der grundlegenden Idee auch selber hin... :)

@Falko: diese Funktionen waren mir bekannt, ändern aber eben nur Menü-Einträge und nicht den Titel. Aber trotzdem danke. :)

Verfasst: 12.12.2004 21:45
von FloHimself
Andre hat geschrieben:@Flo: danke, die Lösung mit dem zweiten Menü macht genau was ich gesucht habe. :mrgreen:

Dieser Code ist jetzt "bloß" noch entsprechend anzupassen, um für die unbekannte (und theoretisch unbegrenzte) Anzahl an verschiedenen Sprachen zu funktionieren. Aber das krieg ich mit der grundlegenden Idee auch selber hin... :)
bitte! ;) genau wegen diesem "bloß" hab ich damit in diesem beispiel gar nicht erst angefangen :P

Verfasst: 12.12.2004 21:46
von Falko
@Andre
Warum soll man nicht den Titel ändern können, wenn man das so abändert :mrgreen: . Steht auch in der API. Oder hab ich da was missverstanden?

Code: Alles auswählen

Case 14 ; Men_Wechseln 
            ModifyMenu_(hMenu, 1, #MF_BYPOSITION,2, "NeuerTitel") 
            DrawMenuBar_(WindowID(0))

Verfasst: 12.12.2004 21:52
von Andre
@Falko: Hast Recht, #MF_BYPOSITION anstelle von #MF_BYCOMMAND macht den Unterschied. Dann gehts auch mit dem Titel... :wink:

Nun habe ich die Wahl zwischen zwei Vorgehensweisen... :D

Verfasst: 12.12.2004 22:25
von Falko
Dann ist ja alles ok 8)

Habe noch was oben ergänzt. Wäre doch ganz schön wenn diese
MenüBefehle auch im nächsten PB-Update ergänzt werden könnten. :)
MfG Falko

[Edit] Was aber fehlt, sind die Shortcuts, die bei der Mausbetätigung
nicht angezeigt werden, sondern erst dann, wenn ich die ALT+Tastenkürzel
per Tastatur anwähle. Eigendlich müßte man vorher wissen, welche Taste
im Menü zugeordnet ist, oder?