wxWidgets OnPaint methode zeichnet das Bild nicht nach

z.B. wxWidgets, GTK+, Qt, OpenGL, DirectX
Antworten
Brutus
Beiträge: 4
Registriert: Do Dez 16, 2010 2:54 pm

wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Brutus » Do Dez 16, 2010 3:07 pm

Hallo,
ich zeichne mit dem wxWindowDC eine Bitmap auf ein Frame, soweit funktioniert auch alles wunderbar. Wenn ich das Fenster allerdings aus dem Computer-Screen bewege und wieder zurück, so sind die Bereiche weiß, dh. die bitmap wird nicht nachgezeichnet. Ich habe gehört, dass das Fenster ein wxPaintEvent schmeißt sobald Bereiche außerhalb des Screen kommen. So habe ich die folgende OnPaint Methode geschrieben:

Code: Alles auswählen

void ImageDisplayImageFrame::OnPaint( wxPaintEvent& event )
{
	wxPaintDC pdc(this);
	pdc.DrawBitmap(m_Bitmap,3,25,true);
}
allerdings verändert sich nichts... das Bild bleibt an den Bereichen die außerhalb des Screens waren weiß.
Was mamche ich falsch und was muss ich ändern?

Gruss Brutus

Edit by Xin: Code-Tags hinzugefügt

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8492
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Xin » Do Dez 16, 2010 3:15 pm

Moin Brutus und willkommen an Board. :-)

Ich bin kein wxWidgets-Spezialist, aber die erste Frage, die ich an Dich habe ist, ob er die Methode überhaupt erreicht, also die Nachricht bekommt.
Schonmal eine MessageBox reingepackt?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Brutus
Beiträge: 4
Registriert: Do Dez 16, 2010 2:54 pm

Re: wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Brutus » Do Dez 16, 2010 3:21 pm

Hi,
vielen Dank für die schnelle Antwort...
hm, ne die Methode wird wohl gar nicht ausgefürht, jedenfalls kommt keine Messagebox..
Das kreist den Fehlerbereich natürlich ein, aber trotzdem weiß ich nicht, wieso dieser eventhandler nicht geschmissen wird...??

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8492
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Xin » Do Dez 16, 2010 3:36 pm

Brutus hat geschrieben:Hi,
vielen Dank für die schnelle Antwort...
Schnelle Antwort ist kein Problem, die Frage ist ja eher, ob's Dich weiterbringt ;-)
Brutus hat geschrieben:hm, ne die Methode wird wohl gar nicht ausgefürht, jedenfalls kommt keine Messagebox..
Das kreist den Fehlerbereich natürlich ein, aber trotzdem weiß ich nicht, wieso dieser eventhandler nicht geschmissen wird...??
Du weißt aber schonmal, warum sich nichts verändert. Damit ist Deine Frage beantwortet und der Thread erfolgreich abgeschlossen. :lol:


So, Ernst beiseite... Wie gesagt, ich bin kein wxWidgets-Spezialist, aber kann es sein, dass Du ein Event wie OnPaint erst bei wxWidgets anmelden musst, also im Konstruktor erst anmelden musst? (Connect?)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Brutus
Beiträge: 4
Registriert: Do Dez 16, 2010 2:54 pm

Re: wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Brutus » Do Dez 16, 2010 3:45 pm

Ich weiß nicht so genau ob man das anmelden muss. Das Fenster habe ich mit dem wxFormbuilder erstellt und dort kann man die events, unter anderem auch OnPaint, wählen und benennen. Das habe ich ich gemacht und der hat mir die Methode schon automatisch angelegt und ich habe nur noch den Inhalt geschrieben... Also denke ich, selbst wenn man es anmelden muss , dann sollte es der Formbuilder schon gemacht haben.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8492
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Xin » Do Dez 16, 2010 3:52 pm

Brutus hat geschrieben:Ich weiß nicht so genau ob man das anmelden muss. Das Fenster habe ich mit dem wxFormbuilder erstellt und dort kann man die events, unter anderem auch OnPaint, wählen und benennen. Das habe ich ich gemacht und der hat mir die Methode schon automatisch angelegt und ich habe nur noch den Inhalt geschrieben... Also denke ich, selbst wenn man es anmelden muss , dann sollte es der Formbuilder schon gemacht haben.
Wenn der Formbilder das gemacht hat, dann funktioniert die MessageBox vermutlich und Du hast sie nur versehentlich weggeklickt. ;-)

