bitmap variabler größe in wxScrolledWindow



  • hallo zusammen!

    ich habe ein signal mit z.b. 30000 werten, die ich auf einem waagerechten wxScrolledWindow mit nur waagerechter scrollrichtung darstellen möchte. dabei habe ich mich an diesem beispiel orientiert: http://wiki.wxwidgets.org/Scrolling#Scrolling_a_render_.2F_an_image. mit dem mausrad soll man ranzoomen können:

    void MyScrolledWindow::onMouseWheel(wxMouseEvent &event) {
    	int newWid = getBitmapSignal()->GetWidth() * 1.05;
    	wxBitmap *newBitmap = new wxBitmap(newWid, getBitmapSignal()->GetHeight());
    	wxMemoryDC mdc(*newBitmap);
    	paintSignal(mdc);
    	mdc.SelectObject(wxNullBitmap);
    
    	setBitmapSignal(newBitmap);
    
    	SetScrollbars(1, 0, getBitmapSignal()->GetWidth(), 0);
    	Refresh();
    }
    

    das funktioniert soweit auch super, das bild wird beim vorwärtsscrollen immer breiter und ein immer kleinerer teil des signals wird korrekt dargestellt. das problem besteht jetzt beim scrollen:

    void MyScrolledWindow::OnDraw(wxDC &dc){
    	int x, y;
    	GetViewStart(&x, &y);
    
    	wxMemoryDC mdc(*getBitmapSignal());
    	dc.Blit(0, 0, dc.GetSize().x, dc.GetSize().y, &mdc, x, 0);
    	mdc.SelectObject(wxNullBitmap);
    }
    

    das korrekt vorhandene bild wird beim scrollen nicht weiter gezeichnet. man sieht nur den teil sich korrekt bewegen, der beim ranzoomen erzeugt wurde. beim scrollen nach rechts wird der pixel am rechten rand immer weiter dupliziert.
    wenn ich Refresh aufrufe bekomme ich eine schleife in OnDraw.

    was kann ich machen?



  • hier zur veranschaulichung ein bild vom problem beim scrollen nach rechts. es sollte eigentlich komplett eine sich wiederholende sinuskurve sein:
    http://gemini-sites.de/scrollProblem.jpg



  • das problem ist gelöst.
    es lag daran: "You have the option of handling the OnPaint handler or overriding the wxScrolled::OnDraw() function, which is passed a pre-scrolled device context (prepared by wxScrolled::DoPrepareDC())."
    ich habe also auf eine wxDC VOR dem scrollen gezeichnet, die dann durch das scrollen sofort verschoben wurde. dasselbe problem tritt auf, wenn man im paintEvent zeichnet und vorher DoPrepareDC aufruft, auch dann hat man die wxDC VOR dem scrollen.
    jetzt klappt allen beim zeichnen im paintEvent ohne DoPrepareDC.


Anmelden zum Antworten