Seite 1 von 1

[GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 28.10.2010, 10:04
von Tactive
Hallo,

ich weiß es klingt vlt. seltsam das ich Nachfrage wie man ein Fenster zentriert, aber ich habe hier ein besonderes problem. Ich habe zwei Monitore und möchte jetzt eigendlich das Fenster auf dem Bildschirm zentrieren, auf dem es sich gerade befindet oder zumindest auf dem Primären Bildschirm zentrieren. Habe da einfach , wie ich es kenne folgendes probiert:

Code: Alles auswählen

void SdlWindow::Center()
{
    RECT desktopRect;
    if (FALSE == GetWindowRect(GetDesktopWindow(), &desktopRect))
        ANEGMA_THROW(ExceptionType::IllegalState, _T("Unable to get desktop rectangle"), NULL);
    
    auto windowDimension = GetDimension();
    int nuXPos = ((desktopRect.right << 1) - (windowDimension.Width << 1));
    int nuYPos = ((desktopRect.bottom << 1) - (windowDimension.Height << 1));
    SetLocation(nuXPos, nuYPos);
}
Zur Zeit wird das Fenster irgendwo in den nicht sichtbaren Raum verschoben, was wohl daran liegt das mir GetWindowRect() die Gesamtgröße des Desktops liefert.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 28.10.2010, 14:28
von antisteo
Die WinAPI bietet eine Funktion EnumDisplaysEx.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 28.10.2010, 16:16
von Aramis
  • GetWindowRect fuer das Fenster
  • EnumDisplayMonitors mit besagtem Rechteck als Clipping-Rectangle
  • Im Callback kriegst du direkt ein passendes Bildschirm-Rechteck, Fenster darin zentrieren und die weitere Enumeration mit FALSE abbrechen.
Alternativ den Mittelpunkt des Fensters nehmen und nacheinander gegen alle Bildschirm-Rechtecke abgleichen. Hat evtl. den Vorteil dass die Auswahl des Monitors damit auf Basis der Fenstermitte vorgenommen wird.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 28.10.2010, 16:46
von exploid
@antisteo Die Winapi hat doch nix mit der SDL zu tun. :)

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 28.10.2010, 17:07
von antisteo
Nein ;)

Aber damit kannst du zumindestens unter Windows die Bildschirmausmaße erfahren (unter Linux dann Parallelcode mit der libX schreiben), mit denen sich das Fenster dann auf Position setzen lässt.

Die SDL bietet leider nicht so viele Funktionen, da sie nie so richtig weiterentwickelt wurde. Ich hab zufällig die Sources der libSDL da und es würde bestimmt auch Spaß machen, die SDL weiterzuentwickeln.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 28.10.2010, 21:38
von Tactive
Habs mit einfacher gemacht und zentriere momentan einfach gegen den Primärbildschirm, wenn ich dann später mehr brauche kann ich ja immern och dazuprogrogrammieren. In meinem Quellcode hatte noch den Fehler gemacht, in die falsche Richtung zu shiften - so das die Werte nicht halbiert sondern verdoppelt wurden.
antisteo hat geschrieben:Nein ;)
Aber damit kannst du zumindestens unter Windows die Bildschirmausmaße erfahren (unter Linux dann Parallelcode mit der libX schreiben), mit denen sich das Fenster dann auf Position setzen lässt.
Die SDL bietet leider nicht so viele Funktionen, da sie nie so richtig weiterentwickelt wurde. Ich hab zufällig die Sources der libSDL da und es würde bestimmt auch Spaß machen, die SDL weiterzuentwickeln.
Würde mich bei der SDL auch über eine "offiziell" 64 Bit Version freuen. Habe da vor 1-2 Jahren auch mal mit dem Sam Latinga im Usenet drüber gesprochen. Die SDL stammt ja aus seiner Zeit vor Blizzard, aber seitdem er dort ist, ist quasi Stillstand bei der SDL angesagt - leider. Bugfixes und Anpassungen werden aber weiterhin durchgeführt.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 28.10.2010, 21:40
von Tactive
exploid hat geschrieben:@antisteo Die Winapi hat doch nix mit der SDL zu tun. :)
Was die SDL nicht hat, muss man halt über die WinAPI rumzubauen. Zwar veliert man dann die Plattformunabhängigkeit aber die ist mir eh nicht wichtig.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 29.10.2010, 07:02
von antisteo
Tactive hat geschrieben:Was die SDL nicht hat, muss man halt über die WinAPI rumzubauen. Zwar veliert man dann die Plattformunabhängigkeit aber die ist mir eh nicht wichtig.
Du kannst ja vorsichtshalber trotzdem ein #ifndef unix drumherum schreiben. (Leider definiert der MS Compiler kein WIN32 oder ähnliches :S).

Check doch einfach mal die SDL Sources aus und schau, ob du dich reinfindest. Ein paar zusätzliche Funktionen geschrieben (SDL_CenterScreen oder so) und dann als Patch angeboten. Hier das Repos:

Code: Alles auswählen

