WinAPI/GDI+ - Frage zu Graphics.DrawString
-
Hallo, ich habe einen string mit Text gefüllt und möchte diesen jetzt mit DrawString() zeichnen.
DrawString() fordert für den ersten Parameter ja einen WCHAR-Zeiger auf den Text. Ich habe es so versucht:grafik.DrawString((WCHAR*)einlesetext.c_str(), einlesetext.length(), &font, pointF, &solidBrush);
Es kommt kein Fehler, jedoch gibt er mir nur Chinesische "Hieroglyphen"* aus. Weis jemand, woran das liegt?
*****Die Zeichen, die er ausgibt, sehen nach chinesisch oder so aus!
-
Ameise schrieb:
Weis jemand, woran das liegt?
Vermutlich hast Du in
einlesetext.c_str()
keinen WCHAR - String, sondern einen handelsüblichen String, der aus char besteht.
-
@Belli:
Ja, ich habe einen std::string verwendet. Ich habe eine Textdatei in den String eingelesen und wollte ihn ausgeben.
-
Naja, wenn die Funktion aber einen Zeiger auf WCHAR haben will, und Du gibst ihr einen Zeiger auf char, dann funktioniert sie halt nicht/falsch - daran ändert sich auch nichts dadurch, dass Du behauptest, es handele sich um einen Zeiger auf WCHAR, das ist nämlich das, was Du mit dem Cast
(WCHAR*)einlesetext.c_str()
machst.
-
Wahrscheinlich kannst du grafik.DrawStringA benutzen, der nimmt einen char *.
Eine ziemlich schlechte Variante wäre den string in einen wstring mit mbstowcs umzuwandeln.
Nimm einfach gleich std::wstring, wenn du nicht nur englische Strings ausgeben willst.
-
@Belli
Ja, das ist mir bewusst. Das mit dem Cast war nur ein spontaner Versuch@nwp3
DrawStringA geht nicht. Gleich WCHAR zu benutzen wäre eine Möglichkeit.Ich beschreib hier mal genauer, was ich möchte, vielleicht hat dann jemand eine bessere Lösung dafür.
Also, ich habe eine kleine Funktion erstellt:string *GetFullText(const string &file);
Diese liest(wie der Name schon sagt) eine ganze Textdatei ein, speichert sie in einem String und gibt diesen mit Return zurück.
Ich wollte versuchen, mir grafik.DrawString() diesen Inhalt auszugeben, hat aber natürlich nicht geklappt.@nwp3
Die Funktion DrawText()(die du mir bei meiner anderen Frage als Antwort geschrieben hast) eignet sich nicht so gut dafür,
da sie Parameter zum gezielten Formatieren von Text(zentriert, etc.) beinhaltet. Ich möchte die Textdatei jedoch einfach nur 1 zu 1 ausgeben.Ich könnte zwar auch ein STATIC-oder EDITWindow verwenden, doch ich müsste dann immer die Größe anpassen, wenn ich mal ne andere
Textdatei einlesen möchte.Hoffe jemand hat eine Lösung für mich, würde gerne bei den normalen Strings(std::string) bleiben.
-
Du könntest Deinen String vor der Benutzung von DrawString in einen wstring konvertieren und dann den Zeiger auf diesen an DrawString geben:
wstring charToWide(string in) { WCHAR *wideString = new WCHAR[in.size() + 1]; MultiByteToWideChar(CP_OEMCP, 0, in.c_str(), in.size() + 1, wideString, in.size() + 1); wstring wideVersion(wideString); delete [] wideString; return wideVersion; }
Diese Funktion fütterst Du mit einem string und sie gibt Dir einen wstring zurück, dessen Zeiger variblenname.c_str() Du an DrawString weitergibst. Oder gleich:
... string test("Test"); ... ...DrawString(charToWide(test).c_str(), ...)
@nwp3:
Da ein WCHAR* gefordert ist, liegt die Vermutung nahe, dass es keine Ansiversion gibt, ansonsten wäre die generische Version TCHAR* als Parameter erforderlich.
-
Zeig mal, wie
string *GetFullText(const string &file);
aussieht.
Gibst du da den Zeiger auf einen lokalen string zurück?
-
@Belli
CharToWide geht bei mir irgendwie nicht, sagt immer nur unbekannter... Habe mal bischen gesucht, doch nur etwas wie LangCall.CharToWide gefunden. Kannst du mir
sagen, welchen Header und/oder welche Lib ich nutzen muss?@hmmh
Die Funktion sieht so aus:string *DatenKlasse::GetFullText(const string &file) { ifile.open(file.c_str(), ios::in); string *temp; temp = new string; char temp2[200]; while(!ifile.eof()) { ifile.getline(temp2, 200); temp->append(temp2); temp->append("\n"); } ifile.close(); return temp; }
Gibst du da den Zeiger auf einen lokalen string zurück?
Nö. Würde bei mir ja sonst auch nicht gehen.
-
Die Funktion charToWide habe ich Dir doch oben hingeschrieben?!
Die benötigt:#include <windows.h> #include <string>
-
Die Funktion charToWide habe ich Dir doch oben hingeschrieben?!
Ja, nachdem ich meinen letzten Beitrag geschrieben hatte, ist es mir auch klar geworden(ich Idiot
).
Aber diese Lösung ist ja nicht so toll. Anstatt das ich eine Funktion fürs umwandeln benutze, kann ich ja gleich die eigentliche Funktion umschreiben.
Scheint so, als wäre DrawString() mit std::string totaler quatsch, naja.
Ok, danke dir erstmal fürs Helfen, doch jetzt hab ich ne zweite Frage. Wie kann ich dann am besten eine Textdatei ausgeben?
Also, ich lese sie ein und speichere sie in einen String. TextOut() achtet ja nicht auf Zeilenumbruch und so. Weist du hier weiter? Ich möchte den Text einfach
nur genau so ausgeben, wie er in der Datei steht.PS: Ein STATIC oder EDIT Window ist keine Option.