Rect Neuzeichnen
-
In meinem Programm soll ein kleines Rechteck je nach vorgabe der Koordinaten neu gezeichne werden. Da Zeichnen klapp, aber die alten "Rechteke" bleiben erhlaten. Wie stell ich es an, dass immer nur ein Rechteck da ist, also es immer nur das mit den Aktuellen Koords. da ist?
Bis jetzt zeichne ich das so
void CHidUSBDlg::DrawRect() { CClientDC dc(this); CBrush myBrush; myBrush.CreateSolidBrush(RGB(255,0,0)); dc.FillRect(CRect(x+200,y,x+200+5,y+5), &myBrush); //#1 DeleteDC(dc); }Und das rufe ich in der OnPaint auf. Die Funktion selber wird mittels Thread und schleife alle 50ms neu aufgerufen mit
Invalidate(FALSE)Wenn ich
Invalidate(TRUE)setzte klappt es, aber das Dialogfeld Flackert was zeimlich nervig ist
-
Hast du eine bestimmte Hintergrundfarbe? Dann male erst das alte Rect in Hintergrundfarbe und dann das neue.

Ansonsten schau dir doch mal InvalidateRect an.
-
1. Das verwende InvalidateRect, damitnur der Teil neu gezeichnet wird, der auch gezeichnet werden muss.
2. Mache Dir klar wie Windows zeichnet.
- InvalidateRect erklärt eine Zone für ungültig.
- Irgendwann wird WM_PAINT gesendet.
- Im WM_PAINT Handler wird ein CPaintDC eröffnet, der ein WM_ERASEBKGND auslöst.
- WM_ERASEBKGND löscht den Hintergrund.
- Dann malt WM_PAINT was es soll.Wenn ich also nur solch eine Zeichenrpoutine von Dir sehem weiß ich icht ob Du das richtig mit WM_PAINT verstanden hast!
Grundsätzich sollte nur im WM_PAINT Handler gezeichnet werden.
-
Ich hab keine Hintergrundfarbe. Nacktes Dialogfeld hatl mit ein paar Buttons und Statischen Elementen, die mit Achsenkoordinaten zeigen.
Das mit dem InvalidateRect werd ich mal versuchen.Oh hab wohl vergessen zu erwähnen das die Funktion (DrawRect) mit WM_PAIN (funktion OnPaint) aufgerufen wird. Das zeichnen klappt ja auch alles super. Nur ab einer bestimmten Frequenz / Zeit die man unterschreitet fangen die Fensterinhalte an zu Flakern. Ist ja auch logisch, denn die werden ja auch immer neu gezeichnet. Da ich alle 25 bis 50mSec Zeichnen wollte ist das flakern ziemlich stark.
Um Meinen Ablauf des Programms aufzuzeigen:
1. Funktion aufrufen, die Thread startet
2. Daten Einlesen
3. Daten werden in DrawRect() verarbeitet
4. Thread ruft am ende der While-schleife Invalidate(TRUE) auf (im moment noch).
5. Invalidate(TRUE) ruft OnPaint auf (?) und dort wird dann DrawRect() ausgeführtWenn das mit InvalidateRect nicht klappen sollte, muss ich an meine Aufrufen etwas ändern?
-
Ist das etwa Dein Dialog Hintergrund auf dem Du zeichnest?
Dann ist ein Invalidate natürlich auf den kompleten Bereich tödlich.
Wenn Du ales selbst zeichnest, dann kannst Du auf den WM_ERASEBKGND verzichten.
Das ist auch der Trick den CMemDC verwendet verwendet.Besser ist es das zeichnen in ein eigenes Fenster auszulagern und nicht den Dialog Hintergrund zu verwenden!
-
Auch ein Dialog hat eine bestimmte Farbe.

::GetSysColor(COLOR_3DFACE)