Maus loslassen auf Scrollbar eines Fensters überprüfen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Maus loslassen auf Scrollbar eines Fensters überprüfen

Beitrag von Franky »

Hi, ich hab ein Problem, und zwar:
Hab ich ein Fenster mit scrollbars, ich möchte auf diesem Fenster rausfinden, wenn die maus losgelassen wurde. normal geht das ja mittels #wm_lbuttonup
befindet sich die maus allerdings über den Scrollbars oder der kleinen ecke rechts unten, krieg ich diese nachricht nicht.

Hier mal ein Beispiel (nein, das sind keine Gescmacksverirrungen, das hab ich so gefärbt, damit ihr die einzelnen Fenster unterscheiden könnt :wink: )

Code: Alles auswählen

Procedure callback(WindowID,message,wParam,lParam)
           result=#PB_ProcessPureBasicEvents
                  If WindowID=WindowID(2)
                            If message=#WM_LBUTTONDOWN
                                      Debug "Gedrückt"
                            EndIf
                  ElseIf WindowID=WindowID(1)
                            If message=#WM_LBUTTONUP
                                           Debug "Losgelassen"
                            EndIf
                  EndIf
           ProcedureReturn result
EndProcedure           

CreateImage(1,500,500)
        StartDrawing(ImageOutput())
                   Box(0,0,500,500,RGB(255,0,0))
        StopDrawing()
        
hbrush1=CreateSolidBrush_(RGB(0,255,0))

