Aktuelle Zeit: 23.10.2020 01:35

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste
Autor Nachricht
 Betreff des Beitrags: Modul MouseOver
BeitragVerfasst: 27.07.2015 14:50 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Fügt die Gadgetevents MouseEnter und MouseLeave für alle Gadgets hinzu.

Update v1.01
- MacOS getestet

Update v1.02
- Windows x86 und x64
- Linux x86 und x64
- MacOS x64

Update v1.03
- Linux optimiert

Update v1.04
- Bugfix Init: falsche WindowsID für Timer

Update v1.05
- Bugfix Linux GTK3

Wegen ein Bug in PB v5.31 für MacOS (x86) beim Import ist es als Modul nicht lauffähig

Code:
;-Begin Module MouseOver
; Comment: Modul MouseOver
; Author : mk-soft
; Version: v1.05
; Created: 27.07.2015
; Updated: 03.02.2016
; Link   : http://www.purebasic.fr/german/viewtopic.php?f=8&t=29047   
;
; Thanks to:
;
; - Wilbert for mac functions get object under mouse
;     http://www.purebasic.fr/english/viewtopic.php?f=19&t=62056
;
; - Shardik for linux functions get object under mouse
;

DeclareModule MouseOver
  Declare Init(timer=999)
  Declare Release(timer=999)
EndDeclareModule

