Wechseln zw Fullscreen und Windowed



  • Zwischen Vollbild und im Fenster umzuschalten ist an sich kein Prob, aber:

    Wenn mein Prog im Fenster startet soll es eine Titelleiste haben und den ganzen Kram mit Borders und so...
    Im Fullscreen natürlich nicht, weil erstens sieht man dann noch die Taskleiste, zweitens sieht man auch die Titelleiste, und das wäre kein Fullscreen...
    Soweit so gut, ich hab beim Starten des Progs eine Msgbox aufgerufen bei der man zwischen FS und W wählen kann und je nachdem wird dann das Fenster erzeugt.

    Doch jetzt das Problem.
    Wenn ich während der Laufzeit das Fenster per Tastendruck auf Vollbild bzw. Fenster umschalte, bleibt der ursprüngliche Style natürlich erhalten. Jetzt les ich in der MSDN, dass man Styles nach Erzeugung des Fensters nicht mehr ändern kann (abgesehen von einigen wenigen ausnahmen)..
    Aber da muss es doch eine Möglichkeit geben!
    zB kann man doch auch manche Spiele sowohl im Fenster als auch im Vollbild spielen und jedesmal ändert sich der Style wenn man das umschaltet

    Viel Text... hier der Sinn des ganzen:
    Wie kann man die Styles während der Laufzeit ändern? 🙂



  • SetWindowLong bzw. SetWindowLongPtr sollte die Lösung deines Problems sein.

    LONG SetWindowLong(
        HWND hWnd,
        int nIndex,
        LONG dwNewLong
    );
    

    mit GWL_EXSTYLE bzw. GWL_STYLE bei nIndex!



  • Jetzt wo ich das DWnewlong sehe wird mir einiges klar... die funktion kannte ich bereits, wusste aber nicht wo ich den neuen style übergeben soll... jetzt check ichs erst... thx!



  • hmm.. irgendwas funktioniert bei mir nicht so ganz..

    wenn ich F4 drücke, soll sich der Style ändern, sprich wechseln zwischen Vollbild und Fenster.
    Und hier das Problem:
    1.) Das Fenster reagiert erst beim dritten Druck auf F4
    2.) Anstatt dem Wechsel zwischen Vollbild und Fenster wird das Fenster einfach unsichtbar (es ist aber noch in der Startleiste zu sehen) bzw. wieder sichtbar..
    Ich vermute er ändert zwar den Style allerdings zeigt er dann den neuen Style nicht an..
    Hier ist mal der Code:

    // GLOBALS //
    
    HWND hwnd;
    BOOL blnClose = false;
    BOOL blnFullscreen = true;
    
    // CODE //
    
    //// WINMAIN ////
    int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInst,LPSTR lpCmdLine,int nShowCmd)
    {
       WNDCLASSEX   winclass;
       MSG         message;
       const char  chClassName[] =      "Test";
       DWORD      dwDefStyle;
    
       if(MessageBox(NULL,"Press Yes to view in Fullscreen:","Choose Display Mode",MB_YESNO | MB_ICONQUESTION) == IDNO)
       {
          dwDefStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_POPUP;
          blnFullscreen = false;
       }
       else
       {
          dwDefStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
       }
    
       // WINDOW CREATION //
       winclass.cbSize         =   sizeof(WNDCLASSEX);
       winclass.style         =   CS_HREDRAW | CS_VREDRAW;
       winclass.lpfnWndProc   =   WindowProc;
       winclass.cbClsExtra      =   0;
       winclass.cbWndExtra      =   0;
       winclass.hInstance      =   hInst;
       winclass.hIcon         =   LoadIcon(NULL,IDI_APPLICATION);
       winclass.hIconSm      =   LoadIcon(NULL,IDI_APPLICATION);
       winclass.hCursor      =   LoadCursor(NULL,IDC_ARROW);
       winclass.hbrBackground  =   (HBRUSH)GetStockObject(BLACK_BRUSH);
       winclass.lpszMenuName   =   NULL;
       winclass.lpszClassName  =   chClassName;
    
       if(!RegisterClassEx(&winclass))
          return 0;
    
       if(!(hwnd = CreateWindowEx(   WS_EX_TOPMOST,
                            chClassName,
                            "Test-Fenster",
                            dwDefStyle,
                            0,0,
                            SCREEN_WIDTH,
                            SCREEN_HEIGHT,
                            NULL,
                            NULL,
                            hInst,
                            NULL)))
          return 0;
    
            GetClientRect(hwnd,&rClient);
    
       ShowCursor(false);
    
       // MAIN LOOP //
       while(!blnClose)
       {
          while(GetMessage(&message,NULL,0,0))
          {
             TranslateMessage(&message);
             DispatchMessage(&message);
          }
       }
    
       return message.wParam;
    }
    
    //----------------------------------------------------------------------
    
    //// CALLBACK ////
    LRESULT CALLBACK WindowProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lparam)
    {
       switch(message)
       {
          case WM_DESTROY:
          {
             blnClose = true;
             PostQuitMessage(0);
             return 0;
          }
    
          case WM_KEYDOWN:
          {
             switch(wparam)
             {
                case VK_ESCAPE:
                {
                   PostMessage(hwnd,WM_CLOSE,0,0);
                   return 0;
                }
                case VK_F4:
                {
                   if(!blnFullscreen)
                   {
                      if(!SetFullscreen())
                         return 0;
                   }
                   else
                   {
                      if(!SetWindowed())
                         return 0;
                   }
                }
             }
          }
    
          default:
             break;
       }
    
       return(DefWindowProc(hwnd,message,wparam,lparam));
    }
    
    //----------------------------------------------------------------------
    
    //// FULLSCREEN MODE ////
    int SetFullscreen()
    {
       DWORD dwNewStyle;
    
       dwNewStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
    
       if(!SetWindowLong(hwnd,GWL_EXSTYLE,dwNewStyle))
       {
          return 0;
       }
    
       blnFullscreen = true;
    
       return 1;
    }
    
    //----------------------------------------------------------------------
    
    //// WINDOWED MODE ////
    int SetWindowed()
    {
       DWORD dwNewStyle2;
    
       dwNewStyle2 = WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_POPUP;
    
       if(!SetWindowLong(hwnd,GWL_EXSTYLE,dwNewStyle2))
       {
          return 0;
       }
    
       blnFullscreen = false;
    
       return 1;
    }
    

    Hoffe ihr könnt mir helfen..

    [ Dieser Beitrag wurde am 03.11.2002 um 17:25 Uhr von Chekson editiert. ]

    [ Dieser Beitrag wurde am 03.11.2002 um 17:26 Uhr von Chekson editiert. ]



  • King schrieb dazu in Dialog per CreateWindowEx erzeugen... kleines Problem...

    Nach dem Aufruf von SetWindowLongPtr muß noch SetWindowPos aufgerufen werden. Zitat MSDN: "If you have changed certain window data using SetWindowLong, you must call SetWindowPos to have the changes take effect. Use the following combination for uFlags: SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED"

    [ Dieser Beitrag wurde am 03.11.2002 um 17:33 Uhr von flenders editiert. ]



  • [...]
    
    case VK_F4:
        if(!ChangeScreenMode(hwnd)) return 0;
    
    [...]
    
    int ChangeScreenMode(HWND hWnd)
    {
        DWORD dwNewStyle;
    
        if (blnFullscreen) {
            dwNewStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_POPUP;
        }
        else {
            dwNewStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
        }
    
        if(!SetWindowLong(hWnd, GWL_STYLE, dwNewStyle)) {
            return 0;
        }
    
        if(!SetWindowPos(hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED)) {
            return 0;
        }
    
        blnFullscreen = ~blnFullscreen;
    
        return 1;
    }
    

    [ Dieser Beitrag wurde am 03.11.2002 um 17:57 Uhr von flenders editiert. ]



  • komischerweise kennt mein Compiler SetWindowLongPtr nicht. Außerdem hat das SetWindowPos auch überhaupt nichts gebracht... noch immer das selbe Problem.



  • if(!SetWindowLong(hwnd, GWL_EXSTYLE, dwNewStyle)) {
            return 0;
        }
    

    Sollte es nicht vielleicht GWL_STYLE heißen?



  • SetWindowLongPtr ist nur eine neue (64bit kompatible) Version von SetWindowLong! Sie ist aber erst in neueren SDKs mit drin.



  • THX für deine Hilfe, allerdings hat sich da nicht viel getan. Wenn ich jetzt im Fullscreen starte und F4 drücke tut sich gar nichts und wenn ich im Fenster starte existiert das selbe Problem wie vorhin... sry.



  • Hab den Code jetzt nochmal geändert! das Fenster-Handle muss in der Funktion natürlich bekannt sein!



  • Jep, das hat geholfen..
    Hab eigentlich gedacht für ein Extended Window braucht man auch GWL_EXSTYLE...
    Jetzt funktioniert nur eins nicht. Nachdem ich im Vollbild starte und dann F4 drücke gehts zwar, aber nur einmal.. danach wechselt er nicht mehr. Wenn ich im Fenster starte geht alles wunderbar. Aber das dürfte irgendein logischer Fehler in der WindowProc Funktion sein..
    Danke für die Hilfe



  • [cpp]if(MessageBox(NULL,"Press Yes to view in Fullscreen:","Choose Display Mode",MB_YESNO | MB_ICONQUESTION) == IDNO)
    {
    dwDefStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE | WS_POPUP;
    blnFullscreen = false;
    }
    else
    {
    dwDefStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN;
    blnFullscreen = true;
    }[/cpp]


Anmelden zum Antworten