Einfache Windows Applikation funktioniert nicht
-
Hallo liebe Programmierer,
ich habe ein Problem mit einem Programm , dass ein einfaches auf WINAPI basierendes Fenster anzeigen soll.#include <windows.h> LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpcmdline, int cmdshow) { WNDCLASSEX windowclass; HWND hWnd; MSG message; const char szClassName[] = "Erstes Fenster"; windowclass.cbSize = sizeof(WNDCLASSEX); windowclass.style = CS_HREDRAW | CS_VREDRAW; windowclass.lpfnWndProc = WindowProc; windowclass.cbClsExtra = 0; windowclass.cbWndExtra = 0; windowclass.hInstance = hInst; windowclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); windowclass.hCursor = LoadCursor (NULL, IDC_ARROW); windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1; windowclass.lpszMenuName = NULL; windowclass.lpszClassName = szClassName; if (!RegisterClassEx (&windowclass) ) return (0); hWnd = CreateWindowEx (NULL, static_cast <LPCWSTR> (szClassName), "Das erste Fenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 300, 250, NULL, NULL, hInst, NULL); if (hWnd == NULL) return (0); while (GetMessage (&message, NULL, 0, 0) ) { TranslateMessage (&message); DispatchMessage (&message); } return (int)(message.wParam); } LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: { PostQuitMessage (0); return (0); } case WM_KEYDOWN: { switch (wParam) { case VK_ESCAPE: { PostQuitMessage (0); return (0); } } } break; } return (DefWindowProc(hWnd, message, wParam, lParam) ); }Beim Kompilieren erscheint folgende Fehlermeldung:
c:\dokumente und einstellungen\stephan\desktop\programm!eren\c++\c++ für spieleprogrammierer\buch\c++ für spieleprogrammierer\fenster\fenster.cpp(33) : error C2440: '=': 'const char [15]' kann nicht in 'LPCWSTR' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
c:\dokumente und einstellungen\stephan\desktop\programm!eren\c++\c++ für spieleprogrammierer\buch\c++ für spieleprogrammierer\fenster\fenster.cpp(39) : error C2440: 'static_cast': 'const char [15]' kann nicht in 'LPCWSTR' konvertiert werden
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Ich arbeite mit VC 2008 EE und habe keinen blassen Schimmer wie ich den fehler beheben kann.Ich hab es mal mit "static_cast<LPCWSTR> ()" probiert funktioniert aber auch nicht
ich arbeite ein buch durch das genau den Quellcode auch hat und dort funktioniert es
ich hoffe ich kann auf unterstützung zählen
mfg pepe1995
-
Inzwischen ist Unicode aktuell.
Probleme lassen sich wie folgt beheben:
- Ersetze "char" durch "TCHAR"
- Ersetze sowas wie "Erstes Fenster" durch TEXT("Erstes Fenster")
- Casten ist dann unnötigAlternative:
Schalte Unicode irgendwo in den Projekteigenschaften aus (irgendwo unter Zeichensatz oder sowas...)Mehr Infos gibts in der msdn:
http://msdn.microsoft.com/en-us/library/dd374089(VS.85).aspx
-
Für dein Beispiel würde das bedeuten:
// const char szClassName[] = "Erstes Fenster"; <-- Kannste direkt unten angeben windowclass.cbSize = sizeof(WNDCLASSEX); windowclass.style = CS_HREDRAW | CS_VREDRAW; windowclass.lpfnWndProc = WindowProc; windowclass.cbClsExtra = 0; windowclass.cbWndExtra = 0; windowclass.hInstance = hInst; windowclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); windowclass.hCursor = LoadCursor (NULL, IDC_ARROW); windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1; windowclass.lpszMenuName = NULL; windowclass.lpszClassName = TEXT("Erstes Fenster"); if (!RegisterClassEx (&windowclass) ) return (0); hWnd = CreateWindowEx (NULL, szClassName, TEXT("Das erste Fenster"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 300, 250, NULL, NULL, hInst, NULL);
-
Danke jetzt funktionierts einwandfrei
-
Vielleicht noch ein Verbesserungsvorschlag
Ersetz das
PostQuitMessage(0);bei WM_KEYDOWN durch
PostMessage(hwnd, WM_CLOSE, 0, 0);