none
Windows Dialog Elemente mit UNICODE beschriften RRS feed

  • 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

    Donnerstag, 2. September 2010 09:00

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
    Donnerstag, 2. September 2010 09:17
    Moderator

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
    Donnerstag, 2. September 2010 09:17
    Moderator
  • 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
    Donnerstag, 2. September 2010 09:30
  • 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++)
    Donnerstag, 2. September 2010 09:44
  • Dein Dialog wird aber durch CreateDialogA erzeugtund nicht mit CreateDialogW! CreateDialogA verwendest Konsequent CreateWindowA...

    Etc...


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 2. September 2010 09:49
    Moderator
  • 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

    Donnerstag, 2. September 2010 12:40
  • 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

    Donnerstag, 2. September 2010 12:47
  • 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
    Donnerstag, 2. September 2010 12:55
    Moderator
  • 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 schreiben

    Schreib 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ü

    Donnerstag, 2. September 2010 13:00
  • 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 schreiben

    Glaubst 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
    Donnerstag, 2. September 2010 13:35
    Moderator
  • 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 schreiben

    Glaubst 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ü

    Donnerstag, 2. September 2010 13:43
  • > 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++)
    Donnerstag, 2. September 2010 15:41
  • 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

    Montag, 8. August 2016 15:04