Dieser und noch weitere Artikel wurde von guenni81 erstellt.


Folgende Themen werden von diesem Artikel berührt:


Druckversion des Artikels


Eine MFC-Anwendung mehrsprachfähig erstellen

Inhaltsverzeichnis



Einleitung

Es kennen bestimmt viele das Problem, dass man eine Anwendung
mehrsprachig machen muss, aber leider nicht weiß, wie man dies
realisieren kann. Dieser kleine Artikel soll zeigen, wie man Strings
aus einer so genannten Resource-DLL Datei lädt und in einem CStatic
Feld anzeigt. Der Einfachheit halber wird in diesem Artikel nur ein Satz
aus der DLL geladen.


Erstellen der Hauptanwendung

Zuerst müssen wir unsere Hauptanwendung erstellen. In diesem
kleinen Beispiel nutze ich hierfür eine dialogbasierende Anwendung.
Natürlich wäre es hier auch möglich, eine SDI- oder MDI-Anwendung zu nehmen.
Dieser füge ich zwei Schaltflächen zum Laden der deutschen und englischen
Sprachresource hinzu.


An der Stelle "Text hier" wurde von mir ein CStatic erstellt.
Hier soll später der geladene Text stehen. Hier ist es wichtig, die ID
von ID_STATIC auf eine eindeutige ID eurer Wahl zu ändern. Diese wird später
zum Ändern des Textes benötigt.

Im nächsten Schritt müssen wir dem Stringtable (falls nicht vorhanden, muss
diese erstellt werden) einen neuen Eintrag hinzufügen. Dieser Name muss
später auch in der Resource-DLL verwendet werden. Ich habe mich
hier für IDS_MYTEXT entschieden.

Nun fügen wir den Quellcode für unsere beiden Buttons ein.


Ich zeige hier nur den Quellcode eines Buttons, da die Quellcodes
identisch sind. Es werden nur zwei unterschiedliche DLL-Dateien geladen.



Resource-DLL Laden (Quellcode der Buttons)

Als Erstes benötigen wir zwei Handle-Variablen: Eine für die geladene DLL-Datei
und die andere für die aktive EXE-Datei. Am Ende der Funktion müssen
wir das Handle wieder auf die EXE-Datei setzen, da es hier ansonsten zu
Probleme kommen kann beim Laden von Resourcedaten.


C++:
// Variable deklarieren
HINSTANCE hDll, hExe;
CString text;



Als Nächstes müssen wir das aktive Handle für die Resourcen ermitteln
und wegspeichern. Danach müssen wir die DLL Datei laden und diese als neue
Resourcehandle setzen.

C++:
1
2
3
4
5
6
7
8
9
10
// Aktives Resourcehandle holen
hExe = AfxGetResourceHandle();
ASSERT(hExe);
 
// DLL-Datei laden
hDll = AfxLoadLibrary(_T("german.dll"));
ASSERT(hDll);
 
// Neues Resourcehandle setzen
AfxSetResourceHandle(hDll);



Wenn wir dies gemacht haben, können wir mit Hilfe der Funktion
LoadString der Klasse CString unseren Text in die Variable laden.

C++:
// Text aus DLL laden
text.LoadString(IDS_MYTEXT);


Im nächsten Schritt müssen wir unseren Text nun in das CStatic Feld setzen.
Hierfür gibt es natürlich mehrere Möglichkeiten. Ich nutze folgende:

C++:
// Text dem CStatic Feld zuweisen
SetDlgItemText(IDC_MEINTEXT,text);


Jetzt wird der Text in dem Feld angezeigt. Je nachdem, welche Resourcedatei
wir geladen haben, ist der Text in Deutsch oder in Englisch abgefasst.
Im letzten Schritt dieser Funktion setzen wir das Resourcehandle wieder auf
unsere EXE-Datei und geben die geladene DLL-Datei wieder frei.

C++:
// EXE-Resourcehandle wieder setzen
AfxSetResourceHandle(hExe);
 
// DLL-Datei wieder freigeben
AfxFreeLibrary(hDll);

Natürlich kann man hier eine Klasse erstellen, die einem die ganzen
Punkte übernimmt. Aus Verständnisgründen habe ich aber auf diese verzichtet.



Erstellen der Resource-DLL

In diesem Abschnitt erkläre ich euch, wie man eine Resourcedatei korrekt
erstellt, da man auch hier auf einiges achten muss.

Als Erstes müssen wir eine DLL-Datei erstellen.



Für unsere Zwecke reicht eine Standard-DLL-Datei vollkommen aus.



Nun fügen wir dieser DLL-Datei einen Stringtable hinzu und tragen unseren
String ein. Der String muss hier ebenfalls IDS_MYTEXT (wie in der
Hauptanwendung) heißen und auch die gleiche ID besitzen.



Sollte eine andere ID bei dem Wert drinstehen als die in der Hauptanwendung
(wird vermutlich der Fall sein), müssen wir die Resource.h-Datei editieren
und die vorhandene ID über die ID in der Hauptanwendung schreiben.



Nun können wir die Resourcedatei kompilieren und in das Verzeichnis der
Hauptanwendung ablegen. Anschließend können wir diese über die Buttons laden.

Nach dem Laden der englischen Resource sieht der Dialog anschließend wie folgt aus.





UNICODE nutzen

Es ist bei einigen Sprachen (z. B. Russisch) nötig, UNICODE zum
darstellen der Zeichen zu benutzen. Um UNICODE in unserer Anwendung zu
nutzen, fügen wir in unserer Stdafx.h folgenden Zeile ein.


C++:
#define _UNICODE


Nun müssen wir noch in den Einstellungen dem Programm sagen, dass es die
MainFunktion für UNICODE nutzen soll.



Nach diesen zwei kleinen Einstellungen ist unser Programm UNICODE-fähig und
sollte keine Probleme mehr haben, Sprachen wie Russisch etc. anzuzeigen.


Zum Abschluss noch ein paar Worte

Ich hoffe, ich konnte mit diesem kleinen Artikel einige Leute bei dem
oben genannten Problem helfen.
Über Kritik, Änderungsvorschläge und Lob zu diesem kleinen Artikel würde
ich mich sehr freuen.


Mit freundlichen Grüßen,
euer Günni

Sie können Kommentare zu diesem Artikel im Forum schreiben. (Eine Registrierung ist nicht notwendig.)

Logo-Design: MastaMind Webdesign