Leider mal wieder Fullscreen *duck*



  • hi... leider ist es immer wieder dasselbe Thema...
    ich hab in der letzten Stunde nix anderes gemacht, als den Code durchzugehen, und mit anderen zu vergleichen.... Klammern überprüft usw.... aber ich komme auf keinen grünen Zweig... ich wette es ist ein ganz einfacher Fehler... und ich werde mir an den Kopf fassen, wenn mir wer den Fehler nennt. Also hier ist der Code...

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    bool fullscreen = true;
    bool OsWinNt(void);
    int NW,NH,NC,NF;
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
      Form1->Left = (Screen->Width - 800) / 2;     //Hier setzten wir unsere Form erstmal in die Mitte
      Form1->Top = (Screen->Height - 600) / 2;      //des Bildschirms
    
      Form1->DoubleBuffered = true;                 //Hier nicht unbedingt notwendig, schadet aber nicht
      Form1->BorderStyle = bsNone;                  //Die Titelleiste der Form ausblenden (kein Border)
    
      NW = Screen->Width;                           // alte Breite der Bildschirmauflösung
      NH = Screen->Height;                          // und alte Höhe, das brauchen wir zum Zurückschalten
      NC = GetDeviceCaps(Canvas->Handle,BITSPIXEL); //Farbtiefe erfragen
    
      DEVMODE Modus;
      bool Modok = false;
      int CurrentModeNo = 0;
      while (EnumDisplaySettings(NULL, CurrentModeNo, &Modus)) // Prüfen, ob einer der verfügbaren Videomodi die
      {                                                        // neuen Einstellungen unterstützt
        if (Modus.dmBitsPerPel == DWORD(NC) && Modus.dmPelsHeight == DWORD(600) && Modus.dmPelsWidth == DWORD(800))
        {                                                      // Wenn ja,
          if(OsWinNt())                                        // und wenn OS NT,2000 oder XP ist,
          {                                                    // vergleiche die Bildwiederholfrequenz:
            if(Modus.dmDisplayFrequency == (DWORD)NF)
            {
              Modok = true;                                      //dann ist der Modus ok
              break;
            }
          }
          else
          {
            Modok = true;                                        // Wenn kein NT-System, dann
            break;                                               // ist Modus auf jedenfall ok
          }
        }
    
      CurrentModeNo++;
      }
    
      AnsiString screenMessage;                     //screenMessage wird deklariert
      if(Modok)                                     //Wenn Modus ok
      {
        int Status = ChangeDisplaySettings(&Modus, CDS_UPDATEREGISTRY);
        if (Status == DISP_CHANGE_SUCCESSFUL)       //Wenn Display erfolgreich geändert
        {                                           //wurde
          fullscreen = true;                        //setze fullscreen auf true
        }
        else                                        //Wenn Display nicht erfolgreich
        {                                           //geändert wurde
          screenMessage = "Angegebene Bildschirmeinstellungen werden "
          "auf diesem System nicht unterstützt !";  //Zeige folgende Message
          ShowMessage(screenMessage);
        }
      }
      Button2->Visible = true;                      //Button wird angezeigt
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
      Button2->Visible = false;
      if (fullscreen)                               //Wenn momentan Fullscreen
      {
        DEVMODE Modus;
        int CurrentModeNo = 0;
        while(EnumDisplaySettings(NULL, CurrentModeNo, &Modus))  //Prüfen, ob einer der verfügbaren Videomodi die
        {                                                        // neuen Einstellungen unterstützt
          if (Modus.dmBitsPerPel == (DWORD)NC && Modus.dmPelsHeight == (DWORD)NH && Modus.dmPelsWidth == (DWORD)NW)
          {
            break;
          }
          CurrentModeNo++;
        }
        fullscreen = false;                         //Kein Fullscreen mehr
      }
    
      //Nun noch die standart größen der Form, wieder in die Mitte setzten und den Border
      //auf bsSingle zurück setzten, damit wir die Titelleiste sehen
      Form1->Width = 800;
      Form1->Height = 600;
      Form1->Left = (Screen->Width - 800) / 2;
      Form1->Top = (Screen->Height - 600) / 2;
      Form1->BorderStyle = bsSingle;
    }
    //---------------------------------------------------------------------------
    bool OsWinNt(void) //Überprüfung, ob es ein NTsystem ist, wenn ja wird true zurückgegeben
    {
      OSVERSIONINFO stVerInfo;
      stVerInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
      GetVersionEx(&stVerInfo);
      return (stVerInfo.dwPlatformId==VER_PLATFORM_WIN32_NT);
    }
    

    ich hoffe er ist ausreichend kommentiert...
    im Prinzip macht der Code nix anderes als die Form1 im Fullscreen anzuzeigen und wenn man dann auf den Button klickt, der erst dann erscheint... kommt man wieder in den Window-mode...

    Nun ist das Problem, dass er einfach nich in den Fullscreenmode geht... er ändert meine Screengröße einfach nich ab...
    Wenn ich die OS-Überprüfung und die Frequenz-Überprüfung rausnehm, dann geht er zwar in den Fullscreenmode, aber behält dann die größe 800*600 bei... also muss ich von Hand meine Einstellung wieder machen...
    Für jede Hilfe wär ich dankbar... wenn ich irgendwas forenregeltechnisches Falsch gemacht hab, bidde daraufhinweisen...

    mfg mck...



  • Wäre nett, wenn du uns auch noch sagst, was nicht funktioniert. 😉 😃



  • Nett wäre auch, wenn du nochmal erklärst, was du damit eigentlich vorhast. Ich verstehe z.B. nicht, was das mit dem Umschalten der Auflösung soll.

    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
      Top = 0;
      Left = 0;
      Width = Screen->Width;
      Height = Screen->Height;
      BorderStyle = bsNone;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      Top = 100;
      Left = 100;
      Width = 640;
      Height = 480;
      BorderStyle = bsSingle;
    }
    //---------------------------------------------------------------------------
    

    Fertig ist die FullScreen-Form inklusive "Exit".



  • Erstma thx für deine schnelle Antwort...

    das Problem ist, dass er überhaupt nicht in den Fullscreenmode geht... also er ändert nicht die Auflösung des Users. Dein Code ändert ja die Form... aber ich möcht nich die Form an den User anpassen, sondern den User an die Form...



  • Hallo

    also er ändert nicht die Auflösung des Users. Dein Code ändert ja die Form... aber ich möcht nich die Form an den User anpassen, sondern den User an die Form

    Die Auflösung des Users? Meinst du die Auflösung des Desktops? 😕

    bis bald
    akari



  • die Auflösung zu verändern würd ich mir wirklich gut überlegen.
    Wenn der User ein paar Icons ganz rechts oder ganz unten am
    Desktop hat, kann es vorkommen, dass diese verschoben werden.
    Sowas find ich z.B. immer total nervig.



  • Jau, im Prinzip genau das...

    Wie kann man das verschieben von Icons verhindern? Ich mein bei den meisten Spielen, die die Auflösung ändern werden ja auch keine Icons verschoben oder? Mein Programm soll nicht einfach nur die Auflöung ändern, sondern nur solange geändert lassen, bis ich wieder auf den Button1 drück...


Anmelden zum Antworten