2016-12-15 5 views
2

Ich möchte SDL-Fenstergröße innerhalb von working area (SPI_GETWORKAREA) von Windows bleiben, die Windows-Taskleiste anderen Panels ausschließt.SDL adjust window size

Das Problem besteht darin, dass sowohl SDL_CreateWindowSDL_SetWindowSize und den Innen-Bereich des Fensters festgelegt, nicht die Größe, einschließlich der Fenstergrenzen. Wenn ich also die Fenstergröße auf einen kleinen Arbeitsbereich einstelle, gehen die Ränder immer noch aus dem Arbeitsbereich.

SDL_CreateWindow: Mit dieser Funktion können Sie die Größe einesClient-Bereich des Fensters.

Bietet SDL eine Möglichkeit, die Fenstergröße im Arbeitsbereich festzulegen? oder wie bekomme ich die Rahmengröße des SDL-Fensters, damit ich das selbst machen kann?

Antwort

3

Die einzige mir bekannte Möglichkeit (SDL 1.2) besteht darin, zunächst ein kleines Fenster (2x2 Pixel) zu erstellen und dann die Gesamtfenstergröße mit der Windows API (GetWindowPlacement) zu überprüfen. Auf dieser Grundlage können Sie die Parameter berechnen, die erforderlich sind, um die Fenstergröße zu erhalten, nach der Sie suchen, und schließlich die Größe des Fensters ändern (MoveWindow).

Ich hoffe, jemand hat eine bessere Lösung, weil dies eine sehr hässliche Problemumgehung ist.

+0

Ich denke, dass Sie 2x2 Größe Fenster nicht erstellen müssen. Wenn Sie Windows API trotzdem verwenden, können Sie 'GetWindowPlacement' verwenden, um Fensterkoordinaten zu erhalten, und dann' ClientToScreen', um Clientbereich-Koordinaten auf dem Bildschirm anzuzeigen. Mathe auf diesen beiden geben die Grenzgrößen. – SMUsamaShah

+0

Wenn Sie eine Lösung finden, die das Fenster mit der korrekten Größe direkt erstellt, ohne zuerst ein temporäres Fenster anzuzeigen, geben Sie Ihren Code ein. –

+0

Um WinAPI zu verwenden, brauchen wir zuerst das Fenster. Ich konnte keinen Weg finden, es mit SDL alleine zu machen. – SMUsamaShah

2

Verwenden Sie SDL_GetWindowSize(), um die Größe des Clientbereichs in Bildschirmkoordinaten abzufragen, und SDL_GL_GetDrawableSize() oder SDL_GetRendererOutputSize(), um die Zeichengröße in Pixel abzufragen.

Edit 1:

A die Sie erwähnt haben, dass Sie Windows verwenden, so dass Sie GetWindowRect() verwenden können, dass Sie das Rechteck gibt, die die Grenzen des Fensters enthält und GetClientRect() gibt Ihnen das Rechteck, das die Grenzen ausschließt - Der Bereich, der der fensterspezifischen Zeichnung zugewiesen ist.

Hinweis: Bitte beachten Sie, dass GetWindowRect() kehrt ein Rechteck in Bildschirmkoordinaten - Koordinaten, die auf dem Bildschirm/Monitor relativ sind. GetClientRect() gibt ein Rechteck zurück, das relativ zu sich selbst ist.

Beispiel: Wie Sie WINAPI verwenden, können Sie das Arbeitsbeispiel from here sehen.

2

Sie brauchen nicht einmal WinAPI, um das zu tun.

Die Größe des Fensterrahmen kann, sollte durch SDL_GetDisplayUsableBounds() zurückgegeben wird durch SDL_GetWindowBordersSize(), und der Teil des Displays nicht belegt durch Taskleiste bestimmt werden.

Mit diesen Funktionen sollte die korrekte Fensterposition (und vielleicht die Größe) einfach gehalten werden.