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.
-
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?
-
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...
-
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?
-
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; }