Invalidate und OnDraw



  • Hallo,
    bei mir tritt ein komisches Verhalten der Zeichenfläche auf, wenn ich Objekte zeichnen will. Geometrien sind vorgegeben. Ich öffne einen Dialog und beim schließen durch OnOk sollen die Objekte gezeichnet werden durch die Funktion Invalidate bzw. InvalidateRect. Das hat auch bisher geklappt.

    In diesem Dialog habe ich jetzt eine Funktion zum verschieben der Objekte eingebaut, nur nachdem ich ihn wieder schließen will, werden bei bestimmten Werten z.B. 7000 in y-Richtung die Objekte abgeschnitten und bei anderen Werten in die gleiche Richtung z.B. 5000 nicht.

    Wenn ich scrolle werden sie weiterhin abgeschnitten gezeichnet. Wenn ich aber das Fenster verkleinere oder vergrößere, werden die Objekte plötzlich richtig gezeichnet.

    Hat jemand eine Vorstellung, woran es liegen kann, dass sie einmal korrekt und ein anderes mal nicht korrekt dargestellt werden?

    MapMode ist HIMETRIC.

    void CProgView::OnEditBodies() //Dialogaufruf
    {
    	CSonicwavesDoc* pDoc	= GetDocument();
    	Dialog_Bodies			aDlg;							//Creates a Dialog_Bodies Object
    
    	aDlg.pBody_List			= pDoc->pStorage->GET_BODY_LIST();	//creates Pointer to BodyList of Storage Object
    	aDlg.pStorage			= pDoc->pStorage;						//Gives Adress of Storage Object to Pointer pStorage in aDlg
    
    	aDlg.DoModal();												//Dialog always active until closed
    
    	CRect rect;
    	this->GetWindowRect(rect);
    	InvalidateRect(rect,1);
    }
    
    void Dialog_Bodies::OnOK() //Dialog schließen
    {
    	CDialog::OnOK();
    	int i;
    	for (i = 0; i<pStorage->GET_MAX_BODIES(); i++)
    	{
    		if(pStorage->GET_POINTER_TO_BODY(i)->GET_BODY_ACTIVE() == true)
    		{
    			pStorage->GET_POINTER_TO_BODY(i)->CALC_BODY_POINTS_TO_SYS();
    			pStorage->GET_POINTER_TO_BODY(i)->SET_POINTS_TO_LINES();
    			//pStorage->GET_POINTER_TO_BODY(i)->LINE_CONNECTION_TESTER();
    		}
    	}
    	pStorage->FILL_LINE_LIST_WITH_BODIES();
    
    //Beides versucht, gleiches Ergebnis:
    	//CRect rect;
    	//this->GetActiveWindow()->GetWindowRect(rect);
    	//InvalidateRect(rect,0);
    	Invalidate(0);
    
    }
    

    Danke schonmal für Ideen.
    Besten Gruß
    Kyp



  • PS: Wenn ich die Funktion Invalidate(1) ans Ende der OnEditButton() Funktion setze funktionierts wieder. Trotzdem tritt jetzt bei mir die Frage auf, warum durch die Funktion InvalidateRect(rect,1) mit

    CRect rect;
    rect = this->GetWindowRect(rect);
    

    nicht das komplette Feld neu gezeichnet wurde. Verstehe ich diese Funktion falsch?


Anmelden zum Antworten