Flackern



  • hi,

    ich zeichne in eine TreeView eine verschiebbare horizontale Linie. Immer wenn ich die verschiebe, flackert es extrem.

    ich habe versucht das ganze mit WM_SETREDRAW zu umgehen, das geht aber nicht:
    (das Gerüst der Funktion habe ich aus nem Proj ausm INet)

    [code]void CPropertyTreeClassView::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
    {
    	// was das ganze hier so recht zu sagen ist ist mir nicht ganz klar
    	// siehe http://www.mimec.org/articles/mctree
    	NMCUSTOMDRAW* pNMCustomDraw = (NMCUSTOMDRAW*)pNMHDR;
    	NMTVCUSTOMDRAW* pNMTVCustomDraw = (NMTVCUSTOMDRAW*)pNMHDR;
    
    	switch (pNMCustomDraw->dwDrawStage)
    	{
    	case CDDS_PREPAINT:
    		*pResult = CDRF_NOTIFYITEMDRAW;
    		break;
    
    	case CDDS_ITEMPREPAINT:
    		*pResult = CDRF_DODEFAULT | CDRF_NOTIFYPOSTPAINT;
    		break;
    
    	case CDDS_ITEMPOSTPAINT:
    		{
    			HTREEITEM hItem = (HTREEITEM)pNMCustomDraw->dwItemSpec;
    			CRect rcItem = pNMCustomDraw->rc;
    
    			if (rcItem.IsRectEmpty())
    			{
    				// nothing to paint
    				*pResult = CDRF_DODEFAULT;
    				break;
    			}
    SendMessage(WM_SETREDRAW, 0);
    			CDC dc;
    			dc.Attach(pNMCustomDraw->hdc);
    
    			// ----------------------------------------------
    			// sooooooo, ab hier beginnt der Zeichenspaß :D
    			// ----------------------------------------------
    
    			// damit die Line genau im Fenster liegt
    			CRect Rect;
    			GetWindowRect(&Rect);
    
    			// Rect ist zur Zeit noch in Bildschirm und nicht in Fensterkoordinaten angegeben
    			Rect.bottom -= Rect.top;
    			Rect.top = 0;
    
    			Rect.left = ColPos-LineWidth;
    			Rect.right = ColPos;
    
    			// Farbe festlegen
    			CBrush Brush(DisplacePos != 1?DisplaceLineColor:LineColor);
    
    			// und zeichnen
    			dc.FillRect(&Rect,&Brush);
    
    			dc.Detach();
    
    			SendMessage(WM_SETREDRAW, 1);
    			RedrawWindow(0, 0, RDW_ERASE |
    							RDW_INVALIDATE |
    							RDW_ALLCHILDREN |
    							RDW_UPDATENOW);
    
    		}
    		*pResult = CDRF_DODEFAULT;
    		break;
    
    	default:
    		*pResult = CDRF_DODEFAULT;
    	}
    }[/code]
    

    das resultiert nämlich nur darin, das die Linie gar nicht (bzw. nur ganz kurz) gezeichnet wird.

    spricht, Meister!! 😉


  • Mod

    Lass bitte den ganzen Quark mit

    SendMessage(WM_SETREDRAW, 0);
    

    und ganz besonders diesen Code weg:

    SendMessage(WM_SETREDRAW, 1);
                RedrawWindow(0, 0, RDW_ERASE |
                                RDW_INVALIDATE |
                                RDW_ALLCHILDREN |
                                RDW_UPDATENOW);
    

    Du bist während des Customdraw in der WM_PAINT Routine. Du kannst Dich darin nicht ein erneutes Zeichnen sofort erzwingen und vor allem nach belieben den Redraw ein und ausschalten.

    Was hast Du Dir den bei diesem Code gedacht?



  • ESS_CB schrieb:

    Immer wenn ich die verschiebe, flackert es extrem.

    vieleicht dieses Flackern wegzubekommen?? 😉



  • Du malst im Moment direkt auf den Screen. Versuche mal in einen MemDC zu malen und am Ende mit BitBlt den Kram auf den Schirm zu bringen.

    Hier ein hint:
    http://www.google.de/search?hl=de&q=Offscreen+Drawing+DC+CreateCompatibleDC&meta=


  • Mod

    Also um so mehr ich mir diesen Code ansehe, umso schlimmer ist er.
    Wieso malst Du eigentlich über das rectangle hinaus, dass Du im custom draw angeboten bekommst?
    Wieso GetWindowRect? GetClientRect wäre korrekt.

    Regel: Das Customdraw gibt Dir die Koordinaten in die Du Zeichnen sollst. Es wäre fatal über diese Bereiche hinaus zu zeichnen.



  • @Martin Richter

    ESS_CB schrieb:

    ich zeichne in eine TreeView eine verschiebbare horizontale Linie.

    meinst du nicht dass das eher bescheiden aussieht, wenn diese Linie nur so groß ist wie die aktuellen Items, ach ja ja ja .... 😡 😡

    ach übrigens, weißer (!!) Herr, das Flickern ist davon auch noch lange nicht weg!



  • Ich werde wahnsinnig, selbst wenn ich das Linienzeichnen komplett weglasse, und nur die Items neuzeichne flackert es noch. Aber bei nem ListControl flackert doch auch nichts, wenn ich die Reiter verschiebe und trotzdm wandert der TExt mit ??!!! 😮 😮


  • Mod

    Dann bleibt die Frage was Du in Deinem Mausmove Code machst. Führst Du dort ein Invalidate auf das ganze Fenster durch? Dann würde es mich nicht wundern, dass es flackert.



  • ok, hat sich.

    thx wenn ich nur die entsprechenden Bereiche invalidate() gehts außreichend gut.


Anmelden zum Antworten