Grafik (DC) mit Scrollbalken verändertn/verschieben??



  • hallo ihr..

    ich hab eine GRafik Klasse prgrammiert, welche eine Zeitliche darstellung eineer Processes darstellt!!

    Y achse Process Module

    X zeitliche dauer der PRozesse!

    ich kann über funktionen die Zeitspanne angenen , so das nur ein teil der gesamten zeit gemalt wird, und mit der funktion update zeichtnet der den DC via bitblt neu!!

    nun möchte ich die grafik dynamisch verschieben via einen horzontalen scrollbalken, ohne das die grafik flattert... hat jemand ne idee??

    und das ganze soll in nem modalen Dialog statt finden!!



  • Vom Prinzip könntest du dir ja die Daten des Scroll-balkens hohlen und diese dann als X-Wert für BitBtl() angeben. Damit sollte die Grafik dann zu dem Punkt wandern, wo sie hin soll.


  • Mod

    CMemDC verwenden.

    Oder wenn Du sowieso keinen Hintergrund benötigst einfach auf WM_ERASEBKGND TRUE returnieren!



  • es soll doch möglichkeiten geben, das ich ein bestimmten bereich eines DCs verschieben kann um flattern zu vermeiden oder?


  • Mod

    Suchst Du ScrollWindow?



  • sowas in der art denk ich...

    das problem ist ja wenn ich den scrollbalken bewege wird ja paar mal pro sekunde die grafik neu gezeichnet...


  • Mod

    Das ist nicht ganz korrekt!
    Wie machst Du es denn? Normalerweise wird ein ScrollWindow ausgeführt, das simpel undeinfach den aktuellen DC kopiert. Dann erfolgt ein Invalidate was irgendwann einen OnPaint auslöst.
    Wen also vorher wieder ein Scrollbefehl eingeht, wird auch nichts gezeichnet...

    Wenn Du natürlich im Scroll Handler zeichnest ist das "falsch"!



  • ok Martin.. ich hab bisher ja nur meine CGraphics Klasse, mit der ich die grafik folgender massen zeichen:

    CRect rc;
    pFrame->m_wndView.GetWindowRect(&rc);
    
    //Konstrutor rc -> dimenssionen der grafik (in dem fall Bildschirmausfüllend)	
    CMyVisDiagramm oVisPro(dc,CPoint(10,10),rc.right-rc.left-20,rc.bottom-rc.top);
    
    //Daten inhalt der Grafik
    oVisPro.getData(&oWF);
    
    /// Zeitbereich Start und end punkt (in millisekunden)
    oVisPro.setCurrentTime(0);
    oVisPro.setInterval(60000*12);
    
    //Zeichnen
    oVisPro.update();
    

    wenn ich nun den scrollbar verschiebe änder sicht der Zeitbereich , also seCurrentTime und setInterval)
    und dann muss ich mit upsate neu zeichen!!
    so hab ich mir das vorgestell...
    was meinst du?


  • Mod

    Und wo befindet sich dieser Code?



  • bisher noch niergens..

    ich hab jetzt ein dilaog gemacht und folgendes in "OnInitDlg(..)" geschrieben:

    BOOL CDlgWorkflow::OnInitDialog(){
    
    	//Dialoggröße ermitteln
    	this->GetWindowRect(&m_Dialog_Rect);
    
    	//Workflow Grafik Objekt erstellen
    	m_Graphic = new CMyVisDiagramm(	this->GetWindowDC(),
    									CPoint(10,10),
    									m_Dialog_Rect.right-m_Dialog_Rect.left-20,
    									m_Dialog_Rect.bottom-m_Dialog_Rect.top);
    
    	m_Graphic->getData(m_Workflow);
    
    	//oVisPro.getData(&buf);
    //	oVisPro.getData(&oProfile);
    	/// Zeitbereich
    
    	m_Graphic->setCurrentTime(60000* 5.2);
    	m_Graphic->setInterval(60000*5);
    	m_Graphic->update();
    
    	return true;
    }
    

    aber er zeichnet nix .. muss ich das update in ner anderen funktion aufrufen...wenn er die oberfläche aktualisiert?? "OnPaint" oder so?

    P.S.: hier due update funktion: (bitblt müsste er den oDC auf den Dialog DC werfen) !!!

    BOOL CMyVisDiagramm::update(){
    
    	// Wenn Interval Zeit und Startzeit ungeültig
    	if(lTimeInterval==0 || lTimeInterval<0 || lCurrentTime<0 || !boData || !(lTimeInterval/60000))
    		return false;	
    
    	// Zeichnefläche Reinigen
    	oDC.FillSolidRect(drawRect,RGB(255,255,255));
    
    	// Skala zeichnen
    	drawScaleY();
    	drawScaleX();
    
    	// Prozess zeichnen
    	drawProzess();
    	pDC->BitBlt(oPT.x,oPT.y,BmpParam.bmWidth,BmpParam.bmHeight,&oDC,0,0,SRCCOPY);
    
    	return true;
    
    }
    

Anmelden zum Antworten