Probleme mit wxPaint
-
Hallo,
ich brauche eure Hilfe bezüglich wxPaint. Die Funktion, die ich zur Zeit einsetze, sieht so aus:void MyFrame::OnPaint(wxPaintEvent& event){ int breite = GetClientSize().GetWidth(); int hoehe = GetClientSize().GetHeight(); int radius = (hoehe < breite)?hoehe/2-10:hoehe/2-10; wxPoint zentrum(breite/2, hoehe/2); wxPaintDC dc(this); wxPen pen; wxBrush brush; pen.SetColour(wxColour(0x00, 0x00, 0x00)); brush.SetColour(wxColour(0x00, 0x00, 0x00)); dc.SetPen(pen); dc.SetBrush(brush); dc.DrawRectangle(0, 0, breite, hoehe); pen.SetColour(wxColour(0xFF, 0xFF, 0xFF)); pen.SetWidth(3); dc.SetPen(pen); dc.DrawArc(wxPoint(zentrum.x, zentrum.y-radius), wxPoint(zentrum.x, zentrum.y+radius), zentrum); }
Wie man sieht, soll ein Halbkreis mit weißem Rad auf schwarzem Grund gemalt werden. Dazu hab ich gleich eine Frage: Gibt es eine elegantere Methode den Hintergrund schwarz anzumalen als über ein Rechteck?
Nun zum Problem: Wenn das Programm startet, wird alles so wie gewünscht gezeichnet, skaliert man jedoch das Fenster kommt es zu Überlagerungen (Bild), als würde die Zeichnung nicht bei jedem Aufruf von OnPaint() neu gezeichnet. Weiß jemand Rat?
Danke, Sven
-
Da müsstest du evtl. den Sizeevent überladen, und da dann Refresh() aufrufen.
Auch würde ich dir einen wxAutoBufferedPaintDC empfehlen.Und was den Hintergrund angeht:
http://docs.wxwidgets.org/stable/wx_wxdc.html#wxdcsetbackground
-
phlox81 schrieb:
Da müsstest du evtl. den Sizeevent überladen, und da dann Refresh() aufrufen.
Danke, das hat mein Problem behoben. Steht auch so in der Doku, allerdings unter wxSizeEvent
phlox81 schrieb:
Auch würde ich dir einen wxAutoBufferedPaintDC empfehlen.
Irgendwie hab ich die Klasse nicht => nichtdeklarierter Bezeichner.
phlox81 schrieb:
Und was den Hintergrund angeht:
http://docs.wxwidgets.org/stable/wx_wxdc.html#wxdcsetbackgroundDas klappt bei mir irgendwie nicht, der Hintergrund bleibt grau, gut der Halbkreis ist schwarz gefüllt, aber ich will auch außen drum einen schwarzen Grund haben.
-
Er meint http://docs.wxwidgets.org/stable/wx_wxbufferedpaintdc.html#wxbufferedpaintdc
Und um den Hintergrund mit der Hintergrundfarbe anzumalen: http://docs.wxwidgets.org/stable/wx_wxdc.html#wxdcclear
-
http://docs.wxwidgets.org/stable/wx_wxautobufferedpaintdc.html#wxautobufferedpaintdc
Du musst wohl als erstes dc.Clear() da aufrufen.
Für den Background gibts dann wohl nix besseres als dc.Clear. Evtl. FloodFill, wobei das langsamer sein dürfte
-
Danke, das Clear() hat geholfen!
-
frenki schrieb:
Er meint http://docs.wxwidgets.org/stable/wx_wxbufferedpaintdc.html#wxbufferedpaintdc
Nein, ich meine explizit wxAutoBufferedPaintDC.
Dieser unterscheidet, ob eine Plattform einen wxBufferedPaintDC hat oder nicht.
Ist also um einiges portabler.
-
Oh, den kannte ich noch gar nix. Wieder was gelernt