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?