CrossHair zeichnen ( CPUlast )
-
Folgendes Problem:
Ich habe eine Kurve auf einer PaintBox dargestellt.
Gezeichnet wird in einer TBitMap-Komponente und das ganze dann per Draw auf die Paintbox gebracht.Das läuft soweit gut, bis auf ein winziges Detail:Ich zeichne am Mauszeiger ein Crosshair über die ganze Paintbox ( waagerechte und senkrechte Linie ) und das bei jeder Bewegung der Maus.
Dazu gehe ich folgendermaßen vor:Wenn ich ein neues Chartbild rendere, mache ich hinterher eine Kopie davon per Copyrect in ein anderes TBitMap. Dieses TBitmap kopiere ich vor jeder Darstellung des Crosshairs in das Haupt-TBitmap und zeichne dann das Crosshair darüber. Das Haupt-TBitMap wird dann wieder per Draw in die Paintbox gezeichnet. Bewege ich die Maus wiederrum beginnt die Prozedor von vorn.
Das ist aber leider stark CPU-Lastig... Hat jemand eine Idee, wie ich das beheben kann?
-
Wie aktualisierst du denn deine PaintBox? Mit
Repaint()
?
-
Ich verwende zum Zeichnen des Fadenkreuzes den "Gummiband-Effekt".
-
Crosshairer schrieb:
Wenn ich ein neues Chartbild rendere, mache ich hinterher eine Kopie davon per Copyrect in ein anderes TBitMap. Dieses TBitmap kopiere ich vor jeder Darstellung des Crosshairs in das Haupt-TBitmap und zeichne dann das Crosshair darüber. Das Haupt-TBitMap wird dann wieder per Draw in die Paintbox gezeichnet. Bewege ich die Maus wiederrum beginnt die Prozedor von vorn.
Also etwa so
void NeuesBild() { ZeichneNeuenChartInBitmap(bitmap); KopiereBitmap(bitmap, backupBitmap); // "sichern" } void Draw() { KopiereBitmap(backupBitmap, bitmap); // "sicherung wiederherstellen" ZeichneFadenkreuzAufBitmap(bitmap); // Fadenkreuz drübermalen ZeichneBitmapAufCanvas(bitmap, m_canvas); // Alles zusammen auf den Bildschirm zeichnen }
?
Wenn deine Bitmaps dann nochdazu DIBs sind (und keine DDBs), dann ist das natürlich CPU-lastig.
Wenn du ein klein wenig Flackern in Kauf nehmen kannst, dann zeichne doch einfach die unmodifizierte Bitmap auf den Canvas, und danach das Fadenkreuz drüber.
Oder merk' dir wo das Fadenkreuz in "bitmap" ist, und kopiere nur den Bereich aus "backupBitmap" zurück nach "bitmap" der vom Fadenkreuz modifiziert wurde.Oder nimm DDBs.
Falls das im Zusammenhang mit VCL Unsinn sein sollte sorry, ich hab von VLC genau keinen Plan. (Von Windows GUI Sachen dafür schon ein wenig.)