Lauftext - Ticker
-
das habe ich schon gemacht.. leider.. finde ich nur einen thread
geht denn Doublebuffering mit TLabels.. (sinnvoll)
versucht habe ich das schon ..
lS1 und lS2 sind zwei labels ..void __fastcall Taddon::scrTimerTimer(TObject *Sender) { if(lS1->Visible) { lS1->Visible = false; lS2->Visible = true; lS1->Left = lS2->Left - 1; lS1->Repaint(); } else { lS2->Visible = false; lS1->Visible = true; lS2->Left = lS1->Left - 1; lS2->Repaint(); } if((lS1->Width + lS1->Left)<0) { lS1->Left = 200; lS2->Left = 200; } }
leider ist das auch kein schoenes ergebniss..
-
Ich hab mal auf die Schnelle mit einem TLabel was gebastelt.
Form mit einem TLabel und einem Text drinnen.
Definiere unter private: der Form folgende Variablen:Graphics::TBitmap *SaveBitmap; TRect SrcRect; TRect DestRect; TRect LeftRect; TRect RightRect;
In FormCreate der Form kommt folgender Code:
void __fastcall TForm1::FormCreate(TObject *Sender) { SaveBitmap=new Graphics::TBitmap(); SaveBitmap->Height=Label1->Height; SaveBitmap->Width=1; SrcRect.left=1; SrcRect.top=0; SrcRect.right=Label1->Width; SrcRect.bottom=Label1->Height; DestRect.left=0; DestRect.top=0; DestRect.right=Label1->Width-1; DestRect.bottom=Label1->Height; LeftRect.left=0; LeftRect.top=0; LeftRect.right=1; LeftRect.bottom=Label1->Height; RightRect.left=Label1->Width-1; RightRect.top=0; RightRect.right=Label1->Width; RightRect.bottom=Label1->Height; }
Im FormDestroy der Form nicht vergessen:
void __fastcall TForm1::FormDestroy(TObject *Sender) { delete SaveBitmap; }
Jetzt noch nen TTimer auf die Form ziehen, Intervall auf 25 oder so und in das TimerEvent:
void __fastcall TForm1::Timer1Timer(TObject *Sender) { SaveBitmap->Canvas->CopyRect(LeftRect, Label1->Canvas, LeftRect); Label1->Canvas->CopyRect(DestRect, Label1->Canvas, SrcRect); Label1->Canvas->CopyRect(RightRect, SaveBitmap->Canvas, LeftRect); }
Jetzt erfolgt Smooth-Scrolling des Textes. Bei mir hats nicht mehr geruckelt.
(Keine Garantie auf Fehlerfreiheit images/smiles/icon_wink.gif )
-
Bisher bei weitem die beste Lösung!
Noch ein Tip zur Tipp-Ersparnis beim Initialisieren der Rects:SrcRect = Bounds(1, 0, Label1->Width, Label1->Height);
-
Seehhr geil! So ähnlich hatte ich mir das auch gedacht. Es ist einfach besser, wenn man Zeichenoperationen sich im Hintergrund abspielen lässt. Man muß bloß aufpassen, daß man TLabel::AutoSize auf false setzt.
Mir ist aber gerade aufgefallen, daß das alles sehr langsam geht. Und wenn man während der Laufzeit den Cursor über den Quellcode-Editor des Builders bewegt, dann läuft der Text schneller. Ist alles noch nicht so ausgereift.
[ Dieser Beitrag wurde am 18.02.2002 um 21:37 Uhr von WebFritzi editiert. ]
-
daß das alles sehr langsam geht
Kann ich nicht bestätigen.
Hier läuft das sowohl auf'm Athlon 1700+/Voodoo5/Win2000 als auch auf'm alten Notebook mit P133 und Cirrus Billiggrafik unter Win98 flüssig.Auch einen Zusammenhang zwischen Mausbewegungen und Scrollgeschwindigkeit kann ich nicht feststellen.
Das einzige Problem, das ich sehe, ist, dass bei Überdeckungen durch andere Fenster das Label ab und zu nicht wieder ordentlich neugezeichnet wird.
-
hey Peter das ist geht echt super so..
DANKE DANKE DANKE
images/smiles/icon_smile.gif
-
nur ein problem gibts noch.. images/smiles/icon_sad.gif
was machen ich, wenn ich einen text habe der laenger ist als meine Form oder sogar mein screen.kann man das auch im hintergrund abarbeiten ?
-
Dann wirds etwas umfangreicher. Hab leider keine Zeit um eine Lösung auszuarbeiten. Ich denke aber da spontan an einen "virtuellen" Canvas in dem der Text gespeichert ist. Dieser Text wird dann "fensterweise" ausgelesen, das "Fenster" muss so gross sein wie das Label und wird dann ins Label kopiert. Das "Fenster" wird dann pixelweise im Quellcanvas verschoben. Nur so ganz grob, wie ich an eine Lösung rangehen würde. Vielleicht gibts ja auch noch andere Ansätze ...
-
danke Peter..
aber ich werde einfach in das SaveBitmap
einSaveBitmap->Canvas->TextOutA(0,0,text);
schreiben und aus dem ins label kopieren..
DANKE nochmal
-
Jou, so hab ich mir das auch gedacht und dann halt ausschnittsweise ins Label kopieren. Wenn Du auf einen Rundlauf des Textes verzichten kannst, dann mach am Anfang und am Schluss des SaveBitmaps ein leeres Stück in der Länge des Labels rein. So kannst Du den Ausschnitt vom Anfang bis zum Ende "durchschieben" und dann gleich wieder von vorne beginnen, wenn Du verstehst was ich meine images/smiles/icon_wink.gif
-
ja genau so habe ich das im moment..
geht prima..