Module MouseOver
 
  ; Import internal function ------------------------------------------------------------
 
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Import ""
  CompilerElse
    ImportC ""
  CompilerEndIf
      PB_Object_EnumerateStart( PB_Objects )
      PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
      PB_Object_EnumerateAbort( PB_Objects )
      PB_Object_GetObject( PB_Object , DynamicOrArrayID)
      PB_Window_Objects.i
      PB_Gadget_Objects.i
    EndImport
   
  ; -------------------------------------------------------------------------------------
 
  Global window_for_timer = -1
 
  ; -------------------------------------------------------------------------------------
 
  Procedure EventHandler()
   
    Static lasthandle, lastgadget = -1, x, y, last_x, last_y
   
    Protected gadget, handle
   
    x = WindowMouseX(EventWindow())
    y = WindowMouseY(EventWindow())
    If x <> last_x Or y <> last_y
      last_x = x
      last_y = y
     
      CompilerSelect #PB_Compiler_OS
        CompilerCase #PB_OS_Windows
          Protected desktop_x, desktop_y
          desktop_x = DesktopMouseX()
          desktop_y = DesktopMouseY()
          handle = WindowFromPoint_(desktop_y << 32 | desktop_x)
        CompilerCase #PB_OS_MacOS
          Protected win_id, win_cv, pt.NSPoint
          win_id = WindowID(EventWindow())
          win_cv = CocoaMessage(0, win_id, "contentView")
          CocoaMessage(@pt, win_id, "mouseLocationOutsideOfEventStream")
          handle = CocoaMessage(0, win_cv, "hitTest:@", @pt)
        CompilerCase #PB_OS_Linux
          Protected desktop_x, desktop_y, *GdkWindow.GdkWindowObject
          *GdkWindow.GdkWindowObject = gdk_window_at_pointer_(@desktop_x,@desktop_y)
          If *GdkWindow
            gdk_window_get_user_data_(*GdkWindow, @handle)
          Else
            handle = 0
          EndIf
      CompilerEndSelect
     
      If handle <> lasthandle
        If lastgadget >= 0
          If GadgetType(lastgadget) <> #PB_GadgetType_Canvas
            PostEvent(#PB_Event_Gadget, #PB_Ignore, lastgadget, #PB_EventType_MouseLeave)
          EndIf
          lastgadget = -1
        EndIf
        ; Find gadgetid over handle
        PB_Object_EnumerateStart(PB_Gadget_Objects)
        While PB_Object_EnumerateNext(PB_Gadget_Objects, @gadget)
          If handle = GadgetID(gadget)
            lastgadget = gadget
            If GadgetType(lastgadget) <> #PB_GadgetType_Canvas
              PostEvent(#PB_Event_Gadget, #PB_Any, gadget, #PB_EventType_MouseEnter)
            EndIf
            PB_Object_EnumerateAbort(PB_Gadget_Objects)
            Break
          EndIf
        Wend
        lasthandle = handle
      EndIf
    EndIf
   
  EndProcedure
 
  ; -------------------------------------------------------------------------------------
 
  Procedure Init(timer=999)
    Protected window
    PB_Object_EnumerateStart(PB_Window_Objects)
    If PB_Object_EnumerateNext(PB_Window_Objects, @window)
      AddWindowTimer(window, timer, 100)
      BindEvent(#PB_Event_Timer , @EventHandler())
      PB_Object_EnumerateAbort(PB_Window_Objects)
      window_for_timer = window
    EndIf
  EndProcedure
 
  ; -------------------------------------------------------------------------------------
 
  Procedure Release(timer=999)
    If window_for_timer >= 0
      UnbindEvent(#PB_Event_Timer , @EventHandler())
      RemoveWindowTimer(window_for_timer, timer)
      window_for_timer = -1
    EndIf
  EndProcedure
 
  ; -------------------------------------------------------------------------------------
 
EndModule

;-End Module MouseOver

; ***************************************************************************************

;- Example 1

CompilerIf #PB_Compiler_IsMainFile
 
  Enumeration FormWindow
    #Window_0
  EndEnumeration
 
  Enumeration FormGadget
    #Editor_0
    #Canvas_0
    #ExplorerList_0
    #ExplorerTree_0
    #ListView_0
    #ListIcon_0
    #Combo_0
    #Date_0
    #Option_0
    #Option_1
    #Checkbox_0
    #Hyperlink_0
    #IP_0
    #Button_0
    #Button_1
    #Button_2
    #Button_3
  EndEnumeration
 
 
  Procedure OpenWindow_0(x = 0, y = 0, width = 610, height = 400)
    OpenWindow(#Window_0, x, y, width, height, "MouseOver Events", #PB_Window_SystemMenu)
    EditorGadget(#Editor_0, 10, 10, 290, 60)
    CanvasGadget(#Canvas_0, 310, 10, 290, 60)
    ExplorerListGadget(#ExplorerList_0, 310, 80, 290, 100, "")
    ExplorerTreeGadget(#ExplorerTree_0, 10, 80, 290, 100, "")
    ListViewGadget(#ListView_0, 10, 190, 290, 60)
    ListIconGadget(#ListIcon_0, 310, 190, 290, 60, "Column 1", 100)
    ComboBoxGadget(#Combo_0, 10, 260, 290, 30)
    DateGadget(#Date_0, 310, 260, 290, 30, "")
    OptionGadget(#Option_0, 10, 300, 80, 30, "Option 1")
    OptionGadget(#Option_1, 100, 300, 90, 30, "Option 2")
    CheckBoxGadget(#Checkbox_0, 200, 300, 100, 30, "Check")
    HyperLinkGadget(#Hyperlink_0, 310, 300, 140, 30, "www.purebasic.com", 0)
    IPAddressGadget(#IP_0, 460, 300, 140, 30)
    ButtonGadget(#Button_0, 10, 340, 140, 40, "Button 0")
    ButtonGadget(#Button_1, 160, 340, 140, 40, "Button 1")
    ButtonGadget(#Button_2, 310, 340, 140, 40, "Button 2")
    ButtonGadget(#Button_3, 460, 340, 140, 40, "Button 3")
  EndProcedure

  OpenWindow_0()
 
  MouseOver::Init()
 
  Repeat
    Event = WaitWindowEvent(10)
    If Event = #PB_Event_Gadget
     
       Select EventType()
          Case #PB_EventType_MouseEnter
            Debug "MouseEnter Gadget " + EventGadget()
          Case #PB_EventType_MouseLeave
            Debug "MouseLeave Gadget " + EventGadget()
           
        EndSelect
    EndIf
   
  Until Event = #PB_Event_CloseWindow
 
CompilerEndIf

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.7x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Zuletzt geändert von mk-soft am 03.02.2016 21:48, insgesamt 4-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 27.07.2015 23:35 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
Schönes Modul und sehr nützlich, vielen Dank dafür!

Ich habe es unter MacOS X 10.6.8 (Snow Leopard) getestet:
- Mit PB 5.31 x64 (64 Bit) funktioniert es einwandfrei
- Mit PB 5.31 x86 (32 Bit) läuft es leider nicht und es werden folgende Fehler angezeigt:

Bild

Wenn man allerdings die Modulhülle entfernt, läuft es auch unter PB 5.31 x86 (32 Bit) einwandfrei!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 02:25 
Offline

Registriert: 25.02.2014 22:00
Code:
CompilerCase #PB_OS_Linux
          ; Code ?
          Protected desktop_x,desktop_y, *Widget.GtkWidget = gdk_window_at_pointer_(@desktop_x,@desktop_y)
          If (desktop_x <>-1 Or desktop_y <>-1)
            gdk_window_get_origin_(*Widget\object,@desktop_x,@desktop_y)
           
            handle = *Widget
          EndIf
       


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 11:10 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
Leider ist das Beispiel von mestnyi nicht korrekt. Wenn man es in das Modul einbaut, werden nur MouseEnter und MouseLeave für Gadget 1 angezeigt. Dies liegt daran, dass mestnyi die Rückgabestruktur für gdk_window_at_Pointer_() falsch definiert:
Code:
*Widget.GtkWidget = gdk_window_at_pointer_(@desktop_x,@desktop_y)
Diese Funktion gibt das GdkWindow des Gadgets zurück, das aktuell unter dem Mauszeiger liegt, sowie die x- und y-Koordinaten für die obere linke Ecke des Gadgets. Korrekt ist also:
Code:
*GdkWindow.GdkWindowObject = gdk_window_at_pointer_(@desktop_x,@desktop_y)

Außerdem ist seine Funktion
Code:
gdk_window_get_origin_(*Widget\object,@desktop_x,@desktop_y)
falsch und überflüssig, da sie für ein gegebenes GdkWindow eines Gadgets die x- und y-Werte in Root Window Koordinaten zurückgibt.

Dies ist das korrigierte Beispiel, das in das Modul eingefügt werden kann:
Code:
        CompilerCase #PB_OS_Linux
          Protected desktop_x,desktop_y,*GdkWindow.GdkWindowObject = gdk_window_at_pointer_(@desktop_x,@desktop_y)
          If *GdkWindow
            handle = *GdkWindow\user_data
          EndIf


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 11:49 
Offline
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Cooles Snippet! :allright:
Ich wollte gestern schon die Linux-Version dazu posten, aber ich hab diese blöde 'gdk_window_at_pointer_'-Funktion nicht gefunden, warum auch immer.

Ich habe aber noch eine Frage. Die ganzen Funktionen wie 'PB_Object_EnumerateStart( PB_Objects )' und globale Werte wie 'PB_Gadget_Objects', sind die irgendwo dokumentiert. Ich kann zwar deren Namen aus allen PB-Libraries extrahieren, aber dann habe ich immer noch nicht die Parameter. ;)

Edit: Wäre übrigens auch hier ganz gut aufgehoben.

_________________
Ubuntu Gnome 20.04 LTS x64, PureBasic 5.72 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50, 5.60, 5.71b2)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 13:13 
Offline
Benutzeravatar

Registriert: 28.07.2005 12:39
Informationen findest du im SDK Ordner (nur Windows). Erwarte davon aber nicht zuviel ;)

NicTheQuick hat geschrieben:
Ich kann zwar deren Namen aus allen PB-Libraries extrahieren, aber dann habe ich immer noch nicht die Parameter. ;)


Wie machst du das unter Linux, mit dumpdings?

_________________
Suche


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 14:53 
Offline
Benutzeravatar

Registriert: 25.01.2005 12:19
Die letzte PureBasic-Version für Linux, die im Order /sdk/c/include die Header-Dateien für alle möglichen PB-Module (u.a. Gadget und Object) enthielt, war 4.20... :roll:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 19:38 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Danke an allen für die Hilfe,

habe den Code jetzt für alle OS aktualisiert.

Läuft leider unter MacOS (x86) nicht als Modul. Denke aber das es sich um ein Bug in der 32bit Version für Mac liegt.

Alles Gute
Michael :allright:

P.S.
Zitat:
Die letzte PureBasic-Version für Linux, die im Order /sdk/c/include die Header-Dateien für alle möglichen PB-Module (u.a. Gadget und Object) enthielt, war 4.20


Fred hat angekündigt die SDK in der nächsten Release auch for Mac und Linux zu aktualisieren

http://www.purebasic.fr/english/viewtop ... 12&t=55344

_________________
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul / OPC-Helper DLL
PB v3.30 / v5.7x - OS Mac Mini OSX 10.xx / Window 10 Pro. (X64) /Window 7 Pro. (X64) / Window XP Pro. (X86) / Ubuntu 14.04
Downloads auf My Webspace


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 19:48 
Offline
Benutzeravatar

Registriert: 08.09.2004 00:57
Wohnort: Berlin
:allright:
Sehr brauchbar!

_________________
PureBasic 5.71 | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 19.3 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 28.07.2015 19:53 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
Vielen Dank für das Modul!

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 26 Beiträge ]  Gehe zu Seite 1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 19 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye