Compilerfehler: wstring per DrawTextW ausgeben lassen
-
Hallo,
ich habe jetzt schon den halben Tag mit Suchen nach einer einfachen
Lösung verbracht aber ich bin nicht wirklich fündig geworden. Nun
frage ich doch mal die Fachmänner hier, da ich null Ahnung von der
WinAPI und nur sehr wenig C/C++ Kenntnisse habe.Ich möchste ein std::wstring mithilfe der Winapi-Funktion DrawTextW,
die ja bei UNICODE verwendet wird, in einem rechteckigen Bereich im
erzeugten Fenster ausgeben lassen. Erhalte aber folgende Fehlermeldung
beim kompilieren mit Visual C++ 2005 EE + PlattformSDK unter WinXP.error C2664: 'DrawTextW': Konvertierung des Parameters 2 von 'std::wstring' in 'LPCWSTR' nicht möglich
und hier der relevante Codeausschnitt:
std::wstring a(TEXT("variable Textausgabe mit DrawText")); switch (message) { case WM_CREATE: return 0; case WM_PAINT: hdc = BeginPaint (hwnd, &ps); // Fensterinhalt löschen & Gerätekontext holen GetClientRect (hwnd, &rect); // Ermitteln der Dimensionen des Fensterinhaltest //DrawText (hdc, TEXT ("statische Textausgabe mit DrawText"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); DrawText (hdc, a, -1, &rect, 0); EndPaint (hwnd, &ps); // Gerätekontext freigeben return 0; case WM_DESTROY: PostQuitMessage (0); // WM_QUIT(0) Nachricht senden return 0; }Die auskommentierte Zeile mit der statischen Textausgabe funktioniert
selbstverständlich bestens wenn die DrawText-Zeile mit dem wstring
auskommentiert wird. Ich möchte auch in der heutigen Zeit nicht auf UNICODE
verzichten.Ich bin für jede Hilfe dankbar...
Gruß Chris
-
Naja, steht eigentlich in der Fehlermeldung, was falsch ist. Er erwartet einen Pointer! Du übergibst aber ein wstring-Objekt. Und da Win32-API nunmal C ist, ist es unwahrscheinlich das Objekte funktionieren.
Hier die Lösung:DrawText (hdc, a.c_str() , -1, &rect, 0);
-
Besten dank, das ist die kürzeste und beste Lösung die ich heute gesehen hab und deswegen heissen Pointer Pointer und nicht Objekte *grins
Nochmals herzlichen Dank nun funktioniert es und ich kann mich auf die nächsten Probleme stürzen...
Schönen abend noch
-
Das ist aber etwas unsicher: Sobald Du auf ANSI kompilierst, gibts Fehler.
-
Das ist nicht schlimm, da es nicht auf Windows ohne Unicode laufen soll und dies auch dem Nutzer auf einem WindowsOS ohne Unicode per MessageBox gesagt wird und dann abbricht.
Wenn auch Ansi erwünscht wäre könnte man doch per Macro anstelle wstring string nutzen oder nicht?
-
Genau
.
-
Naja, ich würde gleich einen typedef nehmen:
#include <tchar.h> typedef std::basic_string<TCHAR> tstring;
-
Das ist selbstverständlich die bessere Lösung, zusammen mit dem Macro TEXT sollte man dann auf der sicheren Seite sein, oder?
-
Ja, wenn Du durchgehend machst.
-
Da ich noch ganz am Anfang bin und bestimmt noch mehrmals anfangen werde, wird sich tstring zusammen mit TEXT sehr gut machen. Sieht so aus als wäre man mit dem Duo ziemlich unabhängig.