Fensterinhalt löschen



  • ich habe jetzt mal an der stelle, an der der bildschirm gelöscht werden soll folgendes eingefügt:

    InvalidateRect(&rect);
    

    das programm läuft wie bisher. nur der bildschirm wird nicht gelöscht. gibt auch keine fehlermeldung oder so.



  • Hi,

    InvalidateRect läuscht nur den den Teil der von dem angegeben Rect beschrieben wird. Wenn du also ein Rect mit den Werten (0,0,0,0) angibst macht die Funktion garnichts.

    Rufe Invalidate Rect einfach ohne Parameter auf dann wird der ganze Bildschirm bzw. das Fenster gelöscht. Da es komplet als ungültig erklärt wird.

    Mit freundlichem Gruß
    XeXeS



  • Es wird nicht gelöscht, es wird nru für ungültig erklärt. Dadurch wird WM_PAINT ausgelöst, was dann neu zeichnet. Evtk vorher noch das erasebackground, das weis ich jetzt nicht genau.



  • in der sturktur rect stehen schon die richtigen koordinaten drin.

    wenn ich das ganze ohne argumente aufrufen will, erhalte ich die fehlermeldung dass keine 0 argumente akzeptiert werden.



  • Was ist das überhaupt für eine klass edu kanst ja nicht den ganzen Bildschirm löschen. Ist es eine Ansichtsklasse ?



  • HIer mal ein ausschnitt der funktion, mit der ich den bildschirm löschen möchte.....

    void CNetzplanView::Testausgabe(void)
    {
        short XKoord= 0;
    	short YKoord= 0;
    	short ID= 0;
    	this->GetClientRect(&rect);
    	this->InvalidateRect(&rect);
    	CPoint point;
    	help=  1;
    .....
    

    und hierml der Code für die Funktion mit der ich z.B. die Vierecke zeichnen lasse:

    void CNetzplanView::DrawPoints(CPoint point,int art)
    {
    	CClientDC dc(this);
    	if(art == 0)
    	{	
    		CRect re(point.x-7,point.y-7,point.x+7,point.y+7);
    		dc.FillSolidRect(re,RGB(0,0,0));
    	}
    	else if(art == 1)
    	{	
    		dc.Rectangle(point.x-5,point.y-5,point.x+5,point.y+5);
    	}
    	else if(art == 2)
    	{	
    		dc.Ellipse(point.x-5,point.y-5,point.x+5,point.y+5);
    	}
    	else if(art == 3)
    	{	
    		dc.Ellipse(point.x-6,point.y-6,point.x+6,point.y+6);
    	}
    }
    

    bin da noch total er anfänger...ich hoffe, das hilft weiter



  • ich verstehs nicht. als kontrolle habe ich vor mein löschen des fensterinhaltes mal noch ein paar zeilen code eingefügt, um eine kurze linie zu zeichnen, als kontrolle.

    CPen *oldpen;
    	CClientDC dc(this);
    	CPen NeuPen(PS_SOLID,3,RGB(255,128,64));
        oldpen= dc.SelectObject(&NeuPen);
        dc.MoveTo(400,400);
        dc.LineTo(450,440);
        dc.SelectObject(oldpen);
    	this->GetClientRect(&rect);
    	this->InvalidateRect(&rect);
    

    das funktioniert auch prima. die linie wird wie gewünscht gezeichnet. auch alles was nach this->InvalidateRect(&rect); kommt wird ausgeführt, nur wir der bildschirm irgendwie nicht gelöscht...



  • Die DrawPoints() lässt Du aber nicht in OnPaint() aufrufen?



  • Es ist eigentlich ganz einfach:
    Der Bildschirm (genauer gesagt der Fensterinhalt) wird gelöscht wenn:
    - du InvalidateRect(NULL) aufrufst
    - du *nichts* in OnPaint (bzw. in WM_PAINT) machst!



  • wie weiter oben schon geschrieben: Invalidate erklärt einen Fensterbereich nur für ungültig. Dadurch werdeb Nachrichten ausgelöst. U.a. die eraseBackground. Diese füllt das Fenster mit der Standardhintergrundfarbe. Danach wird dann die OnPaint aufgerufen.



  • Genau. Und somit ist das Fenster "gelöscht", wenn in WM_PAINT nichts gemacht wird...


Anmelden zum Antworten