Globale Variablen vermeiden - wie?



  • Hallo alle zusammen 🙂

    Ich hoffe, ich bin mit dem Beitrag richtig hier, sonst bitte ich einen der Moderatoren, den Beitrag zu verschieben.

    Also, ich habe letztens mit der WinAPI unter Visual C++ 2010 Express angefangen und dann einfach mal ein bisschen rumprobiert.
    Nun habe ich versucht, ein Spiel, welches ich auch schon in der Konsole programmiert hatte, auf die WinAPI umzusetzen. Soweit so gut, alles hat geklappt.
    Nun wollte ich noch ein einfaches Menü erstellen, mit Hilfe und Optionen.

    Mein Problem ist nur, dass ich es irgendwie nicht ohne globale Variablen hinbekomme.
    Ich zeige einfach mal ein paar Ausschnitte des Codes:

    // Globale Variablen:
    int menu = M_MENU;
    int menuSelection = PS_GAME;
    
    // Diese Funktion wird bei WM_PAINT ausgeführt:
    void paint(HWND hWnd)
    {
    	PAINTSTRUCT ps;
    	HDC hDC = BeginPaint(hWnd, &ps);
    
    	if (menu == M_MENU)
    	{
    	     font = CreateFont(FONTSIZE, 0, 0, 0, FW_NORMAL, false, false, false, NULL, 
                                  NULL, NULL, DEFAULT_QUALITY, DEFAULT_PITCH, L"Comic Sans MS");	
    
    	     SelectObject(hDC, font);
    
    	     const wchar_t * game = L"Spielen";
    	     const wchar_t * options = L"Optionen";
    	     const wchar_t * help = L"Hilfe";
    	     const wchar_t * quit = L"Beenden";
    	     const wchar_t * selection = L"*                  *";
    	     TextOut(hDC, SCREEN_WIDTH/2, PS_GAME, game, wcslen(game));
    	     TextOut(hDC, SCREEN_WIDTH/2, PS_OPTIONS, options, wcslen(options));
    	     TextOut(hDC, SCREEN_WIDTH/2, PS_HELP, help, wcslen(help));
    	     TextOut(hDC, SCREEN_WIDTH/2, PS_QUIT, quit, wcslen(quit));
    
    	     TextOut(hDC, SCREEN_WIDTH/2, menuSelection, selection, wcslen(selection));
    	     DeleteObject(font);
    	}	
    
    	EndPaint(hWnd, &ps);
    	return;
    }
    

    Nun ist der Text "Spielen" ausgewählt. Dies wird in der Variable menuSelection gespeichert.
    Wenn man nun mit der Pfeiltaste nach unten klickt geschieht folgendes:

    menuSelection = PS_OPTIONS;            // Damit beim Zeichnen der Punkt "Optionen" ausgewählt wird
    InvalidateRect(hWnd, NULL, TRUE);      // Um WM_PAINT abzuschicken
    

    Und bei einem Klick auf Enter:

    menu = M_GAME;                         // Damit nicht mehr das Menü, sondern jetzt das Spielfeld gezeichnet wird
    InvalidateRect(hWnd, NULL, TRUE);      // Um WM_PAINT abzuschicken
    

    Nur wie kann ich das ohne globale Variablen lösen?
    Wenn ich außerhalb von WM_PAINT zeichne, geht es solange man das Fenster nicht so bewegt, dass WM_PAINT automatisch ausgelöst wird.
    Dann ist die Auswahl wieder auf Spielen.

    Wenn jemand mir helfen kann, bin ich sehr dankbar 👍

    MfG
    Conuber



  • Eine Alternative für deine Globalen wären z.B. statische Variablen in deiner WndProc.



  • Ja doch, das ist eine gute Idee 😉

    Vielen Dank!


Anmelden zum Antworten