Canvas::CopyRect TPaintBox
-
Hallo Leute
Ich will eine Grafik regelmäßg visualisieren.
Da sich hinundwieder mal kleine Änderungen ergeben und ich nicht immer alles komplett neuzeichnen will, hab ich mir überlegt, in einer Klasse im Hintergrund eine TPaintBox zu halten, an der kleinere grafische Änderungen vorgenommen werden.Einen Ausschnitt aus dieser Paintbox will ich dann mittels Canvas::CopyRect in meine Visualisierungs-Paintbox kopieren.
Zunächst hatte ich der unsichtbaren Paintbox in meiner Klasse keinen Parent zugewiesen, was bei der ersten Zeichenoperation zu einer Exception geführt hat...
Daraufhin habe ich mein Formular als Owner verwendet. Das hat zwar die Exception beseitigt, der tatsächliche Inhalt der HintergrundPaintbox sieht aber fürchterlich aus. Vom gezeichneten Inhalt ist garnix enthalten, dafür sieht man einiges vom Formular... Man könnte auch sagen, dass das Design des Formulars in meiner Hintergrundpaintbox ( die eigentlich selbst nicht sichtbar sein sollte ) gelandet ist.
Da scheint es irgendwelche Pointer-querelen zu geben
// Konstruktor Ccandledevice::Ccandledevice( int rightspace_, int w, int h, TComponent* AOwner ) { // ... Initialisiere Parameter // erzeuge Paintbox Device = new TPaintBox( AOwner ); Height = h; Device->Width = w; Device->Height = h; Device->Parent = dynamic_cast<TForm*> ( AOwner ); } // Destruktor Ccandledevice::~Ccandledevice() { delete Device; } // Kopieren den Inhalt in eine Ziel-Paintbox void Ccandledevice::FillCanvas( TPaintBox *Dest ) { TRect r; r.Left = 0; r.Top = 0; r.Right = r.Left + Dest->ClientRect.Right; r.Bottom = r.Top + Dest->ClientRect.Bottom; Dest->Canvas->CopyRect( Dest->ClientRect, Device->Canvas, r ); } // pruefen die größe der Paintbox bool Ccandledevice::CheckCanvasSize() { int iWidth = ... // Setze neue Breite if ( Device->Height == Height ) return false; Device->Width = iWidth; Device->Height = Height; return true; } void Ccandledevice::Refresh() { // pruefe ob Paintbox noch die richtigen Ausmaße hat bool bComp = CheckCanvasSize(); bCompleteRedraw = bCompleteRedraw || bComp; if ( Candles->GetNewData(..) ) // Neue Daten? { bCompleteRedraw = bCompleteRedraw || bNewBorders; // Wenn alles neu gezeichnet werden muss, dann erstmal alles weiß if ( bCompleteRedraw ) { Device->Canvas->Brush->Color = clWhite; Device->Canvas->FillRect( Device->ClientRect ); } // ... // Zeichenoperationen // ... } }
Ich wollte auch eigentlich anfangs nur ein TCanvas als Container nutzen, aber das hat weder Breite noch Höhe und ich brauch ja irgendwas greifbares.
Sollte ich vielleicht lieber ein TBitmap als Container nutzen?
-
Da sich hinundwieder mal kleine Änderungen ergeben und ich nicht immer alles komplett neuzeichnen will, hab ich mir überlegt, in einer Klasse im Hintergrund eine TPaintBox zu halten, an der kleinere grafische Änderungen vorgenommen werden.
TPaintBox speichert die grafischen Daten nicht so, wie du es dir wünscht.
Bei TPaintBox muss man die Ausgabe selber im OnPaint() zeichnen.Du solltest dir gedanken über einen passenderen Grafik-Container machen.
TImage trifft eher, was du möchtest. Oder Evtl gleich nur TPicture oder TImage.
-
TPicture ist in TImage enthalten und TBitmap ist in TPicture enthalten, also könnte ich doch eigentlich gleich TBitmap nehmen, oder?
-
Hallo
TPaintBox und TImage binden sozusagen TBitmap als GUI-Komponente ein, um desen Inhalt gleich auf der GUI darzustellen. Brauchst du keine GUI-Komponente, reicht TBitmap.
bis bald
akari
-
Hab einfach TPaintbox durch TBitmap getauscht und schon funzt es.
Bei der Visualisierung im OnPaint-Event brauch ich ja dann immer bloß das CopyRect zu machen und gut ist.
Danke euch für eure Hilfe.