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.