MFC MDI Anwendung repaint
-
Hallo Zusammen!
Ich will aus meiner ViewKlasse (MDI) eine art Repaint (wie im Java) aufrufen.
das einzige was bisher funktioniert hat war ein CWnd::Invalidate() in der Paint methode der View Klasse.
Das Problem hiermit ist aber dass er die ganze Zeit neuzeichnet, ohne den rest des Programmes auszuführen.GetDocument()->UpdateAllViews(NULL); gibt einen Fehler..
Könnt ihr mir weiterhelfen??
Vielen Dank!!
-
Wa rufst Du "Invalidate" auf? In der Paint-Routine? Was soll denn das?
-
Das ging aber schnell! he he
das funktioniert soweit, dass das ViewFenster nonstop repaintet wird... (Brigt natürlich nichts..)wenn ich die Funktioen CWnd::Invalidate(); aus meienm Thread in einem Dialog starte passiert aber garnix
-
Warum rufst Du denn Invalide auf?
Was machst Du mit dem zweiten Thread?Erklär uns doch mal ein wenig was Du überhaupt tun willst?
Wenn möglich Zeit uns den Code der Probleme verursacht.Soweit ich weiss kann man Invalidate nur im gleichen Thread aufrufen, welches auch das Fenster erzeugt hat...
-
könntest auch probieren aus dem 2. Thread eine Paint-Nachricht an den ersten zu schicken
-
Du kannst Dir auch das simple Beispiel hier mal anschauene:
http://msdn.microsoft.com/library/en-us/gdi/pantdraw_6cyp.asp
-
Vielen Dank für eure Antworten!
Es git um Folgendes:
Ich habe ein Roboter gebaut, der in einem Array alle entfernungsmessungen gespeichert hat, und diese in der View Klasse auf den Bildschrim darstellt.
Der Roboter wird durch einne Thread in einem Dialog alle 200ms eine Neue Messung auszuführen, die dann in das Array geschrieben wird.
Die Daten werden alle auch richtig Dargestellt, mein einziges Problem ist jetzt nur: Wie kann ich das View Fenster updaten?
Es stehen immer nu die ersten Messdaten drinn...Die Paint Methode kann ich aufrufen, aber das Argument kenne ich nicht..
MeineAnsichtsklasse.paint(void); geht nicht..
beim Link, wo ist den die Select abfrage? ich sehe nur den
case WM_PAINT:...Vielen Dank für eure Antworten!
-
Am besten schickt der Arbeitsthread nach der Messung eine Nachricht an den Darstellungsthread, daß neue Daten anliegen. Der Darstellungsthread ruft dan view.Invalidate() auf und beim nächsten Paint()-Durchlauf wird das view sich neu zeichnen.
-
Zusätzlich solltest Du noch beachten, dass der Zugriff auf das Array< per CriticalSections gesichert werden muss, da sonst inkonsistenzen auftreten können...
-
Vielen Dank für deine Antwort!
so ähnlich hatte ich das auch probiert:
void CbotView::UpdateEcho(int echol, int count){ //Meine Methode in der View CWnd::Invalidate();
das gibt aber einen Fehler:
unhaendled Exception at 0x... User Break PointIch habe aber keine Break points gesetzt...
Greetz ChRiZ
-
Juhhu es funktioniert...
ich habe einfach den Build auf Release gestellt und so klappts...
irgend wer eine Idee wiso das so ist???Vielen Dank und grüsse
Chris