Wechseln zw Fullscreen und Windowed



  • 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