Stringtable
-
Hi
~Christian schrieb:
Leider kennt er aber AfxLoadLibrary() nicht! Muß ich da noch was includen??
Jep, du musst MFC verwenden
("afxwin.h")Und wo muß dieses Codestück hin?? In InitInstance()??!
Wie du willst, am sinnvollsten wäre natürlich InitInstance()
Benutzt doch lieber die WinAPI Methode (=>LoadLibrary).
Leg eine Memberviable in deiner App Klasse an (Typ: HINSTANCE), dann kannst du von überall darauf zugreifen
Schreib in InitInstance z.B. soetwas:m_hInstance = LoadLibrary("LangDE.dll"); // einen String aus der Stringtable aus der DLL lesen und ausgeben char cMsgBoxText[50]; ::LoadString(m_hInstance, IDS_MSGBOX_TITLE, cMsgBoxText, 50); AfxMessageBox(cMsgBoxText);Grüße Rapha
-
Super, hat einwandfrei funktioniert! Jetzt hab ich nur noch ein Problem: Der Benutzer wählt im ersten Dialog die Sprache aus, alle anderen Dialoge erscheinen dann auch korrekt in der Sprache, sie werden ja auch erst danach geladen. Nur der erste Dialog behält immer die voreingestellte Sprache, da er ja schon geladen wurde. Ich müßte ihn also nochmal neu laden. Geht das irgendwie??!
-
Mach dir da doch kein Problem draus.
Mach einfach ein Dialog, wo der User auf die entsprechende Flagge des Landes klickt.
Lass einfach jede Spach-dll ein Bitmap exportieren, das die Flagge darstellt.Grüße Rapha
-
Das Problem ist halt dass der Dialog nicht nur zur Sprachauswahl dient sondern auch noch andere Dinge angezeigt werden!
-
Trotzdem ist es doch kein Problem, diesen Direkt aus der Dll zu laden, oder?
-
Habs hinbekommen, hab mir folgende Methode geschrieben:
void CSoftDlg::Textzuweisungen() { CString str; str.LoadString(IDD_DIALOG); this->SetWindowText(str); str.LoadString(IDC_TEXT1); GetDlgItem(IDC_BUTTON1)->SetWindowText(str); str.LoadString(IDC_BUTTON1); GetDlgItem(IDC_BUTTON2)->SetWindowText(str); usw. }Und diese ruf ich einfach in OnPaint() auf. Wenn eine andere Sprache gewählt wird ruf ich
this->Invalidate();auf und der Ihalt wird aktualisiert

-
Hm, das ist aber ein bisschen eine Systembremse

Jedes Mal, wenn OnPaint aufgeruft wird (glaub mir, das kommt normalerweise oft vor), greifst du auf die dll zu und setzt die Texte
Es reicht doch, wenn du den Code in eine Funktion packst und diese Funktion in InitDialog aufrufst
Grüße Rapha
-
Wenn ich die Methode in InitialDialog() aufrufe wird allen Elemnten die Sprache beim Initialisieren des Dialogfeldes zugewiesen. Initialisiert wird es aber nur einmal. Die Sprache soll jedoch auch umgestellt werden können wenn das Dialogfeld bereits angezeigt wird, also quasi "on the fly". Das geht also nicht per InitialDialog(). Außerdem wird ja nicht jedesmal die DLL aufgerufen, die wird nur aufgerufen wenn der Anwender die Sprache ändert, es werden nur die Stings aus dem Stringtable gelesen und zugewiesen.
-
Hi
~Christian schrieb:
Und diese ruf ich einfach in OnPaint() auf.
Du schreibst doch, dass du die Funktion in OnPaint aufrufst (und OnPaint wird oft aufgerufen). Ruf sie doch einmal in OnInitDialog auf und wenn der User die Sprache ändert.

Grüße Rapha
-
Jetzt versteh ich was du meinst! OnInitDialog() manuell aufrufen und nicht beim initialisieren des Dialogs!! Das geht auch, stimmt! *vomschlauchruntergeh*
-
~Christian schrieb:
Jetzt versteh ich was du meinst! OnInitDialog() manuell aufrufen und nicht beim initialisieren des Dialogs!! Das geht auch, stimmt! *vomschlauchruntergeh*
Nene, tu das bloß nicht

