Ändern der Titelbezeichnungen vom Programm-Menü

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Ändern der Titelbezeichnungen vom Programm-Menü

Beitrag 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 ?
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Versuchs mal mit einem "While WindowEvent():Wend" nach dem neu erstellen des Menü's.
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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  
Zuletzt geändert von Falko am 13.12.2004 12:23, insgesamt 7-mal geändert.
Bild
Win11 Pro 64-Bit, PB_6.11b1
FloHimself
Beiträge: 338
Registriert: 05.09.2004 18:47

Beitrag 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 
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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. :)
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
FloHimself
Beiträge: 338
Registriert: 05.09.2004 18:47

Beitrag 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
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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))
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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?
Zuletzt geändert von Falko am 12.12.2004 22:46, insgesamt 1-mal geändert.
Bild
Win11 Pro 64-Bit, PB_6.11b1
Antworten