WM_PAINT und WM_TIMER



  • Moinsen,

    ich versteh mal wieder etwas nicht:

    Fillrect() und drawpoints() zeichnen ein paar Sachen in einen Backbuffer (HDC), mache ich ein BitBlt() im WM_TIMER geht alles gut.

    Jetzt habe ich gelernt man soll IMMER im WM_PAINT-Zweig zeichnen. Gut, habe ich gedacht, stell ich das halt um, nach verschiedenen Anläufen bekomme ich es aber dann doch nicht hin.

    Im folgenden Code habe ich jetzt in beiden Zweigen BitBlt() drin, ich mach es natürlich nur in WM_PAINT oder WM_TIMER nicht in beiden. Gleiches gilt für FillRect() - apropos: kann ich für FillRect nicht einfach ein InvalidateRect() aufrufen und WM_PAINT zeichnet dann den Hintergrund neu (wenn es denn mal funktioniert)? 😕

    Jemand Vorschläge?

    case WM_TIMER:
    	KillTimer(hWnd, timer_id);	// erstmal anhalten
    	xmin = ifs_st->xmin;		// maximale Ausdehnung holen
    	xmax = ifs_st->xmax;
    	ymin = ifs_st->ymin;
    	ymax = ifs_st->ymax;
    
    	// Alles was zuvor gezeichnet wurde löschen
    	if (xmin <= xmax && ymin <= ymax) {
    		rect.left	= xmin;		rect.top	= ymin;
    		rect.right	= xmax+1;	rect.bottom	= ymax+1;
    		//auch das wird gezeichnet
    		FillRect(myBackBuffer, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));
    		ifs_st->xmin = ifs_st->width	+  1;
    		ifs_st->xmax = ifs_st->ymax		= -1;
    		ifs_st->ymin = ifs_st->height	+  1;
    	}
    	// (... do some iterations, mutations etc. ...)
    	if (ifs_st->npoints) {
    		drawpoints(ifs_st);		// Zeichne Punkte in myBackBuffer, läuft!
    	}
    	// myBackBuffer wird samt Inhalt auf den Bildschirm gezeichnet
    	BitBlt (myDevCon, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1, myBackBuffer, xmin, ymin, SRCCOPY);
    
    	SetTimer(hWnd, timer_id, idelay, NULL);
    	break;
    
    case WM_PAINT:
    	myDevCon = BeginPaint(ifs_st->window, &ps);
    
    	//Nix, denada, schwarz rrrrrhhhh!
    	BitBlt (myDevCon, xmin, ymin, xmax - xmin + 1, ymax - ymin + 1, myBackBuffer, xmin, ymin, SRCCOPY);
    	EndPaint(ifs_st->window, &ps);
    	break;
    


  • Wenn du deinen Back-Buffer in WM_TIMER verändern willst, sollte dieser auf jeden Fall erstmal static sein, damit er bei WM_PAINT auch nocht gültig ist. FillRect ersetzt kein InvalidateRect bzw. umgekehrt, denn wenn du deinen ganzen Back-Buffer mit BitBlt nachher auf den Fenster kopierst hat das, was Windows ggf. vorher machen würde eh keine Auswirkung. Also in WM_TIMER bzw. einmal nach dem Anlegen des Back-Buffers falls du nicht immer alles neu zeichnest ein FillRect, damit dieser einheitlich mit der entsprechenden Farbe gefüllt ist. Und dann in WM_TIMER nachdem du alles hineingezeichnet hast ein InvalidateRect, damit dein Fenster weiß, dass es sich mal wieder aktualisieren sollte (ggf. anschließend noch ein UpdateWindow. Und in WM_PAINT dann einfach dein BitBlt 🙂



  • Im WM_PAINT-Zweig ist xmin etc. nicht definiert (wie du es bei WM_TIMER gemacht hast) ?


Anmelden zum Antworten