Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

1

12.02.2017, 17:42

[GELÖST] Windowsprogrammierung: Größe des Client-Bereichs festlegen

Hallo Community,

ich spiele zur Zeit ein wenig mit der Windows API herum und wollte mir ein Fenster mit folgenden Eigenschaften erstellen:
- Fenstergröße lässt sich NICHT zur Laufzeit verändern
- Einen Rand, sowie eine Fensterleiste mit "Minimieren" und "Schließen" Knopf (kein Maximieren)
- Vorallem möchte ich einen Client-Bereich mit im voraus festgelegter Größe

Der letzte Punkt ist auch leider der Problematische. Ich habe schon die Funktion AdjustWindowRect() gefunden, aber bekomme trotzdem nicht meinen gewünschten Client-Bereich. Zum testen soll er 1000x1000 Pixel groß sein.

C-/C++-Quelltext

1
2
3
4
5
6
7
RECT WindowRect = {};

WindowRect.left = 500;
WindowRect.top = 500;
WindowRect.bottom = 1000;
WindowRect.right = 1000;
BOOL Test = AdjustWindowRect (&WindowRect, WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_VISIBLE, 0);

Die übergebenen Stile für AdjustWindowRect zeigen nur meinen letzten Versuch. Zu Beginn hatte ich nur WS_CAPTION übergeben.

Mein Fenster erstelle ich wie folgt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
HWND WindowHandle = CreateWindowA (
        "Window Class",
        "Test",
        WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_VISIBLE,
        WindowRect.left, WindowRect.top, WindowRect.right, WindowRect.bottom,
        0,
        0,
        Window,
        0);

Ich habe das ganze auch schon mit und ohne WS_OVERLAPPED versucht.

Und die Größe des Client-Bereichs überprüfe ich anschließend mit

C-/C++-Quelltext

1
2
RECT TestClientRect;
GetClientRect (WindowHandle, &TestClientRect);

Wenn ich mir TestClientRect im Visual Studio Debugger anschaue zeigt er mir für linksoben 0, 0 an und für rechtsunten 992, 970. Nun frage ich mich, ob ich zum Einen die richtigen Angaben gemacht habe und zum Anderen, ob ich das Ergebnis richtig deute.

Ich hoffe, jemand hier hat mehr Ahnung von der Windows API als ich und kann mir helfen. :)
Das muss so!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »YAR« (12.02.2017, 22:21) aus folgendem Grund: Gelöst


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

12.02.2017, 18:09

WindowRect.right und WindowRect.bottom sind nicht die Breite und Höhe... ;)

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

3

12.02.2017, 19:08

Ich habe gerade nochmal in die Dokumentationen von CreateWindow() und AdjustWindowRect() auf MSDN geschaut, aber ich sehe nicht, wo der Fehler liegt. :zombie:
Wenn das jetzt an irgendeiner Feinheit liegt, wie Microsoft sein Koordinatensystem interpretiert, dann muss ich, glaube ich, jemanden hauen.
Das muss so!

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

4

12.02.2017, 19:26

Wenn du ein 100x100 Viereck hast, dann an den Koordinaten 100x100 beginnt, dann ist die Breite/Höhe 100, aber right/bottom ist 200.
Das ist auch keine Feinheit, oder irgendwas großartig komisches.

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

5

12.02.2017, 19:44

Ich entschuldige mich schon einmal im voraus für die fachlich wahrscheinlich vollkommen falschen Ausdrücke. An mir ist definitiv kein Mathematiker verloren gegangen ;)

Also wenn ich die Funktionsweise von CreateWindow() richtig verstehe, dann sind die ersten beiden Koordinaten x und y der oberen linken Ecke des Fensters. Die anderen Beiden sind die Koordinaten der unteren rechten Ecke, aber relativ zum ersten Punkt, nicht zur oberen linken Ecke des Bildschirms.
GetClientRect() liefert für links oben immer 0, 0 zurück und für unten rechts dann die x und y Koordinate relativ zum Nullpunkt des Client-Areals. Also im Grunde das gleiche, nur auf den Client-Bereich bezogen.

Oder habe ich da etwas missverstanden?
Das muss so!

Tobiking

1x Rätselkönig

  • Private Nachricht senden

6

12.02.2017, 20:35

Die anderen Beiden sind die Koordinaten der unteren rechten Ecke, aber relativ zum ersten Punkt, nicht zur oberen linken Ecke des Bildschirms.

Also einfach ausgedrückt die Höhe und Breite.

Die Funktion AdjustWindowRect arbeitet aber nicht mit x,y,Höhe,Breite sondern mit left,top,bottom,right. Der linkte Border wird bei left abgezogen, der rechte bei right draufaddiert etc. Das führt bei deiner Interpretation dazu das dein Fenster um den linken Border verschoben wird und nur um den rechten Border größer wird.

YAR

Frischling

  • »YAR« ist der Autor dieses Themas
  • Private Nachricht senden

7

12.02.2017, 22:19

So, nach einer Pause habe ich es endlich verstanden.

Jetzt sieht das ganze so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WindowRect.left = 500;
WindowRect.top = 500;
WindowRect.bottom = 1500;
WindowRect.right = 1500;
BOOL Test = AdjustWindowRect (&WindowRect, WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_VISIBLE, 0);

HWND WindowHandle = CreateWindowA (
            "Window Class",
            "Test",
        WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_VISIBLE,
        WindowRect.left, WindowRect.top, WindowRect.right - WindowRect.left, WindowRect.bottom - WindowRect.top,
        0,
        0,
        Window,
        0);


Vielen Dank für eure Hilfe. :) Ich stand echt auf dem Schlauch.
Das muss so!

Werbeanzeige