If OpenWindow(0,200,100,600,600,#PB_Window_SystemMenu,"Mein Titel")
    SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND, hbrush1) 
             OpenWindow(1,0,0,500,500,#PB_Window_BorderLess|#WM_VSCROLL|#WM_HSCROLL,"") 
                    OpenWindow(2,0,0,500,500,#PB_Window_BorderLess,"")
                     CreateGadgetList(WindowID(2))
                             ImageGadget(1,0,0,500,500,UseImage(1))
                             SetParent_(WindowID(1),WindowID(0))
                             SetParent_(WindowID(2),WindowID(1))
                             UseWindow(1)
                             MoveWindow(50,50)

  horz=0
  vert=0
  horzscroll.SCROLLINFO
  vertscroll.SCROLLINFO
  horzscroll\fMask=#SIF_ALL
  vertscroll\fMask=#SIF_ALL
    vertscroll\nPage=5
    horzscroll\nPage=5
    horzscroll\nMax=200
   vertscroll\nMax=200
  
  SetScrollInfo_(WindowID(1),#SB_HORZ,horzscroll,#True)
  SetScrollInfo_(WindowID(1),#SB_VERT,vertscroll,#True)
  SetScrollPos_(WindowID(1),#SB_VERT,vert,#True)
  SetScrollPos_(WindowID(1),#SB_HORZ,horz,#True)  
                    SetWindowCallback(@callback())
                    Repeat
                           event=WaitWindowEvent()
                    Until event=#WM_CLOSE
EndIf
End                     
Testet mal Folgendes :
Drückt die linke maustaste auf dem Roten Fenster, dann bewegt die maus
in diesen Bereich:
Bild
und lasst die Maustaste los.
"Losgelassen" wird nicht debugged :?
irgendwer ne idee, wie ich das mache?
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag von Falko »

habs auch mal getestet. Mit der Betaversion PB 3.92 geht garnichts von beiden!
Unter PB 3.91 macht es das Gleiche, wie du angegeben hast. die Ecke zwischen den beiden Scrollleisten wird wohl nicht als Fenster erkannt(?). Wenn man die WindowID(0) nimmst, geht das vom roten zum grünen Fenster.

Leider keine Lösung.

MfG Falko
Bild
Win11 Pro 64-Bit, PB_6.11b1
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Falko hat geschrieben:habs auch mal getestet. Mit der Betaversion PB 3.92 geht garnichts von beiden!
Wie??? Unter 3.92 gehen die #WM_XBUTTONXXX nicht mal mehr in den Callbacks? Jetzt muss ich aber mal ein Wort mit Fred reden :evil:
Bei aller Genialität, manchmal hat er Aussetzer :D
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

freedimension hat geschrieben:
Falko hat geschrieben:habs auch mal getestet. Mit der Betaversion PB 3.92 geht garnichts von beiden!
Wie??? Unter 3.92 gehen die #WM_XBUTTONXXX nicht mal mehr in den Callbacks? Jetzt muss ich aber mal ein Wort mit Fred reden :evil:
Bei aller Genialität, manchmal hat er Aussetzer :D
Falko meinte die beiden Events in dem obigen Code, freedimension.

Schau Dir mal den Code an, kein Wunder das da nichts geht -
das ist einfach nur schlecht (nicht die Formatierung, sondern
der Inhalt/Code selbst).
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
freedimension
Admin
Beiträge: 1987
Registriert: 08.09.2004 13:19
Wohnort: Ludwigsburg
Kontaktdaten:

Beitrag von freedimension »

Ich bezog mich da hierbei auch auf dies hier aus dem englischen Forum:
Lebostein hat geschrieben:

Code: Alles auswählen

OpenWindow(0, 0, 0, 400, 300, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test") 

CreateGadgetList(WindowID()) 
ImageGadget(0,50,50,100,100,CreateImage(0,100,100)) 

Repeat 
event = WaitWindowEvent() 
If event = #WM_LBUTTONDOWN: MessageRequester("Yeah!","Yeah!"): EndIf 
Until event = #WM_CLOSE 
#WM_LBUTTONDOWN on an image? So far no problem, in the beta 3.92 the event give back nothing. It's a bug?
Fred hat geschrieben: It now returns a gadget event, as other gadgets.

Code: Alles auswählen

openWindow(0, 0, 0, 400, 300, #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered, "Test") 

CreateGadgetList(WindowID()) 
ImageGadget(0,50,50,100,100,CreateImage(0,100,100)) 

Repeat 
event = WaitWindowEvent() 
If event = #PB_Event_Gadget : MessageRequester("Yeah!","Yeah!"): EndIf 
Until event = #PB_Event_CloseWindow	
Du siehst, alles da: beta 3.92, #WM_LBUTTONDOWN usw.
Das in diesem Thread der Callback mit 3.91 ein Ergebnis bringt und mit 3.92 nicht sagt mir, dass da etwas in der Beta nicht stimmt bei der Weitergabe von Messages an das Callback.
Das hat IMHO nichts mit schlechtem Code zu tun, oder täusch ich mich da jetzt (zugegebenermaßen mal wieder ;-) :oops:) ?
Beginne jeden Tag als ob es Absicht wäre!
Bild
BILDblog
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

@Danilo: Den hab ich einfach mal nur schnell zusammen geschnitten, aber, falls es ums grundsätzliche geht, wie wäre es deiner Meinung nach besser? :?

Meckern kann jeder /:->
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

freedimension hat geschrieben:Das in diesem Thread der Callback mit 3.91 ein Ergebnis
bringt und mit 3.92 nicht sagt mir, dass da etwas in der Beta
nicht stimmt bei der Weitergabe von Messages an das Callback.
Das Gadget hat vorher keine Mausnachrichten verarbeitet,
doch das wurde geändert.
Das Gadget empfängt jetzt als Mausnachrichten und das Haupt-
Fenster nicht mehr. Die Nachtricht kommt jetzt also als was
anderes an, WM_NOTIFY oder so (siehe MSDN, Static Controls).
freedimension hat geschrieben:Das hat IMHO nichts mit schlechtem Code zu tun, oder
täusch ich mich da jetzt (zugegebenermaßen mal wieder ;-) :oops:) ?
Damit hatte ich den obigen Code gemeint, und der ist
mehr als unkorrekt. Im Code werden 3 Hauptfenster
geöffnet und dann 2 mit SetParent als Childs gesetzt -
und das ist nicht nur schlecht, sondern auch nicht dafür
gedacht.
Franky müsste hier einfach ein eigenes Control mit
Scrollbars machen (so wie die ScrollArea) und in diesem
Callback die Mausnachrichten verarbeiten.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Franky hat geschrieben:@Danilo: Den hab ich einfach mal nur schnell zusammen geschnitten, aber, falls es ums grundsätzliche geht, wie wäre es deiner Meinung nach besser? :?
Kommt doch darauf an was Du machen möchtest.

Hab jetzt mal was zusammengeschraubt was genauso wie
Dein Fenster aussieht.
Events für klicken und scrollen (k.A. was Du mit dem scrollen vorhast).

Code: Alles auswählen

Procedure callback(hWnd,Msg,wParam,lParam)

  ; mouse handling
  Static mousedown
  If Msg=#WM_LBUTTONDOWN
    mousedown = 1
    Debug "Gedrckt"
    ProcedureReturn 0
  ElseIf Msg=#WM_LBUTTONDBLCLK
    mousedown = 1
    Debug "Gedrckt"
    ProcedureReturn 0
  ElseIf Msg=#WM_LBUTTONUP
    mousedown = 0
    Debug "Losgelassen"
    ReleaseCapture_()
    ProcedureReturn 0
  ElseIf Msg=#WM_MOUSEMOVE
    If mousedown = 1
      SetCapture_(hWnd)
    EndIf
    ProcedureReturn 0
  EndIf

  ; scroll handling
  If Msg = #WM_VSCROLL
    info.SCROLLINFO
    info\cbSize = SizeOf(SCROLLINFO)
    info\fMask  = #SIF_ALL
    GetScrollInfo_(hWnd,#SB_VERT,@info)
    pos = SetScrollPos_(hWnd,#SB_VERT,info\nTrackPos,1)
    Debug "vertikal scroll"
    ProcedureReturn 0
  ElseIf Msg = #WM_HSCROLL
    info.SCROLLINFO
    info\cbSize = SizeOf(SCROLLINFO)
    info\fMask  = #SIF_ALL
    GetScrollInfo_(hWnd,#SB_HORZ,@info)
    pos = SetScrollPos_(hWnd,#SB_HORZ,info\nTrackPos,1)
    Debug "horizontal scroll"
    ProcedureReturn 0
  EndIf

  ; default processing
  ProcedureReturn DefWindowProc_(hWnd,Msg,wParam,lParam)
EndProcedure

Procedure ClickGadget(parent,x,y,w,h,brush,style)
  Static count
  count+1
  ClassName$ = "ClickGadget_"+StrU(count,#LONG)
  wc.WNDCLASSEX
  wc\cbSize          = SizeOf(WNDCLASSEX)
  wc\style           = #CS_DBLCLKS 
  wc\lpfnWndProc     = @callback()
  wc\hInstance       = 0
  wc\hCursor         = LoadCursor_(0,#IDC_ARROW)
  wc\hbrBackground   = brush
  wc\lpszClassName   = @ClassName$
  If RegisterClassEx_(@wc)
    ProcedureReturn CreateWindowEx_(0,ClassName$,"",style|#WS_CHILD|#WS_VISIBLE,x,y,w,h,parent,0,0,0)
  EndIf
EndProcedure

If OpenWindow(0,200,100,600,600,#PB_Window_SystemMenu,"Mein Titel")
  hbrush1=CreateSolidBrush_(RGB(0,255,0))
  hbrush2=CreateSolidBrush_(RGB(255,0,0))
  SetClassLong_(WindowID(0), #GCL_HBRBACKGROUND,hbrush1)
  
  click = ClickGadget(WindowID(0),50,50,500,500,hbrush2,#WS_VSCROLL|#WS_HSCROLL)

;  horz=0
;  vert=0
;  horzscroll.SCROLLINFO
;  vertscroll.SCROLLINFO
;  horzscroll\fMask=#SIF_ALL
;  vertscroll\fMask=#SIF_ALL
;  vertscroll\nPage=5
;  horzscroll\nPage=5
;  horzscroll\nMax=200
;  vertscroll\nMax=200
; 
;  SetScrollInfo_(click,#SB_HORZ,horzscroll,#True)
;  SetScrollInfo_(click,#SB_VERT,vertscroll,#True)
;  SetScrollPos_(click,#SB_VERT,vert,#True)
;  SetScrollPos_(click,#SB_HORZ,horz,#True) 

  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
    EndSelect
  ForEver

  CloseWindow(0)

  DeleteObject_(hbrush1)
  DeleteObject_(hbrush2)

EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten