| Autor |
Nachricht |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1110
|
Belli Mitglied
10:14:19 01.02.2012 Titel: |
Neuzeichnen während MessageBox auf Screen |
Zitieren |
Wer sorgt eigentlich dafür, dass mein Fenster neu gezeichnet wird, während mein Programm auf das Beenden einer MessageBox wartet und wie wird das gemacht? |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13521
|
Martin Richter Moderator
10:54:54 01.02.2012 Titel: |
|
Zitieren |
Die WM_PAINT Nachricht ist dafür verantwortlich.
Diese Nachricht wird automatisch erzeugt, wenn ein Fenster verdeckt war und wieder sichtbar wird.
Wenn man selbst ein Neuzeichnen möchte, kann man die Funtion InvalidateRect verwenden (RedrawWindow geht auch).
Wenn dies nun auch passieren soll, während eine MessageBox offen ist, dann benötigt man einen Timer, der für einen das Invalidate ausführt.
Aber grundsätzlich: Dein Programm zeigt auch keine neue Daten an, wenn es keinen Timer oder anderen Mechanimus hat (der WM_PAINT auslöst) und einfach nur so da steht im Vordergund... |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1110
|
Belli Mitglied
11:11:39 01.02.2012 Titel: |
|
Zitieren |
Ja, soweit ist das grundsätzlich klar. Mir ging es nur so durch den Kopf, dass mein Programm ja 'steht', während es auf den Rückgabewert der MessageBox wartet, und deshalb keine Nachrichten aus der Messagequeue holen kann. Demnach müsste WM_PAINT via SendMessage vom OS ausgeführt werden und nicht in die Nachrichtenwarteschlange eingereiht werden? |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13521
|
Martin Richter Moderator
11:55:48 01.02.2012 Titel: |
|
Zitieren |
Quatsch. MessageBox hat eine eigene Messageloop und die liefert auch Nachtrichten an Deine Fenster aus...
BTW: WM_PAINT ist eine Pseuonachricht, wie auch WM_TIMER die "egentlich" nicht gesendet wird!!! |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
Zuletzt bearbeitet von Martin Richter am 13:15:34 01.02.2012, insgesamt 1-mal bearbeitet |
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1110
|
Belli Mitglied
12:24:08 01.02.2012 Titel: |
|
Zitieren |
Aber wie kann mein Programm WM_PAINT behandeln, wenn doch MessageBox blockiert?
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | 1 2 3 4 5 6 7 8 9 10 | int testFunk()
{
Sleep(5000);
return 0;
}
...
int a = testFunk();
a = MessageBox(hwnd, ...); | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | int testFunk()
{
Sleep(5000);
return 0;
}
...
int a = testFunk();
a = MessageBox(hwnd, ...); | |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 10 | int testFunk()
{
Sleep(5000);
return 0;
}
...
int a = testFunk();
a = MessageBox(hwnd, ...); | |
Während das Programm in testFunk wartet, wird nix neugezeichnet, wenn ich ein anderes Fenster drüberziehe, wenn es jedoch darauf wartet, dass a mit dem Rückgabewert von MessageBox gefüllt wird, wird neugezeichnet.
Im ersten Fall (testFunk) wird neu gezeichnet, wenn testFunk verlassen wird, im Fall der MessageBox wird sofort neu gezeichnet, obwohl doch mein Programm auf die Rückkehr von MessageBox wartet, so wie es vorher auf die Rückkehr von testFunk wartet ...
Irgendwie kriege ich da die Fäden nicht zusammen. |
|
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13521
|
Martin Richter Moderator
13:15:58 01.02.2012 Titel: |
|
Zitieren |
Warum liest Du nicht?
| Martin Richter schrieb: | Quatsch. MessageBox hat eine eigene Messageloop und die liefert auch Nachtrichten an Deine Fenster aus...
| |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1110
|
Belli Mitglied
14:04:20 01.02.2012 Titel: |
|
Zitieren |
Ich les das schon, aber offensichtlich verstehe ich nicht, was
"die liefert auch Nachtrichten an Deine Fenster aus"
bedeutet ...
Es bedeutet wohl nicht, dass MessageBox eine Message (WM_PAINT) in die Queue für meine Fenster stellt, denn die würde ja erst abgearbeitet, wenn mein Programm weiterläuft.
Also nochmal:
Mein Programm wartet auf die Rückkehr von MessageBox.
Ich ziehe irgendein anderes Fenster über mein Programmfenster und wieder weg.
Mein Fenster muss neu gezeichnet werden.
Das stellt doch das OS fest (oder irre ich mich schon hier?)
Also muss das OS nun dafür sorgen, dass der case WM_PAINT - Teil in meinem Programm ausgeführt wird.
Also irgendwer muss irgendwie dahin verzweigen.
Mein Programm selbst wird es wohl nicht sein, da es ja auf MessageBox wartet. Und nun sagst Du:
"MessageBox hat eine eigene Messageloop und die liefert auch Nachtrichten an Deine Fenster aus"
Okay, aber weiß MessageBox überhaupt, dass mein Fenster neu gezeichnet werden muss? Und wenn, dann müsste MessageBox doch irgendwie meine für WM_PAINT vorgesehenen Instruktionen ausführen (lassen), also doch via SendMessage?
Ich raffs einfach nicht ... |
|
|
|
 |
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13529
|
hustbaer Mitglied
14:40:15 01.02.2012 Titel: |
|
Zitieren |
| Zitat: | | Also muss das OS nun dafür sorgen, dass der case WM_PAINT - Teil in meinem Programm ausgeführt wird. |
Nein, das macht dein Programm selbst.
Ist halt in der MFC versteckt, aber die ist kein Teil des OS.
Irgendwo in der MFC steht sowas in der Art:
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 | 1 2 3 4 5 6 7 8 9 | void CBlubb::Run() // führt das Programm aus
{
while (!HabenFertig())
{
MSG msg;
HolNeNachricht(&msg);
VerarbeiteDieNachricht(&msg);
}
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 | void CBlubb::Run() // führt das Programm aus
{
while (!HabenFertig())
{
MSG msg;
HolNeNachricht(&msg);
VerarbeiteDieNachricht(&msg);
}
}
| |
| C/C++ Code: | 1 2 3 4 5 6 7 8 9 | void CBlubb::Run() // führt das Programm aus
{
while (!HabenFertig())
{
MSG msg;
HolNeNachricht(&msg);
VerarbeiteDieNachricht(&msg);
}
}
| |
Die Funktion VerarbeiteDieNachricht() sorgt dann dafür, dass dein OnPaint() etc. aufgerufen wird.
Und in der MessageBox Funktion steht auch genau so eine Schleife!
Nur dass dort while (!HabenFertig()) mit while (MessageBoxNochSichtbar()) ersetzt wurde.
Probier einfach mal folgendes: erzeuge in einem deiner Fenster einen Timer. Und in OnTimer() zeigst du ne MessageBox() an. Tadaaaaaaaa.... eine Million Message-Boxen. |
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
|
|
 |
Martin Richter
Moderator
Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13521
|
Martin Richter Moderator
14:49:40 01.02.2012 Titel: |
|
Zitieren |
| Belli schrieb: | Es bedeutet wohl nicht, dass MessageBox eine Message (WM_PAINT) in die Queue für meine Fenster stellt, denn die würde ja erst abgearbeitet, wenn mein Programm weiterläuft.
|
Doch es bedeutet genau das.
Dein Programm hat nur eine Queue (genauer Dein Thread), aber jeder Programmteil kann doch PeekMessate/GetMessage/TranslateMessage/DispatchMessage ausführen wann er will.
Genau dasmacht DoModal und genau das mach auch eine MessageBox (die wiederum DoModal aufruft).
| Belli schrieb: |
Also nochmal:
Mein Programm wartet auf die Rückkehr von MessageBox.
Ich ziehe irgendein anderes Fenster über mein Programmfenster und wieder weg.
Mein Fenster muss neu gezeichnet werden.
Das stellt doch das OS fest (oder irre ich mich schon hier?)
|
Jo!
| Belli schrieb: |
Also muss das OS nun dafür sorgen, dass der case WM_PAINT - Teil in meinem Programm ausgeführt wird.
|
Jo!
| Belli schrieb: |
Also irgendwer muss irgendwie dahin verzweigen.
Mein Programm selbst wird es wohl nicht sein, da es ja auf MessageBox wartet.
|
Genau. Undda ein WM_APINT nur erzeugt wird wenn GetMessage/PeekMessage ausgeführt wird kannst Du davon ausgehen, dass MessageBox genau das tut... nämlich auch eine MessageLoop auf der gemensamen Messagequeue ausführen.
| Belli schrieb: |
Und nun sagst Du:
"MessageBox hat eine eigene Messageloop und die liefert auch Nachtrichten an Deine Fenster aus"
Okay, aber weiß MessageBox überhaupt, dass mein Fenster neu gezeichnet werden muss? Und wenn, dann müsste MessageBox doch irgendwie meine für WM_PAINT vorgesehenen Instruktionen ausführen (lassen), also doch via SendMessage?
|
Nö Das weiß GetMessage!
| Belli schrieb: | | Ich raffs einfach nicht ... |
Mach Dir nix draus, dass ist mehr oder weniger ein temporärer Zustand deren Dauer mehr oder weniger lange andauert... |
_________________ Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1110
|
Belli Mitglied
15:55:39 01.02.2012 Titel: |
|
Zitieren |
Mhm, vielleicht hab ichs jetzt:
Wenn ich Dich richtig verstehe, holt die MessageLoop der MessageBox (auch) Messages die für mein Fenster bestimmt sind ab - und nicht nur solche die für die MessageBox bestimmt sind, also quasi eine zweite MessageLoop für mein Fenster. WM_PAINT für mein Fenster wird dann dispatched und sozusagen im Kontext der MessageLoop von MessageBox erledigt.
MessageBox hat eine eigene Messageloop und die liefert auch Nachtrichten an Deine Fenster aus...
würde also bedeuten, dass MessageBox Nachrichten für mein Fenster überhaupt erst mal abholt und dann dispatched ...
So richtig?
@hustbaer:
MFC ist nicht im Spiel. |
|
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1110
|
Belli Mitglied
15:59:22 01.02.2012 Titel: |
|
Zitieren |
Okay, GetMessage holt alle Nachrichten aus der Queue für den aufrufenden Thread ab. Da MessageBox im selben Thread läuft, holt die dort implementierte Nachrichtenschleife alles ab und dispatched es ...
Hat eine Weile gedauert, aber nun hab ichs.
Danke für Deine/Eure Geduld! |
|
|
|
 |