hg clone http://hg.libsdl.org/SDL
Edit:
Hier alle SDL-Unterlibs mit Sourcecode: http://hg.libsdl.org/
Die müssten dann noch mit MinGW gebaut werden, da kannst du gleich für win64 portieren (Option -m64)

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 29.10.2010, 09:02
von Tactive
Naja, eigendlich unterstüzt die SDL das Zentrieren des Fensters ja schon, wenn auch etwas unschön gelöst. Dafür muss man in den UMgebungsvariablen der SDL (SDL_putenv) einfach SDL_VIDEO_CENTERED=center setzen. Positionieren geht dann über SDL_VIDEO_WINDOW_POS=x,y. Gilt aber wohl nur für das Erstellen des Fenster und in meiner Fenster-Klasse will ich quasi jederzeit ein Center ausführen können, daher mein drumherum.

Sicherlich könnte man das auch im SDL Source hinzufügen aber dann müsste ich mich noch mit X11 Programmierung beschäftig - was ich momentan nicht will ;)

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 29.10.2010, 10:47
von antisteo
Du kannst das Problem ja nur auf Windows-Seite fixen. Es gibt sowieso viele Funktionen in der SDL, die nur auf einer Plattform sind und umgekehrt.
Vielleicht ist das sogar im Source soweit abstrahiert, dass man beim Setzen der Variable eine Rezentrisierung auslösen kann, was das Problem lösen würde.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 29.10.2010, 10:57
von Alexander Kornrumpf
antisteo hat geschrieben: (Leider definiert der MS Compiler kein WIN32 oder ähnliches :S).
Nein.

http://msdn.microsoft.com/en-us/library/b0084kay.aspx
_WIN32 Defined for applications for Win32 and Win64. Always defined.
Hervorhebung von mir.

Re: Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 29.10.2010, 18:38
von antisteo
Alexander Kornrumpf hat geschrieben:
antisteo hat geschrieben: (Leider definiert der MS Compiler kein WIN32 oder ähnliches :S).
Nein.

http://msdn.microsoft.com/en-us/library/b0084kay.aspx
_WIN32 Defined for applications for Win32 and Win64. Always defined.
Hervorhebung von mir.
Hey cool! Danke für den Tipp (wir mussten in CG sonst die C++-Files umschreiben, um sie zur Kontrolle mit MS zum laufen zu bekommen)

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 30.10.2010, 15:44
von kimmi
Das Symbol heisst auch _WIN32, nicht WIN32. Ich bin da auch schon 1000 mal reingefallen :).

Gruß Kimmi

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 30.10.2010, 17:13
von antisteo
kimmi hat geschrieben:Das Symbol heisst auch _WIN32, nicht WIN32. Ich bin da auch schon 1000 mal reingefallen :).

Gruß Kimmi
Naja die Tutorin meinte, der Compiler ist zu keinem vorher bestimmten #define verpflichtet.
Anscheinend wieder mal ne Spätfolge dafür, dass man unerfahrene Studenten als Tutoren verpflichtet.

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 30.10.2010, 21:10
von Aramis
Ich verstehe das Problem nicht. Alle Compiler bieten es an Symbole auf der Kommandozeile vorzudefinieren. Dass sie dankenswerterweise standardmaessig welche drinhaben, ist ein Bequemlichkeitsfeature. Aber wenn du willst, kannst du auch LOLCATS Als Windows-spezifisches Token nehmen.

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 31.10.2010, 16:19
von antisteo
Aramis hat geschrieben:Ich verstehe das Problem nicht. Alle Compiler bieten es an Symbole auf der Kommandozeile vorzudefinieren. Dass sie dankenswerterweise standardmaessig welche drinhaben, ist ein Bequemlichkeitsfeature. Aber wenn du willst, kannst du auch LOLCATS Als Windows-spezifisches Token nehmen.
Es ging eher darum, festzustellen, welcher Compiler den Code gerade anpackt. Um das nicht in jedem VS-Projekt einstellen zu müssen, wäre es ja gut, dass es der Compiler mir selbst sagt (->was er ja auch tut, wie ich jetzt weiß).

--> Wir sind schon wieder OT.
Die Hauptfrage ist eigentlich beantwortet.

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 31.10.2010, 16:29
von Krishty
antisteo hat geschrieben:Es ging eher darum, festzustellen, welcher Compiler den Code gerade anpackt.
So?
_MSC_VER == Microsoft Visual C++ (1600 == 2010; 1500 == 2008; 1400 == 2005; 1310 == .NET 2003; 1300 == .NET 2002; …)
__GNUC__ == GNU Compiler Collection
__INTEL_COMPILER == Intel Compiler Collection
Aramis hat geschrieben:Dass sie dankenswerterweise standardmaessig welche drinhaben, ist ein Bequemlichkeitsfeature.
Naja … es gibt ja auch Makros, die #defined sein müssen … __cplusplus, __FILE__, … aber über die Zielplattform sagen die natürlich nichts.

Re: [GELÖST] Wie Fenster auf dem Bildschirm zentrieren?

Verfasst: 31.10.2010, 16:53
von eXile
Krishty hat geschrieben:__GNUC__ == GNU Compiler Collection
__INTEL_COMPILER == Intel Compiler Collection
Man bekommt zu beiden sogar zusätzlich noch die Versionsnummern raus. Eine sehr umfassende Übersicht findet man hier.