Ms VC Express 2oo8-Problem ...
-
Moin,
ich habe da ein 'kleines' Problem mit oben genannter IDE.
[OFFTOPIC]
Bisher habe ich mit CodeBlocks und MinGW gearbeitet und bin eigentlich auch sehr zufrieden damit, außer dass für die Win32 programmierung nicht alle Header-Dateien vorhanden sind, wie z.B. commctl.h, um nur eine zu nennen.Also entschloss ich mich VC Express 2oo8 auszuprobieren, trotz 1,4 GB Installationsdateien und 1o MB Registryeinträgen.
[/OFFTOPIC]Nun aber zu meinem Problem:
Wenn ich einen C-String angebe wo eigentlich ein lpszBlaBlubb erwartet wird, dann meckert mich der Compiler an, er könne keinen char[] in einen (LPCSTR), bzw. (LPCWSTR) konvertieren.
Bei CodeBlocks war das kein Thema und auch die meisten Code-Beispiele hier nutzen die mir bekannte schreibweise ...
Beispiel:
// Compiler beschwert sich über "button" und "Drück mich" ... CreateWindowEx (0, "button", "Drück mich", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 10, 10, 80, 27, hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ; // Keine Beschwerden, dafür aber auch kein Text sichtbar ... CreateWindowEx (0, (LPCSTR) "button", (LPCSTR) "Drück mich", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 10, 10, 80, 27, hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
Der Button ist jetzt nur ein Beispiel, egal wo ich einen String setze, es gibt Compiler-Mecker.
Wie ihr sicherlich aus meinem Post herauslesen könnt, bin ich noch blutiger Anfänger, also bitte nicht meckern, es reicht, dass der Compiler mich anmeckert ...
Desweiteren ist mir aufgefallen, dass der Compiler immer die Unicode-Funktionen aufruft, also CreateWindowExW etc.
Das wollte ich eigentlich auch nicht, kann ich dass nicht irgendwo einstellen ?Vielen Dank für die Aufmerksamkeit.
Gruß
Greenhorn
-
Benutze _T("ein string").
-
simon.gysi schrieb:
Benutze _T("ein string").
... ist das gleiche wie TEXT("Ein String") ???
Werde es probieren.Vielen Dank Simon.
Gruß
-
LPCSTR ist ein char string, also i.d.R. 8-bit ASCII/ANSI.
LPCWSTR ist ein Wide-char string, also i.d.R. 16-bit Unicode.Um einen Unicode-String angeben zu können mußt Du den Prefix "L" voranstellen, also z.B. so:
// Compiler beschwert sich nicht mehr ... CreateWindowEx (0, L"button", L"Drück mich", WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 10, 10, 80, 27, hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
Im ganzen Zusammenhang mußt Du wissen, daß es eine Einstellung #define UNICODE gibt.
#define UNICODE 0 macht aus CreateWindowEx() eine CreateWindowExA()
#define UNICODE 1 macht aus CreateWindowEx() eine CreateWindowExW()In Visual Studio 2008 ist als Voreinstellung UNICODE definiert!
Und damit gehen wir einen Schritt weiter:
Anstelle dem oben erwähnten Prefix "L" nimmst Du den Makro "TEXT()" oder "T()" (ist egal welcher), d.h. abhängig von der Einstellung UNICODE macht der Makro daraus entweder den ASCII/ANSI-String oder eben den Unicode-String.
Diese Makros findest Du in der Include "tchar.h"
Siehe Beispiel:#include <tchar.h> //Definitions for generic international text functions. // Compiler beschwert sich nicht mehr ... CreateWindowEx (0, TEXT("button"), TEXT("Drück mich"), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW, 10, 10, 80, 27, hwnd, (HMENU) ID_UNSER_BUTTON, hInstance, NULL) ;
Ich denke, das reicht erstmal für den Anfang?
Martin
-
Tatsache ...,
funzt !
Tausend Dank noch einmal !
Und das mit der Unicodekompilierung ist Standard ?
Gruß
-
Ja, Unicode ist der Default ab VS2005.
Bei Windows XP und Vista (und wahrscheinlich auch NT und 2000) ist intern sowiso alles Unicode.Simon
-
Vielen Dank für die explizite Erklärung, Martin !
Ja, das reicht für's erste ...
Sehr kompetentes Forum hier, weiß gar nicht warum soviele Anfragen/Antworten so harsch und ungeduldig ausfallen !
Also nochmals: Mille Grazie
Gruß
-
C++Greenhorn schrieb:
Sehr kompetentes Forum hier, weiß gar nicht warum soviele Anfragen/Antworten so harsch und ungeduldig ausfallen !
ich weiß es: je dümmer und unspezifischer die fragen, desto harscher die antworten.