Benutzer mit den meisten Antworten
Windows Dialog Elemente mit UNICODE beschriften

Frage
-
Hallo Forum
Ich versuche gerade, ein altes nicht-UNICODE Projekt mit Fremdsprachen aufzufetten.
Für alle direkten Bildschirmausgaben habe ich anstelle der CDC Methode OutText die API Funktion OutTextW verwendet und das funktioniert dann auch. Wenn ich jedoch ein Dialogelement mit SetWindowTextW beschreiben will, dann kommen die Zeichen über 0xFF nur als "?", die restlichen funktionieren.
Hab ich eine Chance, die Dialogelemente echte UniCode (z.B. chinesische) Zeichen anzeigen zu lassen, ohne das gesamte Projekt auf UNICODE zu compilieren?
Grüße
FireHeart
Antworten
-
So geht das nicht!
Stelle die ganze Anwednung auf Unicode um!Ein Fenster hat nur dann ein Unicode Interface wenn es mit CreateWindowW angelegt wird...
Das hat nichts damit zu tun, was Du für Funktionen nutzt!
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Fire-Heart Donnerstag, 2. September 2010 12:48
Alle Antworten
-
So geht das nicht!
Stelle die ganze Anwednung auf Unicode um!Ein Fenster hat nur dann ein Unicode Interface wenn es mit CreateWindowW angelegt wird...
Das hat nichts damit zu tun, was Du für Funktionen nutzt!
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Fire-Heart Donnerstag, 2. September 2010 12:48
-
Hallo Martin
Dieser Verdacht ist auch schon in mir gekeimt. Wenn ich Dialogelemente habe, die mir der Resourceneditor klassischerweise zusammenbaut, dann komm ich ja gar nicht mehr an das CreateWindow heran, d.h. alle Elemente werden ANSI erstellt. Explizit ändern geht nachträglich ja wohl nicht mehr
Wenn ich jetzt ein großes, altes Projekt auf UNICODE umstelle...was passiert dann eigentlich alles?
Jeder Textstring, der irgendwo steht ist dann ja wohl auch vom wchar_t Typ oder?
..und das ist ja mein Problem...das Projekt ist uralt und riesig, auf UNICODE umstellen ist - meiner Ansicht nach - völlig unmöglich, da könnte ich es schneller neu schreiben
Testweise hab ich mal mit CreateWindowW ein Fensterchen erstellt. Diese Funktion liefert mir ein HWND Objekt zurück. Wie kann ich eigenlich diesem Fensterchen dann einen Zeichensatz zuweisen, der überhaupt chinesische Schriftzeichen enthält?
Grüße
FireHeart
- Als Antwort markiert Fire-Heart Donnerstag, 2. September 2010 12:37
- Tag als Antwort aufgehoben Fire-Heart Donnerstag, 2. September 2010 12:47
-
Testweise hab ich mal mit CreateWindowW ein Fensterchen erstellt. Diese Funktion liefert mir ein HWND Objekt zurück. Wie kann ich eigenlich diesem Fensterchen dann einen Zeichensatz zuweisen, der überhaupt chinesische Schriftzeichen enthält?
In einem UNICODE Fenster kannst Du immer alle Schriftzeichen anzeuigen (wenn die Fonts installiert sind).
Jochen Kalmbach (MVP VC++) -
Hallo Martin
Ich hab explizit CreateWindowW verwendet, aber das Problem besteht ja darin, dass der normale Systemzeichensatz bei weitem nicht alle Zeichen (vor allem chinesische) enthält.
Es war aber auch nur so ein Versuch, weil dieses Fensterchen auch keine Message-Queue oder sonstwas hat und daher auch auf nichts reagiert...aber zumindest erschienen ist es ;-)
Grüße
FireHeart
-
Hallo Jochen
Der Systemzeichensatz enthält bestenfalls kyrillische und arabische Zeichen, aber chinesische wirst Du vergeblich suchen. Da musst Du dem Objekt zuerst mal den Arial Unicode MS zuweisen, damit wirklich viele chinesische Zeichen auch vorhanden sind...aber der hat 22MB, und wer weiß wieviel MB er im Speicher belegt, wenn er erst mal CreateFonted ist.
Grüße
FireHeart
-
Ich hab explizit CreateWindowW verwendet, aber das Problem besteht ja
darin, dass der normale Systemzeichensatz bei weitem nicht alle Zeichen
(vor allem chinesische) enthält.Was meinst Du damit? "Normaler Zeichensatz"
Du verwendest doch Unicode: Also sind dort "alle" Zeichen vorhanden!
Ich habe das Gefühl Du wirfst hier Dinge kräftig durcheinander...
Es war aber auch nur so ein Versuch, weil dieses Fensterchen auch keine
Message-Queue oder sonstwas hat und daher auch auf nichts reagiert...aber
zumindest erschienen ist es ;-)Nicht ein Fenster hat eine Message-Queue sondern ein Thread. Wenn also Deine Applikation für diesen Thread eine Message-Queue hat, dann reagiert auch das Fenster.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Am 02.09.2010 11:30, schrieb Fire-Heart:
Wenn ich jetzt ein großes, altes Projekt auf UNICODE umstelle...was passiert dann eigentlich alles?
Jeder Textstring, der irgendwo steht ist dann ja wohl auch vom wchar_t Typ oder?
..und das ist ja mein Problem...das Projekt ist uralt und riesig, auf UNICODE umstellen ist - meiner Ansicht nach - völlig unmöglich, da könnte ich es schneller neu schreibenSchreib es neu! Alles Andere ist nur sinnloses Gebastel, damit kommst du nur noch weiter weg vom Ufer. Nimm aber nicht wchar_t, sondern TCHAR und statt sizeof nimm _countof, nicht strlen() oder wcslen() sondern _tcslen(), etc...
UND: es empfiehlt sich von vornherein mit CString zu arbeiten, dann sparst du dir diese ganzen uralten Relikte von zusammengenagelten Stringfunktionen und Buffern fester Größe.
Aber vor Allem eins: KLARTEXT GEHÖRT NICHT IN DEN QUELLCODE, sondern in die Stringtable. Dann sind Probleme wie die, die du schilderst ein- für allemal Schnee von gestern. Außerdem lässt sich das Programm auch problemlos mal auf andere Sprachen umstellen.
Hajü
-
Wenn ich jetzt ein großes, altes Projekt auf UNICODE umstelle...was
passiert dann eigentlich alles?
Jeder Textstring, der irgendwo steht ist dann ja wohl auch vom wchar_t Typ
oder?Wie kommst Du auf den Quatsch. char bleibt char, wchar_t bleibt wchar_t.
Dein größtest Problem werden API Funktionen sein, denn die wollen dnn alle keinen char* mehr sondenr wchar_t*. Wenn Du nicht brav TCHAR verwendet hats, mag das etwas Arbeit sein...Bzw. CString wird zu CStringW was vorher noch CStringA war... ;)
..und das ist ja mein Problem...das Projekt ist uralt und riesig, auf
UNICODE umstellen ist - meiner Ansicht nach - völlig unmöglich, da könnte
ich es schneller neu schreibenGlaubst Du?
Das bezweifle ich schwer...
So viele Stellen werden das gar nicht sein!Testweise hab ich mal mit CreateWindowW ein Fensterchen erstellt. Diese
Funktion liefert mir ein HWND Objekt zurück. Wie kann ich eigenlich diesem
Fensterchen dann einen Zeichensatz zuweisen, der überhaupt chinesische
Schriftzeichen enthält?Unicode verwenden... <veg>
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Am 02.09.2010 15:35, schrieb Martin Richter [MVP]:
..und das ist ja mein Problem...das Projekt ist uralt und riesig, auf
UNICODE umstellen ist - meiner Ansicht nach - völlig unmöglich, da könnte
ich es schneller neu schreibenGlaubst Du?
Das bezweifle ich schwer...
So viele Stellen werden das gar nicht sein!Wenn er es neu schreibt, hat er aber die Chance, es von Anfang an richtig zu machen. Für mich klingt das Alles, als wenn da noch Einiges mehr im Argen ist. Klartext im Sourcecode, etc...
Hajü
-
> Ich hab explizit CreateWindowW verwendet, aber das Problem besteht ja darin, dass der normale Systemzeichensatz bei weitem nicht alle Zeichen (vor allem chinesische) enthält.
So ein blödsinn.... Hast Du XP? Dann musst Du in der Systemsteuerung unter "Regional and Language Options" unter "Langauges" den Hacken bei den beiden "Install files for..." setzen!
Jochen Kalmbach (MVP VC++) -
Hallo Jochen
Der Systemzeichensatz enthält bestenfalls kyrillische und arabische Zeichen, aber chinesische wirst Du vergeblich suchen. Da musst Du dem Objekt zuerst mal den Arial Unicode MS zuweisen, damit wirklich viele chinesische Zeichen auch vorhanden sind...aber der hat 22MB, und wer weiß wieviel MB er im Speicher belegt, wenn er erst mal CreateFonted ist.
Grüße
FireHeart
Ja, Du solltest z. B. Arial Unicode MS als Font verwenden, da sind die meisten Glyphen aus der BMP drin d. h. also auch Simplified Chinese. Der Unicode Codepoint malt ja nicht das Zeichen, sondern die Font. Für andere Zeichen jenseits der BMP brauchst Du spezielle Fonts, sonst siehst Du nur ein Ersatzzeichen. Z. B. die drei Affen, das Non-Smoking Symbol, Japanische Emoticons etc.Peter