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

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

1

22.11.2015, 16:38

Windows message: Problem mit WM_SIZE message

Hallo,

ich hab mir ein Windows-Fenster mit C++ erzeugt (wWinMain-Funktion, WNDCLASSEX-Struktur befüllen, registrieren, Fenster erzeugen und zeigen), was alles ohne Probleme funktioniert.

Das Gerüst der main-Loop sieht folgendermaßen aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
while (bRun)
{
    if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
    {
        // translate message (translate virtual key messages into a WM_CHAR message with the char code of the pressed key as wParam)
        TranslateMessage(&message);

        // window closed, stop the main loop
        if (message.message == WM_QUIT)
        {
            bRun = false;
        }

        if (message.message == WM_SIZE)
        {
            // do something
        }

        // dispatch message
        DispatchMessage(&message);
    }
    else
    {
        //  update and render here
    }
}


Das Problem hierbei ist, dass ich nie in das if-Statement

C-/C++-Quelltext

1
if (message.message == WM_SIZE)
hinein komme.

Wenn ich hingegen in der Callback-Funktion

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_SIZE)
    {
        // do something
    }

    // call the default window proc function for all messages we did not handle
    return (DefWindowProc(hwnd, uMsg, wParam, lParam));
}

die WM_SIZE-message abfangen will, klappt dies.

So wie ich das verstanden habe, holt die PeekMessage-Funktion die erste Message aus der Warteschlange und entfernt sie aus dieser (wegen PM_REMOVE), die message wird bei mir dann an TranslateMessage übergeben. Die Funktion übersetzt dann WM_KEYDOWN-Messages in eine WM_CHAR-message mit dem Buchstaben als wParam. Es wird also einfach eine neue Message erzeugt und hinten in die Schlange gestellt, die ich dann beim nächsten Mal (bzw. wenn alle davor abgearbeitet wurden) abholen kann.
Anschließend frag ich verschiedene Messages ab und übergeb die message dann an DispatchMessage, die doch unter anderem meine Callback-Funktion mit genau dieser message aufruft!?

Wenns allerdings so wäre, könnt ich ja die WM_SIZE-message direkt in dieser Schleife abfangen und darauf reagieren, was aber offenbar nicht funktioniert - in der Callback-Funktion hingegen schon. Deswegen werd ich wohl irgendwo einen Denkfehler haben. Könnt ihr mich da vielleicht aufklären?

Vielen Dank schon mal im Voraus.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

22.11.2015, 16:49

WM_SIZE gehört zu den nonqueued messages und geht nicht über die message queue, sondern direkt an die windows procedure: https://msdn.microsoft.com/en-us/library…queued_messages

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

3

22.11.2015, 17:20

Super, danke, dann ist das auch schon wieder geklärt. :)

Julién

Alter Hase

Beiträge: 717

Wohnort: Bayreuth

Beruf: Student | Hilfswissenschaftler in der Robotik

  • Private Nachricht senden

4

22.11.2015, 18:45

Kleiner Tipp: Nutze switch-case-Anweisungen.
Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
LRESULT WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
    switch(msg){
        case WM_SIZE:
            tuWas();
            return 0;
            break;
        case WM_DESTROY:
        case WM_CLOSE:
            PostQuitMessage(0);
            return 0;
            break;
         default:
            return DefWndProc(hWnd, msg, wParam, lParam);
            break;            
    }
}


Der Code sieht daduch schöner aus ;)
I write my own game engines because if I'm going to live in buggy crappy filth, I want it to me my own - Ron Gilbert

5

22.11.2015, 18:49

Wenn du das break noch wegmachst sieht es noch schöner aus ;)

Käsekönig

1x Contest-Sieger

  • »Käsekönig« ist der Autor dieses Themas
  • Private Nachricht senden

6

23.11.2015, 09:31

Oke, danke. :)

Werbeanzeige