WM_MOUSEMOVE auf ScrollAreaGadget/ImageGadget begrenzen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

WM_MOUSEMOVE auf ScrollAreaGadget/ImageGadget begrenzen

Beitrag von Hugo »

Hallo Leute,

nach langer Zeit versuche ich mal wieder ein PureBasic Projekt anzugehen. Dabei bin ich auf etwas gestoßen, was ich nun schon seit Tagen versuche zu verstehen bzw. hinzubekommen.

Im Code-Beispiel wird ein Window, eine StatusBar, ein Menü, eine ToolBar und ein ScrollAreaGadget mit Image erstellt.

Wenn ich nun die Maus bewege wird das schön im Debugger-Fenster angezeigt. Was ich allerdings nicht verstehe ist, dass wenn ich in den vertikalen oder horizontalen Schieberegler-Bereich komme, diese nicht mehr angezeigt werden (so soll das auch sein), wenn ich aber dann weiter in den StatusBar Bereich komme wieder Mouse-Events erzeugt werden. Genau so ist es im oberen ToolBar-Bereich. Der Menü-Bereich dagegen ist wieder ok.

Was ich nun schon lange versuche ist, den Bereich der Maus auf den sichtbaren Image-Bereich zu begrenzen. Vielleicht hat ja einer von euch eine Idee dazu.

Code: Alles auswählen

EnableExplicit

#WindowMain     = 1
#StatusBar      = 2
#Menu           = 3
#ToolBox        = 4
#Image          = 5

#GadScroll      = 1
#GadImage       = 2

Global x_Win.i  = 100
Global y_Win.i  = 200
Global h_Win.i  = 700
Global w_Win.i  = 1200
Global x_Max.i  = 5000
Global y_Max.i  = 4000

Global w_Par.i, l_Par.i, x_Mouse.i, y_Mouse.i


