Funktion Repaint zu langsam.
-
Christian211 schrieb:
Stichwort: Doublebuffered
hermes schrieb:
Ich meine nicht das flackern, das lässt sich mit DoubleBuffered beseitigen.
-
Dann solltest du dein Konzept ändern. Etwa in derart, das Neuzeichnen im einem extra Thread alle x Ms auslagern
-
Ich habe eine Komponenete von GraphicControl abgeleitet, in dieser
Komponente benutze ich das Canvas von GraphicControl um mit Pixels
eine 7Segmentanzeige in Abhängigkeit von der Eigenschaft Value(0-9) der Komponente
zu zeichnen.Bei jedem ändern von Value wird über den Setter von Value mit Repaint die von mir
überschrieben virtuelle Funktion Paint ausgeführt und die 7Segment Anzeige
mit der Funktion DrawSeg neu gezeichnet.Ich nehme nun 3 Komponenten der 7Segment Anzeige und gebe darauf die Position
einer TrackBar (0-255) wieder.Die Trackbar lässt sich nicht fließend bewegen, was darauf schliessen lässt
das der Funktionsaufruf Paint sehr lange dauert.Zeichne ich die 7Segment Anzeige(DrawSeg()) im meinem Programm direkt auf ein Image
(ohne meine Komponente zu benutzen)läuft das ganze flüssig, also die Funktion zum zeichnen ist nicht das Problem.
-
na wenns flüssig läuft ist doch ok
-
Aber nicht als Komponenete.
-
Pixels ist ja auch extrem langsam.
Mach doch in der Komponente ein Bitmap.
In das zeichnest Du.
In Paint wird das mit CopyRect o.ä. in Canvas kopiert.Oder mach in die Kompo gleich ein Image, das geht auch.
-
Habe mal mit Bitmap sowie CopyRect rumprobiert, das ganze ist mir irgendwie
nicht ganz klar.
Auch das Beispiel im Builder ist etwas verwirrend.Die Methode CopyRect kopiert einen Teil eines Bildes aus einer anderen Zeichenfläche in die Zeichenfläche.
void __fastcall CopyRect(const Windows::TRect &Dest, TCanvas* Canvas, const Windows::TRect &Source);Das Beispiel dazu
Graphics::TBitmap *Bitmap; TRect MyRect, MyOther; MyRect = Rect(10,10,100,100); MyOther = Rect(10,111,100, 201); Bitmap = new Graphics::TBitmap; Bitmap->LoadFromFile("c:\\windows\\tartan.bmp"); Form1->Canvas->CopyRect(MyOther, Bitmap->Canvas, MyRect);Hier wird tartan.bmp in die Bitmap geladen ok, wie kommt nun aber der Bezug
zu MyRect als source sowie MyOther zu stande?Die Grafig wird angezeigt, warum wird aber nichts angezeigt wenn ich selber
in die Bitmap mit Bitmap->Canvas->Pixels zeiche anstatt die Grafig zu laden.
-
Nach dem Erzeugen des Bitmap MUSS Width und Height sinnvoll gesetzt werden (beim Laden wird das autom. gemacht passend zum Bild)
In Bitmap der Groesse 0 kannst Du malen was Du willst, es kommt nicht an - liegt ja alles ausserhalb
MyRect oder dem anderen kannst Du die passenden Werte zuweisen, die festlegen welcher Teil Copiert werden soll.
Fuer ganzes Bitmap:
MyRect = Rect(0,0,Bitmap->Width,Bitmap->Height);
Beim anderen Rect machste das analog passend.Das ganze Bitmap kopieren geht auch mit Draw!
-
Danke für die Hilfe.
Werde wohl Draw benutzen.
Bitmap = new Graphics::TBitmap; Bitmap->Height = 100; Bitmap->Width = 100; Bitmap->Canvas->Brush->Color = clBlack; Bitmap->Canvas->FillRect(Rect(0,0,Bitmap->Width,Bitmap->Height)); int y = 0; for(int x = 0; x <= 100; x++) { Bitmap->Canvas->Pixels[x][y] = clYellow; y++; } Form1->Canvas->Draw(0,0,Bitmap); delete Bitmap;
-
Habe in der Komponente nun 10 Bitmap Objecte erstellt in denen sich die Segment Nummern 0-9 befinden.
Die Funktion zum Zeichnen der Bitmaps wird nur noch ausgeführt wenn sich
die SegmentFarbe/Höhe ändert oder der Dezimalpunkt gewünscht wird.Ansonsten wird zum darstellen nur noch
Canvas->Draw(0,0,Bitmap[UIValue]);
benutzt.Das ganze ist nun erheblich flotter geworden.
-
Siehste, geht doch!

-
Scheint irgendwie nicht richtig zu sein, die Eigenschaften tauchen nachwievor
im OI auf.Ist vieleicht
__property int Width;
__property int Height;doch nicht richtig.
Das Thema hatte ich schon mal..... Aber wie bekommt man die geerbten
published Eigenschaften Width sowie Height aus dem OI und stattdessen privat.