Aktuelle Zeit: 29.10.2020 10:28

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




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

Registriert: 25.01.2005 12:19
Du hast in Dein Modul für Linux die Ermittlung von desktop_x und desktop_y eingebaut:
Code:
          desktop_x = DesktopMouseX()
          desktop_y = DesktopMouseY()
          *GdkWindow.GdkWindowObject = gdk_window_at_pointer_(@desktop_x,@desktop_y)
Dies ist unnötig, weil gdk_window_at_pointer() die beiden Variablen desktop_x und desktop_y sowieso überschreibt, was ich in meinem Code-Beispiel auch berücksichtigt habe. Die GDK2-Dokumentation dazu ist eindeutig:
GDK2 Reference Manual hat geschrieben:
gdk_window_at_pointer ()

GdkWindow *
gdk_window_at_pointer (gint *win_x, gint *win_y)

Obtains the window underneath the mouse pointer, returning the location of that window in win_x , win_y.


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

Registriert: 24.11.2004 13:12
Wohnort: Germany
@Shardik

Danke :wink:
Hab ich gleich korrigiert.

Werde noch ein Bugreport wegen der OSX (x86) Version schreiben.

_________________
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: 10.10.2015 23:10 
Offline

Registriert: 25.02.2014 22:00
"FrameGadget" es wird nicht definiert,
Code:
;- Example 1

CompilerIf #PB_Compiler_IsMainFile
 
  Enumeration FormWindow
    #Window_0
  EndEnumeration
 
  Enumeration FormGadget
    #Frame_1 = 5
    #Button_1
  EndEnumeration
 
 
  Procedure OpenWindow_0(x = 0, y = 0, width = 610, height = 400)
    OpenWindow(#Window_0, x, y, width, height, "MouseOver Events", #PB_Window_SystemMenu)
    FrameGadget(#Frame_1, 50, 50, 140, 140, "FrameGadget")
    ButtonGadget(#Button_1, 250, 50, 140, 140, "ButtonGadget")
  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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 11.10.2015 12:07 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Ist wohl von der OS abhängig ob das Objekt ein Handle liefert.
Bei Windows XP kommt nichts und bei Mac OS im Titel vom Frame.

In dem Zuge habe ich noch ein Bug beim "Init" mit der WindowsID gefunden. Ist wohl niemand aufgefallen.
Update im ersten Beitrag...

_________________
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: 12.10.2015 05:43 
Offline

Registriert: 25.02.2014 22:00
Zitat:
Bug beim "Init"

PB_Gadget_Objects.i - dieses
PB_Window_Objects.i - stattdessen?
Ich habe gesehen. :D
und, was ist interessant, unter dem Cursor Frame Gadget sehen?
In Windows Textgadget erfordert flag '# SS_NOTIFI ", um das Click-Ereignis zu definieren
  Es muss eine Flagge, um Linux zu Frame Gadget unter dem Cursor festzustellen,


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 03.02.2016 11:06 
Offline

Registriert: 28.02.2010 14:13
Funktioniert mit PureBasic 5.42b1 unter GTK3 nicht mehr.
Da findet er wieder nur Gadget 1.

Mit GTK2 funktioniert es bestens.
Xubuntu 15.10 x64

_________________
Manjaro x64 * Windows 10 x64 * PureBasic 5.50
planet-RK


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

Registriert: 25.03.2013 09:59
Hallo cptdark.

Ab PB 5.40 ist in *GdkWindow.GdkWindowObject\user_data das GtkWindow nicht mehr bzw. falsch enthalten.
Versuche mal die Zeile
Code:
handle = *GdkWindow\user_data
mit folgender Zeile zu ersetzen:
Code:
gdk_window_get_user_data_(*GdkWindow, @handle)

Gruß Charly

_________________
PureBasic Linux-API-Library: http://www.chabba.de


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

Registriert: 28.02.2010 14:13
Dankeschön. Funktioniert so.
GTK2 und GTK3

:allright:

_________________
Manjaro x64 * Windows 10 x64 * PureBasic 5.50
planet-RK


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Modul MouseOver
BeitragVerfasst: 03.02.2016 21:49 
Offline
Benutzeravatar

Registriert: 24.11.2004 13:12
Wohnort: Germany
Update v1.05
- Bugfix Linux GTK3

Erledigt :wink:

_________________
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: 25.03.2016 20:03 
Offline
Benutzeravatar

Registriert: 27.01.2016 11:08
Wohnort: BY
Eine kurze Frage:

Welche Funktion erfüllt die folgende Zeile in der Init-Routine..?
Code:
If PB_Object_EnumerateNext(PB_Window_Objects, @window)


Da ich mehrere Fenster nutze und auch die Info erhalten möchte wo das Event aufgetreten ist,
habe ich den Code etwas umgeschrieben. Er läuft auch soweit. Jedoch habe ich diesen undokumentierten
Befehlen etwas Bauchweh.. /:->

Code:
DeclareModule MouseOver
  Declare Init(window.l, timer=999)
  Declare Release(timer=999)
EndDeclareModule

;=============================================================================

Module MouseOver
 
  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
    Global lastgadget = -1
 
;=============================================================================
 
  Procedure EventHandler()
   
    Static lasthandle, 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, window_for_timer, 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, window_for_timer, gadget, #PB_EventType_MouseEnter)
            EndIf
            PB_Object_EnumerateAbort(PB_Gadget_Objects)
            Break
          EndIf
        Wend
        lasthandle = handle
      EndIf
    EndIf
   
  EndProcedure
 
 
  Procedure Init(window.l, timer=999)
    ;Protected window
    Release(timer)
    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
      lastgadget = -1
    EndIf
  EndProcedure
 
EndModule


Ich rufe nun in dem aktuellem Fenster jeweils die Init auf und kann somit über die Eventstruktur das Ereignis genau zuordnen.

=> Handle ich mir damit ggf. Probleme ein? :roll:

_________________
Never change a running system - Never run a changed system!
(PB 5.62 [x86] und PB 5.71 [x86])


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 Vorherige  1, 2, 3  Nächste

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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