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ötig

    Alternative:
    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);
    

Anmelden zum Antworten