Du musst die Funktion benennen und bekommst OnPaint nicht vorgeschrieben? Dann muss sie auch angemeldet werden.
Ob sie angemeldet ist, sehe ich aus dem Stückchen Quellcode nicht.

Wenn Du einen Fehler suchst, geh davon aus, dass etwas nicht funktioniert. Davon auszugehen, dass etwas funktioniert erklärt den Fehler nämlich nicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Brutus
Beiträge: 4
Registriert: Do Dez 16, 2010 2:54 pm

Re: wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Brutus » Do Dez 16, 2010 4:05 pm

Also, hier sind meine Quellcodes:
abgeleiteter header:

Code: Alles auswählen

#ifndef __ImageDisplayImageFrame__
#define __ImageDisplayImageFrame__

/**
@file
Subclass of ImageFrame, which is generated by wxFormBuilder.
*/

#include "ImageDisplay.h"
#include <wx/bitmap.h>

/** Implementing ImageFrame */
class ImageDisplayImageFrame : public ImageFrame
{
protected:
	// Handlers for ImageFrame events.
	
	
	void OnPaint( wxPaintEvent& event );
	
public:
	/** Constructor */
	ImageDisplayImageFrame( wxWindow* parent );
	void setBitmap(wxBitmap Bitamp){m_Bitmap = Bitamp;};
	wxBitmap m_Bitmap;
	

private:
};

#endif // __ImageDisplayImageFrame__
header:

Code: Alles auswählen

///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 16 2008)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////

#ifndef __ImageDisplay__
#define __ImageDisplay__

#include <wx/string.h>
#include <wx/frame.h>
#include <wx/gdicmn.h>
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>

///////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
/// Class ImageFrame
///////////////////////////////////////////////////////////////////////////////
class ImageFrame : public wxFrame 
{
	private:
	
	protected:
		// Virtual event handlers, overide them in your derived class
		virtual void OnPaint( wxPaintEvent& event ){ event.Skip(); }
		
	
	public:
		ImageFrame( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxT("Image"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 800,800 ), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL );
		~ImageFrame();
	
};

#endif //__ImageDisplay__

cpp:

Code: Alles auswählen

///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version Apr 16 2008)
// http://www.wxformbuilder.org/
//
// PLEASE DO "NOT" EDIT THIS FILE!
///////////////////////////////////////////////////////////////////////////

#include "ImageDisplay.h"

///////////////////////////////////////////////////////////////////////////

ImageFrame::ImageFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style )
{
	this->SetSizeHints( wxDefaultSize, wxDefaultSize );
	
	
	// Connect Events
	this->Connect( wxEVT_PAINT, wxPaintEventHandler( ImageFrame::OnPaint ) );
}

ImageFrame::~ImageFrame()
{
	// Disconnect Events
	this->Disconnect( wxEVT_PAINT, wxPaintEventHandler( ImageFrame::OnPaint ) );
}
abgeleitete cpp:

Code: Alles auswählen

#include "ImageDisplayImageFrame.h"
#include "wx/dcclient.h"
#include <wx/msgdlg.h>


ImageDisplayImageFrame::ImageDisplayImageFrame( wxWindow* parent )
:
ImageFrame( parent )
{

}

void ImageDisplayImageFrame::OnPaint( wxPaintEvent& event )
{

	wxPaintDC pdc(this);
	PrepareDC(pdc);
	pdc.DrawBitmap(m_Bitmap,3,25,true);
	wxMessageBox(wxT("event kommt"));
	
}
Falls mir jemand sagen kann wie bzw. ob ich die onPaint noch anmelden muss wäre das sehr hilfreich..

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8492
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: wxWidgets OnPaint methode zeichnet das Bild nicht nach

Beitrag von Xin » Do Dez 16, 2010 5:16 pm

Zwei Dinge:
1.) Bitte als Projekt in einer ZIP. Niemand hat Lust, sich daraus erst ein Projekt zusammen zu basteln, insbesondere, wo Du diese Arbeit ja schon getan hast nur den Teil halt mitschickst.
2.) Mooooment. ;-) Ich für meinen Teil muss erstmal nach Hause kommen, um das Testen zu können. Das wird leider noch ein paar Stündchen dauern. Vielleicht kann Dir da auch jemand anderer helfen, der sich sicherlich ähnlich freut, wenn er ein kompilierbares Projekt hat. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten