Ändern der Titelbezeichnungen vom Programm-Menü
- 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ü
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 ?
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 ?
- 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:
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.Deeem2031 hat geschrieben:Versuchs mal mit einem "While WindowEvent():Wend" nach dem neu erstellen des Menü's.
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.
- 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:
@Andre
in etwa so? Schau dir alle klicks an und dann nochmal nach About.
Gruß Falko
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.
-
- Beiträge: 338
- Registriert: 05.09.2004 18:47
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
- 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:
@Flo: danke, die Lösung mit dem zweiten Menü macht genau was ich gesucht habe.
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.

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.

-
- Beiträge: 338
- Registriert: 05.09.2004 18:47
bitte!Andre hat geschrieben:@Flo: danke, die Lösung mit dem zweiten Menü macht genau was ich gesucht habe.![]()
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
- 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:
@Andre
Warum soll man nicht den Titel ändern können, wenn man das so abändert
. Steht auch in der API. Oder hab ich da was missverstanden?
Warum soll man nicht den Titel ändern können, wenn man das so abändert

Code: Alles auswählen
Case 14 ; Men_Wechseln
ModifyMenu_(hMenu, 1, #MF_BYPOSITION,2, "NeuerTitel")
DrawMenuBar_(WindowID(0))
- 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:
Dann ist ja alles ok
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?

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.