Also, OnInitDialog wird ja ein mal aufgerufen (beim erstellen des Dialogs).
Damit der Dialog die richtige Sprache hat, rufst du logischerweise darin die Funktion der Sprachänderung (in deinem Beispiel CSoftDlg::Textzuweisungen()) auf.
Damit die Sprache auch geändert wird, wenn der User eine neue Sprache wählt, rufst du die Funktion der Sprachänderung auf, wenn z.B. der User auf den Button "Sprache ändern" klickt, oder eine Nachricht (z.B. CBN_EDITCHANGE bei einer ComboBox, die alle verfügbaren Sprachen beinhaltet) auftritt.Grüße Rapha
-
Das geht doch aber nicht!!! Der Dialog wird angezeigt, darin sind u. a. RadioButtons wo der Benutzer die Sprache wählt. Wenn er eine andere Sprache auswählt soll der Dialog auf dem u.a. auch die RadioButtons sind sofort in der neuen Sprache erscheinen! Da wird doch kein OnInitDialog() mehr aufgerufen, er existiert doch schon!!
-
Natürlich, du kannst die "Ändere die Sprache Funktion" doch auch aufrufen, wenn der User die Sprache ändert, indem er auf einen RadioButton klickt (es wird ja eine Windows-Nachricht gesendet).
Grüße Rapha
-
Natürlich, du kannst die "Ändere die Sprache Funktion" doch auch aufrufen, wenn der User die Sprache ändert, indem er auf einen RadioButton klickt (es wird ja eine Windows-Nachricht gesendet =>BN_CLICKED).
Grüße Rapha
-
Mist, mein IE spinnt etwas

-
Mist, mein IE spinnt etwas

Was ist mit dem MySQL Server los?
Die Seite wird ewig geladen, aber es kommt keine Bestätigung, dass der Post gesendet wurde

-
Was hältst du davon, die aktuelle Sprache in die Registry oder in eine Datei zu schreiben. Danach kannst du dann beim Programmstart die jeweilige Dll laden, und daraus dann *alle* Dialoge rausladen.
-
Also entweder ich steh hier brutal aufm Schlauch oder du???! Natürlich bekomm ich eine Nachricht von den RadioButtons, die dann die Funktion aufruft, aber wenn ich einem Button einen neuen String zuweise muß ich doch den gesamten Dialog aktualisieren, ansonsten passiert doch überhaupt nix!!! Probier mal in einem aktiven Dialog per GetDlgItem(IDC_...)->SetWindowText("bla") einem Button einen neuen Text zuzuweisen. Es passiert nix, solange der Dialog nicht neu geladen wird! Aber es funktioniert ja einwandfrei wenn ich es in OnPaint() aufrufe.
-
Warum willst du denn den Steuerelementen die unterschiedlichen Texte zuweisen? Wenn du in deiner Dll die komplette Dialogresource (mit den Texten der Steuerelemente) drin hast, erscheint der Dialog automatisch in der geladenen Sprache.
Nur mal wieder zur Erklärung: Du lädst dann den kompletten Dialog aus der Dll.
Der einzige Nachteil ist halt vielleicht, dass du deine kompletten Resourcen übersetzen mußt, und jeweils eine eigene Dll erstellen. Aber damit hast du dann das Problem ein für alle mal gelöst und mußt dich in deinem laufenden Programm überhaupt nicht mehr darum kümmern.
-
~Christian schrieb:
aber wenn ich einem Button einen neuen String zuweise muß ich doch den gesamten Dialog aktualisieren, ansonsten passiert doch überhaupt nix!!!
Quark, wenn du mit SetWindowText den Text eines Buttons änderst, wird die Änderung sofort übernommen

~Christian schrieb:
Probier mal in einem aktiven Dialog per GetDlgItem(IDC_...)->SetWindowText("bla") einem Button einen neuen Text zuzuweisen. Es passiert nix, solange der Dialog nicht neu geladen wird!
Soso.. :p

Grüße Rapha