ScrollBox automatisch scrollen
-
Alles hängt daran, daß ich den die Mausposition nicht in Screenkoordinaten umwandeln kann. Damit wär ich nämlich aus dem Schneider. Hab es nach deinem Beispiel auch noch mal mit der Form als Basis versucht, bringt auch kein anderes Ergebnis.
MovePt = Form1->ClientToScreen(MovePt);
Bei der erst verwendeten Methode hab ich gemerxt, daß sich der Punkt des Scrollbeginns immer weiter ims Image hinein zurückverlagert, je größer Position ist. Das war bei dem Ansatz das Haupthandicap.
Karamba, wenn die Mausposition als Screen-Kordinaten ermittelbar wäre, könnte man exakt vergleichen, ohne die Rechtecke benutzen zu müssen. Und dann die Position der ScrollBar nur über den Timer verschieben. Das wär 'ne klare Sache.
Also, ich brauch die Mausposition als Screenkoordinaten! Was mach ich falsch? Es muß gehen, wenn es in der Klasse so vorgesehen ist.
Zum letzten Absatz: Mich würde auch stören, wenn die Mausreaktion innen ist. Die muß außen liegen, dann ist alles paletti. Als Bedingung setz ich auch, daß Drawing oder Dragging true sein muß. Sonst würde jede Mausbewegung im Bildschirm was bewegen.
-
Original erstellt von <Omega-X>:
Alles hängt daran, daß ich den die Mausposition nicht in Screenkoordinaten umwandeln kann. Damit wär ich nämlich aus dem Schneider.Wenn es dir weiterhilft:
POINT pt; GetCursorPos(&pt);
-
Hi
Das versteh' ich jetzt nicht!(???)
mit
Pt=Form1->ScreenToClient(Mouse->CursorPos)
muesste doch exakt die Positin der Maus IN FORM kommen:
-- Mouse->CursorPos enthaelt doch die ScreenKoordinaten der Maus!!! (BCB 4.0)
-- Form1->ScreenToClient macht daraus FORM- bezogene Koordinaten!Wo holst Du Dir die Mauskoordinaten; Was enthalten die genau?
Das hat eigentlich mit dem Stand der Rollbalken nichts zu tun???
Wo ist dein Timer? Sollte in der Form liegen, nicht in Klasse der ScrollBox!
PS: Liegt Deine ScrollBox in der Form oder auf einem Pane / Registe?
Wenn die NICHT in der Form direkt liegt, stimmt die ganze Rechnung nicht!
(ARect / IRect). Dann musste ScreenToClient von Panel nehmen![ Dieser Beitrag wurde am 14.03.2003 um 12:12 Uhr von DerAltenburger editiert. ]
-
@WebFritzi, *Volltreffer*!!!
Damit gehören dir meine letzten 30 Kamele und die antike Ölquelle, wie auf Seite 1 angekündigt.
Will sagen, super Dank, genau das war's.
Ole, jetzt wieder ab in die Werkstatt. @DerAltenburger, jetzt kann ich die Sachen nachvollziehen. - Ich hab übrigens das Image auf dem Panel liegen. Hat sich aus praktischen Gründen bewährt. Das über das Image hinausgeschobene Paste-Image wird nun nur noch soweit angezeigt, wie es über dem Image liegt. So soll es sein, da der Rest ja abgeschnitten wird.
-
Ohne Timer glatte Scrollbewegung, Geschwindigheit steuerbar.
Nachteil: Invalidate() ist unwirksam. Kleine Kostprobe - muß noch den Rest fertig machen:
void __fastcall TPixi::ScrollBoxMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { POINT pt; GetCursorPos(&pt); //falls Maus am rechten Rand if (pt.x > ScrollBox1->Left+ScrollBox1->Width) { ScrollBox->HorzScrollBar->Position+=1; // Invalidate() nicht wirksam Invalidate(); Sleep(1); } // im gleichen Stil noch die übrigen 3 Seiten ... }
@DerAltenburger, Mit dem Timer konnte ich nix gutes hinbekommen. Zwar war die Bewegung auch glatt, aber noch zu schnell. Hab alle Varianten mit Enabled durchprobiert, immer das gleiche. Die einmal angeregte Bewegung wird vom OnMouseMove immer wieder ausgelöst. Auch Stillstand ist MouseMove.
Ob sich irgendwie doch ein Invalidate(), Refresh()... erreichen läßT? Die Idee wär mir noch mal 30 Kamele wert, doch ich hab ja keine mehr. :p
-
Hi
Wenn Du das mit dem Timer probierst, DARF DAS SCROLLEN NICHT PARALLEL IN MouseMove AUSGELOEST WERDEN!
Timer ODER OnMouseMove! (Kannst das ja zum Test mal auskommentieren)
Das Tempo wird vom Timer und Deiner Berechnung gesteuert.
Der Timer loest alle INTERVALL msec ein Scrollen aus, Deine Berechnung sagt, wieviel Pixel jedesmal.
Pixel/sec = (1000 / Timer->Inervall) * Scrittweite !
Wenn OnMouseMove ebenfalls Scrollen ausfuehrt, rekursiert der wieder!
PS: Neh'm auch 8 Dromedare und 3 Haremsdamen :p
-
Und das war's dann erst mal. math.h ist mein Zeuge, daß ich von Mathe keine Ahnung hab. :p Das meint, eine steilere Kurve wär für höhere Zomfaktoren sicher noch besser. Immerhin kann das Refresh()-Geruckel in (vertretbaren) Grenzen gehalten werden. Feinheiten kann man aber jederzeit noch rausarbeiten. Wer eine Idee hat...
Hier mal die Fuction (ich hoff ja, dem Fragesteller wird halbwegs verziehen, wenn er Komplettlösungen postet?
):
void __fastcall TPixi::ScrollBoxMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { // float ZFac; // ZoomFaktor, im Header privat declariert POINT pt; GetCursorPos(&pt); // Mit Screenkoordinaten arbeiten if (pt.x > ScrollBox1->Left+ScrollBox1->Width && Tag == 0) { // rechter Rand // Scrollweg festlegen, Zoomfaktor mit einbeziehen ScrollBox->HorzScrollBar->Position+=cosh(2+ZFac/2); Tag = 1; // Scrollen und Refresh() im Wechsel } if (pt.x < ScrollBox1->Left && Tag == 0) { // linker Rand ScrollBox->HorzScrollBar->Position-=cosh(2+ZFac/2); Tag = 1; } if (pt.y > ScrollBox1->Top+ScrollBox1->Height && Tag == 0) { // unterer Rand ScrollBox->VertScrollBar->Position+=cosh(2+ZFac/2); Tag = 1; } if (pt.y < ScrollBox1->Top+ToolBar->Height && Tag == 0) { // oberer Rand ScrollBox->VertScrollBar->Position-=cosh(2+ZFac/2); Tag = 1; } if (Tag == 1) { Image->Refresh(); // Spuren der Arbeit beseitigen Tag = 0; // Auf Scrollen zurückschalten } }
-
Wie kann ich den Timer dann auslösen, wenn er gebraucht wird, sonst nicht? Zumindest muß ich ihn an der richtigen Codestelle enablen. Aber der Part ist überholt, es geht ja ohne.
- War eigentlich vorab schon klar, ich brauchte nur die Screenkoordinaten. Hoffentlich hat @webFritzi viel Freude an der Antiken Ölquelle - wenngleich sie natürlich schon lang nicht mehr fördert.
Dein PS ist viel wichtiger. Sei's um die Dromedare, sie sind dir gegönnt. Aber unter 5 Haremsdamen, das kann ich nicht entstehen lassen... bevor ich deutlich über 90 bin. Du siehst, ich bin bescheiden und... arm.
-
Den Timer lass ich dauernd laufen! Der steuert bei mir mehrere Komponenten. Jede Komponente, die ich takten will, hat ja 'ne eigene Funktion abbekommen, die das ausfuehrt. Die Ausfuehrung kann abhaenig von 'ner private "Status"- Variablen in jeder Kompo freigegeben / blockiert werden. Oder je nach Zustand (Anzeigen, Malen, ...) verschiedene Funktionen ausfuehren. :p
VORTEIL mit Timer: das laeuft auf jedem Rechner gleich schnell!!! (ausser der PC ist zu lahm, damm humpelts halt
PS: Grosser Dank fuer die Dromrdare. Hoffe, die kommen unbeschadet an.
Und Du hast wirklich nicht mal 37 Haremsdamen? Du bist arm dran - aber besser als Arm ab!
Dir sei verziehen!
-
Also ich bekomm ja ein richtig schlechtes Gewissen. Baust du Spiele? Da braucht man Systemunabhängige Abläufe. Man arbeitet zB. mit Ticks = 1/16 sec. Aber bei einer Anwendung wolte ich die Abläufe so schnell wie möglich haben. Bei kleineren Bildern läuft es glat, bei größeren ist (leider) die Refreshrate der Begrenzungsfaktor.
Als Nachteil bei dem Timer find ich vor allem, daß er bei jeder Zoomstufe gleich schnell arbeitet. Bei 100% wird das dann einfach zu schnell, wenn man es für höhere Vergrößerungen auslegt. Mit der Mathematik kann man da besser ausgleichen. Vielleicht findet jemand einen noch eleganteren Rechenalgor?
Kannst die Funktion ja mal probelaufen lassen. Ich hab die OnMouseMove-Routinen für die ScrollBox und das TImage zusammengelegt. Aber du hast ja ohnehin eine gemeinsame Klasse, da sollte es auf jeden Fal klappen.
37 Haremsdamen... Träum... das haben ja hier nicht mal die Stadträte. Kommst du aus 'ner Wohlstandsgegend? :p
-
Hi
Mit Spielen hat das nichts zu tun! Da kann man kaum direkt TImage nehmen - Du hast ja auch schon Flackereffekte u.ä.
Ich bastel nur 'n bissl mit Graphik, Sound und Video- Anzeigen 'rum.
Batel 'ne Suchmaschine, die Laufwerke und Netzwerkordner nach MultiMedia- Dateien durchforstet (Grafikfiles, Audio, Video und HTM(L)- Dateien), die Daten geeignet anzeigt (in 'ner Zoom- Scroll- Box / im WinMediaplayer / im MS- IE) - im Fenster oder Vollbild. Hintergrundmusik spielen braucht's auch. Grafiken (Thumbnails davon) als Uebersicht darstellen - in 'ner MultiImageScrollBox.
Beim 'AutoScroll' stoert mich, wenn das von Mausbewegung abhaengt und das Tempo vom System. Ist alles Ansichtssache!!!
Hab auch eine Thumbnail- Uebersicht am Bildschirmrand (wie IView) und dazu Autoscroll. Das fetzt durch wie Speedy Gonzales - dafuer nehm' ich den Timer - 3 - 5 Thumbnail / sec.
Was Du als Nachteil siehst bei Timer - "bei jeder Zoomstufe gleich schnell " - kann doch die Timer- Funktion mit 'einrechnen'???
!!! Deshalb sag ich: Spezielle Funktion in der Klasse (hat Zugriff auf alle
!!! Variablen) und Aufruf durch Timer von aussen.Meine Thumbnailliste roolt pro sec festgelegte Anzahl Bilder, EGAL wie gross die sind. Wenn die Maus zu weit weg ist tut sich nichts.(siehe letzter Tip mit der Farbe)
PS: Wozu habt Ihr Stadtraete, die kosten doch nur sinnlos TEUROS!
D#rum habt Ihr kein Geld fuern ordentlichen Harem :p
-
Na, für Spiele könnte man TImage gar nicht brauchen. Gerenderte Level und Models. Da würde das arne Teilchen schon vor dem Start durchglühen und schmelzen.
Aber ich seh schon wieder Unterschiede. Zum Bilder betrachten brauch ich keine Maus. Die Leertaste find ich da viel praktischer. Dann bestimm ich das Tempo. Ggf. die Pfeiltasten, um die Ztumbnails (seitenweise) zu schalten. Da will ich keine Maus im Bildschirm sehen. Ich mach das hier nur für's Malprogramm. Da isses OK, wie es jetzt ist.
Aber ich kapier nicht, wie du den Timer langsamer arbeiten läßt. Sonst geht es immer. Hier hatte ich das Interval bis 80000 hochgestellt. Es war, als hätte ich nichts geschrieben.
Netzwerk muß 'n interessanter Bereich sein. Aber mit dem BCB3 müßte man sich erst mal ein Gerüst aufbauen. Der unterstützt ja noch nichts. Macht auch nix, ich hab sowieso keine Ressourcen im Netz. Video und Medien brauch ich nicht. Den Minibedarf kann KaZaa mühelos decken. :p Ansonsten halt NetAnts. Was will ich mir da vergleichbares bauen? Um die oft miesen Verbindungen zu verbessern, gibt's sowieso keinen Code.
Aber deine Bemerxung zu den Stadträten find ich fies. Hier gibt's nun mal keine Schrotflinten, also haben wir Stadträte. Hide(); genügt nicht, um die wegzubringen. 37? ... ich glaub, ich zieh in 'ne bessere Gegend.
-
Original erstellt von DerAltenburger:
D#rumWie schaffst du das?
-
@Omega-X
Das mit der Maus in Graphik- Anzeigen ist von CAD- Programmen 'abgeguckt'.
Zoomen / Schieben / Markieren / Originalgroesse / Einpassen ... von Zeichnungsteilen. Bei mir sind alle 3 Tasten plus <Shift> und <Ctrl> mitbelegt. Die Maus haste sowieso in der Hand. Das Scrollrad ist ja nicht an allen PC da (Laptop ohne Maus?), das ist nur ne extra Funktion - Zoom / Schieben hoch / quer mit Sondertasten. Ist auch 'n bissl Spielerei.Das mit dem Timer:
-- in Timer- Routine der Kompo hab ich 'ne static Variable, die am Anfang
-- auf 0 gesetzt wird. Koennte auch private Var in Kompo sein.-- static int Teiler=0
-- In der Routine erfolgt Test if ((Teiler % 10)==0)
-- Nur wenn true wird Code abgearbeitet (nur jedes 10te mal)
-- Die Scrittweite zum Scrollen hab ich doch abhaengig vom Randabstand berechnet
-- Siehe Beispiel mit der Farbe.
!! Wenn das bei Dir nicht langsamer wird, liegts daran, dass Du in Deinem
!! OnMouseMove auch reagierst! Das darf nichtsein. Timer ODER MouseMOVE!! Timer verursacht Scroll-> bewegt Bild-> verursacht OnMouseMove-> Scroll-> ..
Wenn ich Timer aktiviere, blockiere ich OnMouseMove!
Was meinst Du?
Das D#rum oder das mit dem Harem
[ Dieser Beitrag wurde am 16.03.2003 um 21:14 Uhr von DerAltenburger editiert. ]
-
'ne andere Möglichkeit, mit dem Timer zu arbeiten ist, ein int TimeOver zu setzen und je Interval runterzählen lassen. Letztendlich dürfte der Weg keine Rolle spielen, da die Refreshrate die Unruhe reinbringt.
Zum "Gasgeben", je weiter man vom Rand weg ist, kann man auch mit der Differenz aus ScrenPos.x oder ScrenPos.y zum Rand rechnen. Entweder TimeOver verringern oder im OnMouseMove größere Schritte machen. Erste Versuche fielen noch etwas grob aus. Damit will ich mich mal in Ruhe auseinandersetzen. Der Codeaufwand ist gering. Ich setz ja kein TRect sondern frag nur die Seiten ab.
@WebFritzi will dich nicht aufklären? Ich versuch mal die QSPaula: D#rum statt Darum, also nicht etwa Dsrum, Dyrum, Dqrum oder... Alles klar? :p Dr. Mabuse war so "genial", der hat Spiegelschrift geschrieben.
- Genauer kann ich es nicht sagen, sonst wird totales OT draus.