wxBufferedPaintDC ist nicht wirklich buffered
-
Hi
Ich habe ein wxBufferedPaintDC auf ein wxScrolledWindow.
Wobei das PaintEvent vom normalen Frame aus ist(keine AHnung ob das eine Bedeutung hat)Jedenfalls, wenn ich einen einfachen Strich zeichne flackert das Bild sehr wohl.
Was muss ich tun, damit es wirklich gebuffert wird?
Danke im Vorraus.
edit:
warum ist V or r au s zensiert?
-
Ankou schrieb:
Hi
Ich habe ein wxBufferedPaintDC auf ein wxScrolledWindow.
Wobei das PaintEvent vom normalen Frame aus ist(keine AHnung ob das eine Bedeutung hat)Jedenfalls, wenn ich einen einfachen Strich zeichne flackert das Bild sehr wohl.
Was muss ich tun, damit es wirklich gebuffert wird?
Danke im v******.
edit:
warum ist V or r au s zensiert?Weils voraus heißt
Für BufferedPaintDC musst du auch den BG STyle auf Custom setzen:
http://wxwidgets.org/manuals/stable/wx_wxbufferedpaintdc.html#wxbufferedpaintdc
-
okay, danke soweit, das flickern hat aufgehört.
Aber meinen Hintergrund bin ich auch los, was muss ich nun tun, damitdas Fenster wieder einen Hintergrund hat?
ALso ich habe schon versucht den Background im EraseEventzu setzen, aber alles was ich damit erreicht hab, ist dass nichtmal mehr das gezeichnet wird, was ich gezeichnet haben wollte.
-
Welcher Hintergrund?
Dachte du zeichnest das in der OnPaint...
-
Ja, tue ich ja auch.
Aber wenn ich den Background Style auf Custom setze hat das Fenster gar keinen Hintergrund mehr, sondern ist zunächst durchsichtig und wird anschließend nicht mehr geupdated(wenn ich es z.B. verschiebe).
Den Hintergrund manuell zeichnen zu wollen hat dann aber auch nicht geklappt, weil dann alles weg war.
-
Zeig mal deinen Code...
-
Okay:
Der Header des FEnsters sieht so aus:#pragma once #include <wx/wx.h> #include <wx/dcbuffer.h> class ImageWindow : public wxFrame { public: ImageWindow(wxWindow* parent, wxWindowID ID, wxString title, wxSize winSizes, wxSize imgSizes, wxPoint winPos = wxDefaultPosition); ImageWindow(wxWindow* parent, wxWindowID ID, wxString title, wxSize winSizes, wxString imgPath, wxPoint winPos = wxDefaultPosition); virtual ~ImageWindow(); void LoadImage(wxString path); void SaveImage(); void SaveImage(wxString* location); //Eventhandler void OnPaint(wxPaintEvent&); void OnBGPaint(wxEraseEvent& e); void LoadMenuClick(wxCommandEvent&); void SaveMenuClick(wxCommandEvent&); void SaveAsMenuClick(wxCommandEvent&); void NewMenuClick(wxCommandEvent&); void CloseMenuClick(wxCommandEvent&); private: void Init(); void SetupMenuBar(); void CreateNewImage(); void CreateNewImage(wxSize imgSize); wxBitmap* Image; wxBitmap graphicBuffer; //Controls wxScrolledWindow* drawingPanel; DECLARE_EVENT_TABLE() };
Und die Implementierung so, ob das auskommentierte auskommentiert oder drin ist, hat keine Wirkung
#include "ImageWindow.h" #include "NewImageDialog.h" #pragma region EventTable BEGIN_EVENT_TABLE(ImageWindow, wxFrame) EVT_MENU(wxID_NEW, ImageWindow::NewMenuClick) EVT_MENU(wxID_OPEN, ImageWindow::LoadMenuClick) EVT_MENU(wxID_SAVE, ImageWindow::SaveMenuClick) EVT_MENU(wxID_SAVEAS, ImageWindow::SaveAsMenuClick) EVT_MENU(wxID_CLOSE, ImageWindow::CloseMenuClick) EVT_PAINT(ImageWindow::OnPaint) //EVT_ERASE_BACKGROUND(ImageWindow::OnBGPaint) END_EVENT_TABLE() #pragma endregion #pragma region ControlProperties //drawingPanel const wxColour dpBGColor(0xeeeeeeul); //fileMenu const wxString fileMenuName = wxT("Datei"); const wxString newNode = wxT("Neu"); const wxString loadNode = wxT("Oeffnen"); const wxString saveNode = wxT("Speichern"); const wxString saveAsNode = wxT("Speichern unter..."); const wxString closeNode = wxT("Schließen"); #pragma endregion ImageWindow::ImageWindow(wxWindow* parent, wxWindowID ID, wxString title, wxSize winSize, wxSize imageSize, wxPoint winPos) : wxFrame(parent, ID, title, winPos, winSize), graphicBuffer(imageSize.GetWidth(), imageSize.GetHeight()) { this->Init(); this->CreateNewImage(imageSize); } ImageWindow::ImageWindow(wxWindow* parent, wxWindowID ID, wxString title, wxSize winSize, wxString imagePath, wxPoint winPos) : wxFrame(parent, ID, title, winPos, winSize) { this->Init(); } void ImageWindow::Init() { this->Image = NULL; this->drawingPanel = new wxScrolledWindow(this); this->drawingPanel->SetBackgroundStyle(wxBG_STYLE_CUSTOM); this->drawingPanel->SetBackgroundColour(dpBGColor); this->SetupMenuBar(); } void ImageWindow::SetupMenuBar() { wxMenuBar* mainMenu = new wxMenuBar(); wxMenu* file = new wxMenu(); file->Append(wxID_NEW, newNode); file->Append(wxID_OPEN, loadNode); file->Append(wxID_SAVE, saveNode); file->Append(wxID_SAVEAS, saveAsNode); file->AppendSeparator(); file->Append(wxID_CLOSE, closeNode); mainMenu->Append(file, fileMenuName); this->SetMenuBar(mainMenu); } ImageWindow::~ImageWindow() { delete Image; Image = NULL; } void ImageWindow::CreateNewImage() { NewImageDialog* nid = new NewImageDialog(this); if(nid->ShowModal() == wxID_OK) { CreateNewImage(nid->getBmpSize()); this->SetTitle(nid->getBmpName()); } } void ImageWindow::CreateNewImage(wxSize imgSize) { this->Image = new wxBitmap(imgSize.GetWidth(), imgSize.GetHeight()); wxMemoryDC imgDC(*Image); imgDC.SetBackground(*wxWHITE_BRUSH); } #pragma region Eventhandler void ImageWindow::OnPaint(wxPaintEvent&) { wxBufferedPaintDC graphics(drawingPanel, graphicBuffer); graphics.DrawBitmap(*Image, 0, 0); graphics.SetPen(*wxRED_PEN); graphics.DrawLine(0, 0, 10, 10); } /*void ImageWindow::OnBGPaint(wxEraseEvent& e) { wxDC* graphics = e.GetDC(); } */ void ImageWindow::NewMenuClick(wxCommandEvent&) { } void ImageWindow::LoadMenuClick(wxCommandEvent&) { } void ImageWindow::SaveMenuClick(wxCommandEvent&) { } void ImageWindow::SaveAsMenuClick(wxCommandEvent&) { } void ImageWindow::CloseMenuClick(wxCommandEvent&) { this->Close(); } #pragma endregion
und so sieht das ganze dann aus(nachdem ich es ein bisschen rumgeschoben hab)
http://imagesload.net/gallery_non.php?image=1203785558_Unbenannt.PNG
-
Du Regestrierst da einen Paintevent, aber implementierst ihn Falsch, oder umgekehrt, je nach Sichtweise.
Dein PaintEvent ist auf den Frame registriert, aber der DC gilt nur für das ScrolledWindow.
Am besten du regestrierst den Paintevent auf das ScrolledWindow mit Connect.phlox
-
ist vielleicht ein anderes Problem, aber
this->drawingPanel->Connect(wxEVT_PAINT, wxPaintEventHandler(ImageWindow::OnPaint));
in Init führt zu einem Laufzeitfehler. bzw. zu einem DebugBreak und einer Accessviolation um genau zu sein
-
Ja, du musst dann noch die Eventsink angeben, in dem du 2 parameter hinzufügst: ,NULL, this);
-
joa, okay, das tuts.
Danke