Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  Neuzeichnen während MessageBox auf Screen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Belli
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1110
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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!
C/C++ Forum :: WinAPI ::  Neuzeichnen während MessageBox auf Screen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.