Scrollen in CScrollView mit der Maus


  • Administrator

    Grüsse zusammen,

    Man kann ja in der CScrollView mit dem Wheel scrollen oder aber indem man einmal die Mittlere Maustaste drückt. In beiden fällen wird dummerweise nicht OnScroll aufgerufen, so dass man das ganze selber nochmals abfangen muss. Beim Mausrad ist das ja kein Problem. Da fängt man WM_MOUSEWHEEL ab und schon ist alles in Ordnung. Doch beim scrollen mit der mittleren Maustaste bekomm ich so meine Probleme. Denn ich muss bei meinem Programm die Ansicht bei jeglichem Scrollen immer wieder aktualisieren. Und WM_MBUTTONDOWN wird leider nur einmal gesendet. WM_MOUSEMOVE kann ich auch nicht abfangen, da man ja die Maus nicht immer bewegen muss um zu scrollen.
    Ich könnte natürlich jetzt einen Timer starten bei WM_MBUTTONDOWN und bei irgendeinem anderen klicken diesen Timer wieder zerstören, doch von mir aus gesehen ist das seeeeehr unsauber gelöst.
    Nun zur Frage wie kann ich denn dieses Scrollen abfangen? Und im übrigen, gibt es wirklich keine Funktion, welche man überschreiben kann oder so ähnlich, welche wirklich IMMER bei irgendeinem Scroll aufgerufen wird?
    Danke im voraus.

    Grüssli


  • Administrator

    Ich erlaube mir mal die unverschämtheit und schiebe diesen Post hoch, da ich nun schlafen gehen werde und ich vielleicht am nächsten Morgen so eine nette Überraschung vorfinde XD
    Hab selber noch dazu gesucht aber nichts gefunden. Hab nämlich schon nur mühe damit einen Begriff zu finden, der dies beschreibt ^^
    Nochmals Danke.
    Grüssli


  • Administrator

    WoW! Ich muss sagen, ich hätte jetzt gedacht das sei eine Anfängerfrage, aber dem scheint ja gar nicht so zu sein. Naja wenn ihr schon nicht wisst wie man dies lösen kann, könnt ihr vielleicht Beispiele nennen, nach was ich suchen soll. Hab schon nach WM_MBUTTONDOWN/UP, Scroll, Scrolling, CScrollView, Autoscroll und natürlich auch alles in Kombination gesucht. Doch noch nichts sinnvolles gefunden. Es kommt halt immer nur das normale Scrollen mit dem Mausrad. Aber nie das Scrollen mit der gedrückten mittleren Maustaste.
    Also Begriffe sind auch willkommen.
    Grüssli



  • Also, ich finde und das haben wohl uch andere gefunden hättest du durchaus selber rausfinden können, alleine wenn du mal die WM Messages durchgehst wirst du mindestens 2 funktionen finden die SCROLL Enden. Und ich meine was liegt da nahe????

    Also falls du es dann jetzt imma noch net findest. Die Messages WM_VSCROLL und WM_HSCROLL sind diese die du suchst. Sie werden bei jedem Scroll ausgelöst.
    Nächst mal vieleicht einfach mal nen wenig gucken und probieren bevor mans postet. Viel spaß hoffe das hat dir geholfen.


  • Administrator

    Ehm tut mir ja leid ... aber die hatte ich am Anfang gehabt, doch die werden leider nicht ausgelöst. Beim normalen Scroll ja. Aber nicht beim Mausrad und beim drücken der mittleren Maustaste. Es wird ja sogar in der MSDN erklärt, dass auf das Mausrad per OnMousWheel zugegriffen werden muss, wenn etwas am Scrollen geändert werden soll, da es nicht über das normale Scrollen abläuft.
    Grüssli



  • Also, du nimmst ne variable, und du weißt ja wann du die mittlere maustaste gedrückt hast. Wenn das so ist dann setzte du ne bool auf true. Dann kanst du mousemove nehmen um zu scrollen mit set scrollpos sollte das leicht gehen. Die anchrichten werden ausgelöst das du nicht das scrollrad benutzt. Und da du ja uch weißt wann du die mittlere los läst setzt du dann die bool wieder auf false und reagierst net mehr mit mousemove druff. Ansonsten erklär doch nochma was genau du amchen willst ich habs vieleicht uch nur falsch verstanden.


  • Administrator

    tjo wenn es so einfach wäre ^^ ...
    Erstes das Scrollen wird durch ein klick aktiviert. Deaktiviert kann es aber durch alles möglich werden. Da kannst du sogar Escape drücken. Und das habe ich nicht eingeproggt, dass ist Standard mässig bei CScrollView dabei.
    Zudem wird nicht nur gescrollt wenn man die Maus bewegt, sondern es wird gescrollt, sobald die Maus einen gewissen Abstand von dem Punkt hat, wo geklickt wurde. Umso weiter weg, desto schneller wird gescrollt. Leider habe ich keine Ahnung wie weit weg sie vom Klickpunkt gehen muss.

    Ich hab schnell ein Bild gemacht von der Scrollmöglichkeit hier in diesem Forum. Bei mir hat es einfach nicht nur zwei Pfeile (einer nach oben und einer nach unten) sondern vier Pfeile (links,rechts,oben,unten). Aber das Prinzip ist das Selbe. Und ich denke spätestens mit dem Bild wird dir schon klar sein, welches Scrollen ich meine.

    http://home.arcor.de/drachensuchender/scroll.jpg

    Grüssli und danke für die Hilfe


  • Administrator

    Ok hab es teilweise gelöst jetzt. OnScrollBy wird von jeglichem scrollen aufgerufen. Allerdings habe ich nun ein anderes Problem. Nämlich wird der Hintergrund wo die Fläche mit den grauen Zeiger war nicht neu gezeichnet. Dass hat wohl damit zu tun, dass ich das WM_ERASEBKGND überschrieben habe und immer FALSE zurückliefere. Daher ich bräuchte irgendwo noch ein Invalidate. Doch dazu müsste ich wissen, welche Funktion aufgerufen wird um diese Art von Scrollen zu beenden. ^^ ...
    Ich glaube ich mach es bald anders rum, ich deaktiviere dieses Scrollen indem ich WM_MBUTTONDOWN überschreibe ^^

    Grüssli


Log in to reply