Refresh Problem mit wxPanel
-
Hallo!
Ich habe folgendes Problem: Ich bin dabei zu lernen, wie ich Bilder (png) mittels wxImage und wxBitmap darstellen kann. Dazu hab ich mir dieses Code Beispiel vorgenommen: http://wiki.wxwidgets.org/An_image_panel. Das ganze ist nun ain bisschen abgewandelt und das Bild wird in einem separaten Frame dargestellt, der von einem Dialog aufgerufen wird. Das ganze funktioniert ganz gut, das Bild wird dargestellt. Nur zeichnet Refresh() in der manImage() Funktion den Frame nicht neu. Erst nachdem die Größe geändert wird, wird das Bild richtig (in diesem Fall um 90° gedreht) dargestellt.
void wxImagePanel::paintEvent(wxPaintEvent & evt) { // depending on your system you may need to look at double-buffered dcs wxPaintDC dc(this); render(dc); } void wxImagePanel::paintNow() { // depending on your system you may need to look at double-buffered dcs wxClientDC dc(this); render(dc); } void wxImagePanel::render(wxDC& dc) { int neww, newh; dc.GetSize( &neww, &newh ); if( neww != w || newh != h ) { resized = wxBitmap( image.Scale( neww, newh /*, wxIMAGE_QUALITY_HIGH*/ ) ); w = neww; h = newh; dc.DrawBitmap( resized, 0, 0, true ); } else { dc.DrawBitmap( resized, 0, 0, true ); } } void wxImagePanel::OnSize(wxSizeEvent& event) { Refresh(); //<- funktioniert //skip the event. event.Skip(); } void wxImagePanel::manImage() { image=image.Rotate90(); paintNow(); Refresh(); //<- funktioniert nicht }
Ich bin bald am verzweifeln
, das kann doch nicht so problematisch sein. Wäre echt nett, wenn mir jemand sagen kann, was ich falsch mache.
Grüße caaso
-
Ok Problem gelöst. Falls es jemanden interessiert hier der Code der funzut:
void wxImagePanel::paintEvent(wxPaintEvent & evt) { // depending on your system you may need to look at double-buffered dcs wxBufferedPaintDC dc(this); render(dc); } void wxImagePanel::paintNow() { // depending on your system you may need to look at double-buffered dcs wxClientDC dc(this); render(dc); } void wxImagePanel::render(wxDC& dc) { PrepareDC(dc); //PaintBackground(dc); int neww, newh; this->GetSize( &neww, &newh ); resized = wxBitmap( image.Scale( neww, newh /*, wxIMAGE_QUALITY_HIGH*/ ) ); dc.DrawBitmap( resized, 0, 0, true ); } void wxImagePanel::OnSize(wxSizeEvent& event) { Refresh(); //skip the event. event.Skip(); } void wxImagePanel::button1() { image=image.Rotate90(); paintNow(); Refresh(); } void wxImagePanel::PaintBackground(wxDC& dc) { wxColour backgroundColour = GetBackgroundColour(); if (!backgroundColour.Ok()) backgroundColour = wxSystemSettings::GetColour(wxSYS_COLOUR_3DFACE); dc.SetBrush(wxBrush(backgroundColour)); dc.SetPen(wxPen(backgroundColour, 1)); wxRect windowRect(wxPoint(0, 0), GetClientSize()); dc.DrawRectangle(windowRect); } // Empty implementation, to prevent flicker void wxImagePanel::OnEraseBackground(wxEraseEvent& event) { }
gruz caaso