Scrollen mit Mausrad optimieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 188
Registriert: 27.01.2016 11:08
Wohnort: BY

Scrollen mit Mausrad optimieren

Beitrag von techniker »

Hallo zusammen,

ich habe hier ein ScrollAreaGadget, welches dynamisch weitere Gadgets beinhaltet.
Wird nun z.B. ein EditorGadget eingefügt, so greift das Mausrad-Scroll-Event im Editorgadget, wenn die Maus sich über diesem befindet.
Das ist logisch und nachvollziehbar - jedoch hier unerwünscht. Sämtliche Mausrad-Scroll-Events innerhalb des ScrollAreaGadget sollen auch zu diesem "umgeleitet" werden.

Es darf gerne Win API verwendet werden. Hat hier jemand einen Codefetzen für mich? :)
(Ich vermute mal Callback auf die Child-Gadgets und dann das Event (#WM_MOUSEWHEEL?) einfach nicht behandeln?)

Danke und schöne Grüße :allright:
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
Axolotl
Beiträge: 319
Registriert: 31.12.2008 16:34

Re: Scrollen mit Mausrad optimieren

Beitrag von Axolotl »

Du hast den Lösungsweg ja schon (theoretisch) beschrieben....
Warum nicht selbst probieren?
Egal, hier mal mein Quick&Dirty Hack für die verticalen Mausrad bewegungen. Abgeleitet vom ScrollAreaGadget Beispiel der Hilfe.
Viel Spaß damit.

Code: Alles auswählen

; written by Axolotl 
EnableExplicit 

Global PrevEditorGadgetSubclassProc 
Global ScrollStep = 30  
Global ii 

Procedure EditorGadgetSubClassProc(hWnd, uMsg, WParam, LParam) 
  Select uMsg 
    Case #WM_MOUSEWHEEL 
      WParam = (WParam >> 16) / #WHEEL_DELTA 
      If WParam = 545 : WParam = ScrollStep : Else : WParam = -ScrollStep : EndIf 
      SetGadgetAttribute(0, #PB_ScrollArea_Y, WParam + GetGadgetAttribute(0, #PB_ScrollArea_Y)) 
      ProcedureReturn 0  ; we are done. 
  EndSelect 
  ProcedureReturn CallWindowProc_(PrevEditorGadgetSubclassProc, hWnd, uMsg, WParam, LParam) ; default 
EndProcedure 
 
If OpenWindow(0, 0, 0, 405, 440, "ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ScrollAreaGadget(0, 10, 10, 390,420, 575, 1555, ScrollStep) 
    ButtonGadget  (1, 10, 10, 230, 30,"Button 1")
    ButtonGadget  (2, 50, 50, 230, 30,"Button 2")
    ButtonGadget  (3, 90, 90, 230, 30,"Button 3")
    TextGadget    (4,130,130, 230, 20,"This is the content of a ScrollAreaGadget!",#PB_Text_Right)

    EditorGadget(10, 8, 168, 360, 140)
    For ii = 0 To 15
      AddGadgetItem(10, ii, "Line "+Str(ii))
    Next
    CloseGadgetList()

  PrevEditorGadgetSubclassProc = SetWindowLong_(GadgetID(10), #GWL_WNDPROC, @EditorGadgetSubClassProc()) 

  Repeat
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        Break 
    EndSelect
  ForEver
EndIf
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Benutzeravatar
techniker
Beiträge: 188
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Scrollen mit Mausrad optimieren

Beitrag von techniker »

Axolotl hat geschrieben: 28.01.2026 13:45 Du hast den Lösungsweg ja schon (theoretisch) beschrieben....
Warum nicht selbst probieren?
Weil ich mir nicht sicher war, ob das auch sicher funktioniert oder es noch andere Auswirkungen hat.. :D
Danke! :allright:
Never change a running system - Never run a changed system!
(PB 6.21 [x86])
Axolotl
Beiträge: 319
Registriert: 31.12.2008 16:34

Re: Scrollen mit Mausrad optimieren

Beitrag von Axolotl »

Moin,
ja die andere Auswirkung ist, dass ich einen "Fehler" gemacht habe. Nutze besser die SetWindowLongPtr_() Funktion.

Code: Alles auswählen

SetWindowLong_()  ; <= dont use this (x86 only) 
SetWindowLongPtr_() ; <= this is x86 and 64 bit compatible 
Oder nimm gleich die moderne Version des Subclassings. Guckst Du hier: (English Forum)
If it comes to subclassing I like to recommend this. Subclassing Controls with ComCtl32.dll version 6 (win only)
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Antworten