Visual c++:OnDraw



  • Hi leuts,
    habe hier ein problem, ich möchte daten über die serielle schnittstelle einlesen und als diagramm darstellen. ich habe in der klasse OnDraw die zeichenfunktion implementiert und das funktioniert auch nur wird das fenster permanent neugezeichnet. beim debuggen habe ich gesehen das mein programm immer in der Ondraw seine runden dreht. ich muss ONInitialUpdate() aufrufen, damit sich meine ScrollBar an die Zeichnung anpasst. wie könnte ich das lösen.

    void CProtoLyzerView::OnDraw(CDC* pDC)
    {
    
    	CProtoLyzerDoc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	DatenArray DArray;
    	// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen
    
    	int ZeichenIndex = pDoc->m_pointIndex;
    
    	if(ZeichenIndex > 0)
    	{
    	pDC->MoveTo(10,100);
    
    	CPoint Vertikal;
    	CPoint Horizontal;
    	CPoint Start;
    	m_Endwert = 0;
    
    	Horizontal.x = 10;
    	Vertikal.x= 10;
    	Horizontal.y = 100;
    	Vertikal.y = 100;
    
    	int Array[200];
    	for (int j = 0; j<100;j++)
    	{
    		Array[j] =1;
    
    	}
    
    	DArray.Umrechnen(Array);
    
    		for (int i= 0;i<100;i++)
    		{
    			Horizontal.x = Horizontal.x + DArray.HilfsArray[i];
    			Horizontal.y = Vertikal.y ;
    			pDC->LineTo(Horizontal);
    			Vertikal.x = Horizontal.x;
    			Vertikal.y = Horizontal.y -40;
    			pDC->LineTo(Vertikal);
    			i++;
    
    			Horizontal.x = Horizontal.x + DArray.HilfsArray[i];
    			Horizontal.y = Vertikal.y;
    			pDC->LineTo(Horizontal);
    			Vertikal.x = Horizontal.x;
    			Vertikal.y = Horizontal.y + 40;
    			m_Endwert = Horizontal.x;
    			pDC->LineTo(Vertikal);
    
    		}
    
    	}
    
    	ZeichenIndex = 0;
    	OnInitialUpdate();
    	//WaitMessage();
    }
    
    void CProtoLyzerView::OnInitialUpdate()
    {	//UpdateData(TRUE);
    
    	CScrollView::OnInitialUpdate();
    	CSize sizeTotal;
    	// ZU ERLEDIGEN: Gesamte Größe dieser Ansicht berechnen
    
    	sizeTotal.cx = 20 + m_Endwert;
    	sizeTotal.cy = 100;
    	SetScrollSizes(MM_TEXT, sizeTotal);
    
    }
    

    danke euch im voraus



  • OnInitialUpdate() sollte nur für die erste Initialisierung verwendet werden - das ruft letzlich wieder deine OnDraw()-Funktion auf. (wenn du lange genug wartest, sprengst du dir damit vermutlich den Stack ;)).

    Am besten ist es wohl, wenn du die Neuberechnung des Scrollbalkens in eine neue Funktion auslagerst, die dann sowohl von OnInitialUpdate() als auch von OnDraw() aus aufgerufen werden kann.



  • Habe es mit SetScrollRange(Probiert aber geht irgendwie nicht.
    es tut sich überhaupt nichts.

    Horizontal.x = Horizontal.x + DArray.HilfsArray[i];
    			Horizontal.y = Vertikal.y;
    			pDC->LineTo(Horizontal);
    			Vertikal.x = Horizontal.x;
    			Vertikal.y = Horizontal.y + 40;
    			m_Endwert = Horizontal.x;
    			pDC->LineTo(Vertikal);
    
    		}
    
    	}
    	SetScrollRange(0,0,m_Endwert,TRUE);
    	ZeichenIndex = 0;
    	//OnInitialUpdate();
    	//WaitMessage();
    }
    

    aber vielleicht habe ich das an der falschen stelle aufgerufen.



  • Wieso rufst du eigentlich nicht direkt SetScrollSizes() aus der OnDraw auf?

    (btw würde ich die Berechnung der Endpunkte nicht bei jedem OnDraw-Aufruf neu erledigen)

    PS: Und gewöhn dir bitte an, deine Quelltexte in cpp-Tags einzuschließen 😉


Anmelden zum Antworten