Anfängerproblem (MessageBox)

acky

Mitglied
Hallo.

Gemäß dem Tutorial "Visual C++.NET in 21 Tagen" versuche ich "Behandlungscode" für einen Button einzugeben, der wie folgt aussieht:

Code:
void CHelloDlg::button1Clicked()
{
	// TODO: Fügen Sie hier Ihren Kontrollbehandlungscode für die Benachrichtigung ein.
	MessageBox("Text ...");	
}

erhalte von Visual Studio die Fehlermeldung

Code:
.\HelloDlg.cpp(172) : error C2664: 'CWnd::MessageBoxW': Konvertierung des Parameters 1 von 'const char [8]' in 'LPCTSTR' nicht möglich

Was bitte habe ich falsch gemacht
bzw. was muss ich tun, damit dies funktioniert?

Danke,
acky
 
Ich rate mal, du benutzt Visual Studio 2005.

Bei der Version werden die Projekte per Default auf Unicode konfiguriert. Du kannst entweder die Option auf Multi Byte Char Set umstellen oder bei den Textkonstanten das _T-Makro verwenden:

MessageBox( _T( "Hurz" ), ... )
 
danke!

mit dem _T-marko (bin aus der java-ecke - kann man mir sagen, was genau dies ist?)
funktioniert es!

nur diese option finde ich leider nicht - unter welcher kategorie muss ich das schauen?

thx,
acky
 
Ich habe 2005 jetzt hier nicht drauf, aber 2003. Die Einstellung findest du im Projekt-Eigenschaften-Dialog, unter Allgemein (sollte direkt aufgemacht werden, im Englischen heisst der Punkt "Character Set").

Das _T-Makro ist ein Define, dass je nach eingestelltem Zeichensatz (Unicode oder Multi Byte Char Set) die Zeichenfolge in das benötigte umwandelt.

Ein Define ist sowas wie ein Platzhalter, der vom Präprozessor vor dem Kompilieren eingesetzt wird. D.h. der tatsächlich kompilierte Sourcecode kann durchaus anderes aussehen als du ihn siehst.

Wenn du normales Multi Byte Char Set benutzt, wird die Zeichenfolge direkt übernommen (ASCII). Das _T-Makro tut in dem Fall gar nichts.

Wenn Unicode eingestellt ist, wird das Makro zu dem L-Makro, dass für den Compiler andeutet, dass die Zeichenfolge als Unicode einzusetzen ist.

Zur Verwirrung kommt noch einer obendrauf:

Praktisch alle Win32-API-Funktionen, die mit Text zu tun haben, gibt es zweifach. Einmal mit Endzeichen A (für ASCII), einmal mit Endzeichen W (für Wide Char, gleichbedeutend mit Unicode). Für diese Funktionen gibt es dann üblicherweise ein Define, dass je nach Einstellung die eine oder andere Funktion benutzt.

Beispiel MessageBox:

Tatsächlich gibt es nur MessageBoxA und MessageBoxW. Wenn du MessageBox schreibst, wird dass bei MBCS zu MessageBoxA, bei Unicode zu MessageBoxW. Du kannst die passende Funktion auch direkt einsetzen (also MessageBoxA schreiben).

Diese Makros haben denn Sinn, dass man nur die Projekt-Einstellung zu ändern braucht, um aus einem MCBS-Programm ein Unicode-fähiges Programm zu machen. Zumindest was die Win32-API betrifft.

Zuviel Gefasel auf einmal? Ist auch ein komplexeres Thema ;)


Noch ein Hinweis: Ab Windows NT/2000/XP ist Unicode direkt unterstützt, bei 95/98/ME muss ein Unicode-Layer installiert werden. MCBS ist überall laufbar.
 
Zurück