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.
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.
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

. 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...
Nun habe ich die Wahl zwischen zwei Vorgehensweisen...

Verfasst: 12.12.2004 22:25
von Falko
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?