Was mach ich hier falsch???



  • Hallo alle zusammen,
    also ich muss erst mal sagen das ich noch ein ziehmlicher Anfänger im Programmieren bin. Ich bin jetzt so weit das ich so ziehmlich die meisten Berreiche aus C++ erlernt habe (also nur in der Win 32 Consolenanwendung) und wollte jetzt mal ein bischen in die Windowsprogrammierung einsteigen. Meine erste Anwendung soll nur eine einfache Spieleschlefe werden. Ich erzeuge also nur ein Fullscreenfenster. Das ganze läuft dann so lange bis der User durch ESC die Schleife beendet.
    So war das gedacht, mein Problem ist jetzt das, sobald ich die Anwendung Ausführe das Fenster kurz aufflackert und sofort wieder verschwindet.
    Ich habe den Code aus einem Buch oder besser gesagt Aus einem Buch,einem Tut und der directX SDK doku. Von allem etwas.
    Ihr Seid wahrscheinlich an so einen DurcheinanderCode nicht gewöhnt aber ich will ihn noch später optimieren und in mehrere Dateien unterbringen- ich brauch noch etwas bis ich mit codeteilel umgehen kann. Ich hoffe das kommt noch. Also bitte ein Auge - wenn nötig beide Augen zudrücken 😉

    Hier der Code

    wenn jemand interesse hat bitte alle Kritiken & Vorschläge hier auskommentieren das muss nähmlich ein sehr sauberer, schneller und abstracter code werden weil darauf mal ein Spiel laufen soll. Danke im voraus

    // Shell Aplication 
    
    //Defines/////////////////////////////////////////////////////
    
    #define WINDOW_CLASS_NAME "Game Shell Window"
    #define WIN32_LEAN_AND_MEAN
    
    // Includes///////////////////////////////////////////////////
    
    #include <windows.h>
    
    //Macros//////////////////////////////////////////////////////
    
    #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code&0x8000)?1:0)
    #define KEYUP (vk_code)  ((GetAsyncKeyState(vk_code&0x8000)?1:0)
    
    //Globals/////////////////////////////////////////////////////
    
    HWND mainWindowHandle = 0;
    HINSTANCE hinstanceApp = 0;
    
    //Wichtige Funktionsprototypen/////////////////////////////////
    
    void GameShutdown (void);
    void GameInit(void);
    void GameMain (void);
    
    //Funktiosdefinitionen////////////////////////////////////////
    
    LRESULT CALLBACK WindowProc (HWND hwnd,
    							 UINT msg,
    							 WPARAM wparam,
    							 LPARAM lparam)
    {
    	PAINTSTRUCT ps;
    	HDC         hdc;
    
    	//Nachrichtenverarbeitung////////////////////////////////////
    	switch (msg)
    	{
    		case WM_CREATE:
    			{
    				return (0);
    			}
    			break;
    
    		case WM_PAINT:
    			{
    				hdc = BeginPaint (hwnd,&ps);
    				EndPaint (hwnd,&ps);
    				return (0);
    			}
    			break;
    
                default:
    			break;
    	}
    	return(DefWindowProc(hwnd,msg,wparam,lparam));
    }
    
    ///////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////
    
    int WINAPI WinMain ( HINSTANCE hinstance, HINSTANCE, LPSTR, int ncmdshow)
    {
    	WNDCLASSEX window;
    	HWND       hwnd;
    	MSG        msg;
    
    	//Fenstereigenschaften festlegen////////////////////////////
        window.cbSize        = sizeof(WNDCLASSEX);
        window.style         = CS_HREDRAW | CS_VREDRAW;
        window.lpfnWndProc   = WindowProc;
        window.cbClsExtra    = 0;
        window.cbWndExtra    = 0;
        window.hInstance     = hinstance;
        window.hIcon         = LoadIcon(0,IDI_APPLICATION);
        window.hCursor       = LoadCursor(0,IDC_ARROW);
        window.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH);
        window.lpszMenuName  = 0;
        window.lpszClassName = WINDOW_CLASS_NAME;
        window.hIconSm       = LoadIcon (0,IDI_APPLICATION );
    
        hinstanceApp = hinstance;
    
     if (! RegisterClassEx(&window))
    	 return (0);
    
     if (! (hwnd = CreateWindowEx
    	 (0,
    	 WINDOW_CLASS_NAME,
    	 "My Game Shel",
         WS_POPUPWINDOW | WS_VISIBLE,
    	 0,0,
    	 1024,768,
    	 0,
    	 0,
    	 hinstance,
    	 0)));
    
    	 return (0);
    
    	 mainWindowHandle =hwnd;
    
    	 GameInit ();
    
    	 while (TRUE) //Nachrichtenweiterleitung
    	 {
    		 if(PeekMessage(&msg,0,0,0,PM_REMOVE))
    		 {
    			 if (msg.message ==WM_QUIT)
    				 break;
    
    			 TranslateMessage(&msg);
    			 DispatchMessage(&msg);
    		 }
    
    		 GameMain();
    	 }
    
    	 GameShutdown();
    	 return (msg.wParam);
    }
    
    ////////////////////////////////////////////////////////////////
    
    void GameInit(void)
    {}
    
    ////////////////////////////////////////////////////////////////
    
    void GameMain(void)
    {
    	//Mit ESC kann die Anwendung verlassen werden
    
    	if ( KEYDOWN( VK_ESCAPE )))
    		SendMessage(mainWindowHandle,WM_CLOSE,0,0);
    }
    
    //////////////////////////////////////////////////////////////////
    
    void GameShutdown (void)
    {}
    

    Ich hoffe es ist nicht zu viel für ein post 😋





  • Danke für den Tip die Funktion ist wesentlich einfacher als die beiden Macros aber es hat das Problem nicht behoben

    hab die macros jetzt durch

    #define SHORT GetAsyncKeyState( int vKey);
    

    und dann ganz unten durch

    void GameMain(void)
    {
    	//Mit ESC kann die Anwendung verlassen werden
    
    	if ( GetAsyncKeyState( VK_ESCAPE ))
    		SendMessage(mainWindowHandle,WM_CLOSE,0,0);
    }
    

    ersetzt. Aber wie gesagt funzt immer noch net

    Und danke für den link echt eine nützliche Seite 👍



  • Wozu brauchst du einem macro ? Gerade dieser wird dir nur Probleme machen. Du verwendest ihn sowieso nicht.

    if ( ( GetAsyncKeyState( VK_ESCAPE ) & 0x8000 ) != 0 ) { // wenn escape gedrückt
    

    Kurt



  • ja das hab auch schon gehört das man macros nicht einsetzten sollte aber ich kannte diese GetAssyncKey Funktion noch nicht. Wo kann denn der fehler sonst liegen? Kann es sein das das fenster sofort geschlossen wird weil ich ja eigentlich noch nichts in der Schleife mache ausser auf ESC zu warten?



  • Der Ausdruck :

    if ( GetAsyncKeyState( VK_ESCAPE ))
    

    ergibt immer true.
    Wenn die taste gedrückt ist dann gibt GetAsyncKeyState( VK_ESCAPE ) 0x8000 zurück
    -> das programm wird beendet.
    Wenn die taste nicht gedrückt ist dann gibt GetAsyncKeyState( VK_ESCAPE ) 0x0001 zurück
    -> das programm wird beendet.
    Es wird also auf jeden Fall beendet.
    Kurt



  • Deswegen macht man ja noch das & 0x8000 😉



  • Ich habs auch schon ausprobiert aber der Fehler muss irgendwo anders liegen
    Ich hab jetzt das ganze mit der ESC Taste entfernt - aber das fenster schließt trotzdem 😞



  • Hi,

    aber das fenster schließt trotzdem

    Kein Wunder! Nachdem du das Fenster erstellst gehst du mit return (0); aus dem Programm raus. Er kommt gar nicht erst zur Schleife!

    if (! (hwnd = CreateWindowEx
         (0,
         WINDOW_CLASS_NAME,
         "MyGameShell",
         WS_POPUPWINDOW | WS_VISIBLE,
         0,0,
         1024,768,
         0,
         0,
         hinstance,
         0)));
    
         //Das return (0) muss da weg
         //return (0);
    
         mainWindowHandle =hwnd;
    

    Ciao,

    Feuerwerker



  • das return 0 gehört zur If-Abfrage, also wenn das Fenster nicht erstellt wurde wird es beendet.
    Ist nur schwer zu erkennen, weil seine Code-Formatierung unschön ist 😃



  • na dann haben wir den Fehler ja gefunden

    0)));
    

    Ein Semicolon zu viel.
    Kurt



  • Nein, es gehört nicht zur if-Abfrage, da er keine geschweiften Klammern benutzt.

    Folge: das Programm wird beendet.
    Also, müssen da geschweifte Klammern hin!



  • Alles zurück, war Quatsch, ich hab übersehen, das CreateWindowEx in der if-Abfrage steckt, ZuK hat Recht.



  • if ( GetAsyncKeyState( VK_ESCAPE ) & 0x8000 )
    


  • Hey Danke das hat geklappt ich hab einfach das return 0 weg gemacht und siehe da ein weißes Fenster 😋
    Aber ich hab nicht ganz verstanden warum es weg muss da der nach dem return 0 erst dann fragt wenn die if anweisung FALSE liefert oder????



  • Es muss nicht das return 0 weg sondern das semicolon.
    Kurt



  • aha ja habs verstanden klappt auch danke noch mal


Anmelden zum Antworten