If OpenWindow( #WindowMain, x_Win, y_Win, w_Win, h_Win, "Test", #PB_Window_SystemMenu )
  
  If CreateStatusBar( #StatusBar, WindowID( #WindowMain ) )
    AddStatusBarField( 200 )                                     
    AddStatusBarField( 200 )  
    AddStatusBarField( 200 ) 
    
    If CreateImageMenu( #Menu, WindowID( #WindowMain ), #PB_Menu_ModernLook )
      MenuTitle(       "Datei"        ) 
      MenuItem(  1,    "Laden..."     )
      MenuItem(  2,    "Speichern..." )
    
      If CreateTB( #ToolBox, WindowID( #WindowMain ), 20, 20, #TBpro_BORDER )
        AddTBtextButton( 1,  "Laden...",      #TBpro_BUTTON )                             
        AddTBtextButton( 2,  "Speichern...",  #TBpro_BUTTON )
  
        If CreateImage( #Image, x_Max, y_Max )
          
          If StartDrawing( ImageOutput( #Image ) )
            Box( 0, 0, x_Max, y_Max, RGB( 190, 190, 190 ) )  
            StopDrawing()   
            
            If ScrollAreaGadget( #GadScroll, 0, TBheight( #ToolBox ) - 1, WindowWidth( #WindowMain ), WindowHeight( #WindowMain ) - ( TBheight( #ToolBox ) + StatusBarHeight( #StatusBar ) + MenuHeight() ), x_Max, y_Max, 10, #PB_ScrollArea_Single )
              ImageGadget(       #GadImage,  0, 0, x_Max, y_Max, ImageID( #Image ) ) 
              
              Repeat
                Select WaitWindowEvent()
                  Case #PB_Event_CloseWindow    
                    CloseWindow( #WindowMain )
                    End
                    
                  Case #WM_MOUSEMOVE                                                            
                    
                    If EventWindow() = #WindowMain
                      l_Par = EventlParam()  
                      x_Mouse = l_Par & $FFFF  
                      y_Mouse = ( l_Par >> 16 ) & $FFFF 
                      
                      
                      Debug "x_Mouse: " + Str( x_Mouse ) + ", y_Mouse: " + Str( y_Mouse )
                      
                      
                    EndIf
                    
                    
                EndSelect
              ForEver
            
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf
EndIf

Gruß,
Hugo
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WM_MOUSEMOVE auf ScrollAreaGadget/ImageGadget begrenzen

Beitrag von RSBasic »

Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Re: WM_MOUSEMOVE auf ScrollAreaGadget/ImageGadget begrenzen

Beitrag von Hugo »

nein, das meinte ich nicht. Denn ClipCursor würde ja dafür sorgen, dass die ToolBar und das Menü nicht mehr verwendbar wären.

Ich meinte, wie bekomme ich es hin, dass entweder WM_MOUSEMOVE keine Events mehr liefert wenn es nicht im inneren Bereich ist (was wahrscheinlich nicht geht) oder ich irgendwie feststellen kann, dass WM_MOUSEMOVE nicht vom ScrollAreaGadget bzw. ImageGadget ist.
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: WM_MOUSEMOVE auf ScrollAreaGadget/ImageGadget begrenzen

Beitrag von edel »

Du kannst das ueber ein Callback loesen.

Code: Alles auswählen

EnableExplicit

#WindowMain     = 1
#StatusBar      = 2
#Menu           = 3
#ToolBox        = 4
#Image          = 5

#GadScroll      = 1
#GadImage       = 2

Global x_Win.i  = 100
Global y_Win.i  = 200
Global h_Win.i  = 700
Global w_Win.i  = 1200
Global x_Max.i  = 5000
Global y_Max.i  = 4000

Global w_Par.i, l_Par.i, x_Mouse.i, y_Mouse.i, oldProc

Procedure ImageCallback(hWnd, Msg, wParam, lParam)
  
  If Msg = #WM_MOUSEMOVE
    PostEvent(#PB_Event_Gadget, 0, #GadImage, #PB_EventType_MouseMove, lParam)
  EndIf
  
  ProcedureReturn CallWindowProc_(oldProc, hWnd, Msg, wParam, lParam)
EndProcedure



If OpenWindow( #WindowMain, x_Win, y_Win, w_Win, h_Win, "Test", #PB_Window_SystemMenu )
  
  If CreateStatusBar( #StatusBar, WindowID( #WindowMain ) )
    AddStatusBarField( 200 )                                     
    AddStatusBarField( 200 )  
    AddStatusBarField( 200 ) 
    
    If CreateImageMenu( #Menu, WindowID( #WindowMain ), #PB_Menu_ModernLook )
      MenuTitle(       "Datei"        ) 
      MenuItem(  1,    "Laden..."     )
      MenuItem(  2,    "Speichern..." )
    
      If 1;CreateTB( #ToolBox, WindowID( #WindowMain ), 20, 20, #TBpro_BORDER )
        ;AddTBtextButton( 1,  "Laden...",      #TBpro_BUTTON )                             
        ;AddTBtextButton( 2,  "Speichern...",  #TBpro_BUTTON )
  
        If CreateImage( #Image, x_Max, y_Max )
          
          If StartDrawing( ImageOutput( #Image ) )
            Box( 0, 0, x_Max, y_Max, RGB( 190, 190, 190 ) )  
            StopDrawing()   
            
            If ScrollAreaGadget( #GadScroll, 0, 0, WindowWidth( #WindowMain ), WindowHeight( #WindowMain ) - ( 0 + StatusBarHeight( #StatusBar ) + MenuHeight() ), x_Max, y_Max, 10, #PB_ScrollArea_Single )
              ImageGadget(       #GadImage,  0, 0, x_Max, y_Max, ImageID( #Image ) ) 
              
              oldProc = SetWindowLongPtr_(GadgetID(#GadImage), #GWLP_WNDPROC, @ImageCallback())
              
              Repeat
                Select WaitWindowEvent()
                  Case #PB_Event_CloseWindow    
                    CloseWindow( #WindowMain )
                    End
                  Case #PB_Event_Gadget
                    
                    If EventGadget() = #GadImage
                      
                      If EventType() = #PB_EventType_MouseMove
                        
                        l_Par = EventData()
                        
                        x_Mouse = l_Par & $FFFF  
                        y_Mouse = ( l_Par >> 16 ) & $FFFF 
                        
                        Debug "x_Mouse: " + Str( x_Mouse ) + ", y_Mouse: " + Str( y_Mouse )
                        
                      EndIf
                    
                    EndIf
                    
                    
                EndSelect
              ForEver
            
            EndIf
          EndIf
        EndIf
      EndIf
    EndIf
  EndIf
EndIf
Hugo
Beiträge: 56
Registriert: 30.03.2005 12:07
Wohnort: Nähe München

Re: WM_MOUSEMOVE auf ScrollAreaGadget/ImageGadget begrenzen

Beitrag von Hugo »

Danke - sieht so aus als ob das die Lösung ist! Werde es morgen ausführlich testen..

Gruß,
Hugo
Antworten