with "# PB_Event_Gadget" and "EventGadget ()" should do some

Just starting out? Need help? Post your questions and find answers here.
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

with "# PB_Event_Gadget" and "EventGadget ()" should do some

Post by mestnyi »

Not working properly, because "gadget event" can not be only when you release the mouse button, and it should be and when you hover and when leaving and when you move. I suggest so that "# PB_Event_Gadget" happened when you hover over the gadget constantly, and "EventGadget ()" returns the identifier of the gadget. A "EventType ()" with events happening appropriately. I would have helped in this, if loose. But the situation at the moment is very sad.
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by netmaestro »

Only one gadget natively supports those events, the CanvasGadget. You can use API to achieve it with other gadget types if you need that.
BERESHEIT
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by mestnyi »

I understand that, if you do not want to improve procedures for what sense they create can immediately use the api and then where ease of programming is constantly the same writing still look like it will work in Linux in general, if it is not necessary that nicks do?
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by netmaestro »

You're right.
BERESHEIT
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by mestnyi »

I suggest something like this

Code: Select all

#DesignerForm = 0
#Form =1

Procedure EventMouse()
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Click = Abs(GetAsyncKeyState_(#VK_LBUTTON) + GetAsyncKeyState_(#VK_RBUTTON)*4 + GetAsyncKeyState_(#VK_MBUTTON)*2)/$8000   
  CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
    Protected *Window.GTKWindow = WindowID(Window)
    Protected gdkWnd.l = *Window\bin\child\window
    Protected  x.l, y.l, mask.l
    gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
    Click = Abs(mask)/$100 
  CompilerElse
    ProcedureReturn 0
  CompilerEndIf    
 Static lClick,rClick,mClick,OutClick =-1
  If Click=0
   If lClick ;lUp
    lClick=#False 
     OutClick = 65541  ;#PB_EventType_LeftButtonUp
   Else
     ;OutClick = 65539
   EndIf
   
   If rClick ;rUp
    rClick=#False 
      OutClick = 65543 ;#PB_EventType_RightButtonUp
   Else
     ;OutClick = 65539
   EndIf
   
   If mClick ;mUp
    mClick=#False 
     OutClick = 65545  ;#PB_EventType_MiddleButtonUp
   Else
     ;OutClick = 65539
   EndIf
   
    ;ProcedureReturn 65539
  ElseIf Click= 1  
   If lClick <>1;Down
    lClick=#True 
     OutClick = 65540   ;#PB_EventType_LeftButtonDown
    EndIf
     If lClick ;Move
      ;ProcedureReturn 65539
     EndIf
    
  ElseIf Click= 4  
   If rClick <>1;Down
    rClick=#True 
     OutClick = 65542   ;#PB_EventType_RightButtonDown
    EndIf
     If rClick ;Move
      ;ProcedureReturn 65539
     EndIf
  
  ElseIf Click= 2  
   If mClick <>1;Down
    mClick=#True 
     OutClick = 65544   ;#PB_EventType_MiddleButtonDown
    EndIf
     If mClick ;Move
      ;ProcedureReturn 65539
     EndIf
  EndIf  
 ProcedureReturn OutClick 
EndProcedure

Procedure  OnTheGadgetOne(Gadget)
 Static xx,yy,ww,hh,OldGadget =-1
 Protected mx = DesktopMouseX()
 Protected my = DesktopMouseY()
  
 If IsGadget(Gadget)
  Protected x=GadgetX(Gadget,#PB_Gadget_ScreenCoordinate)
  Protected y=GadgetY(Gadget,#PB_Gadget_ScreenCoordinate)
  Protected w=GadgetWidth(Gadget)
  Protected h=GadgetHeight(Gadget)
 EndIf
 
 If mx > x And mx < (x+w) And my > y And my < (y+h) And Gadget <> OldGadget 
  OldGadget = Gadget 
  xx=GadgetX(OldGadget,#PB_Gadget_ScreenCoordinate)
  yy=GadgetY(OldGadget,#PB_Gadget_ScreenCoordinate)
  ww=GadgetWidth(OldGadget)
  hh=GadgetHeight(OldGadget)
  ProcedureReturn #True
 Else
 If mx < xx Or mx > (xx+ww) Or my < yy Or my > (yy+hh)
   OldGadget= -1
 EndIf 
EndIf
EndProcedure

Procedure OnTheGadget(Gadget)
  Protected mx = DesktopMouseX()
  Protected my = DesktopMouseY()
 
 If IsGadget(Gadget)
  Protected x=GadgetX(Gadget,#PB_Gadget_ScreenCoordinate)
  Protected y=GadgetY(Gadget,#PB_Gadget_ScreenCoordinate)
  Protected w=GadgetWidth(Gadget)
  Protected h=GadgetHeight(Gadget)
 EndIf
 
 If mx >= x And mx < (x+w) And my >= y And my < (y+h)
;If (((Not mx<x) & (Not my<y)) &(Not mx>=(x+w)) & (Not my>=(y+h)))
   ProcedureReturn #True
 EndIf
EndProcedure

Procedure  GetUnderTheCursorGadget()
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
   Protected Click = 1;Abs(GetAsyncKeyState_(#VK_LBUTTON))/$8000   
   
   
   Protected GethWnd,hWnd,cursorpos.q
   If  Click :GetCursorPos_(@cursorpos)
   hWnd=WindowFromPoint_ (cursorpos)
    ScreenToClient_ (hWnd, @cursorpos) 
    ChildWindowFromPoint_ (hWnd, cursorpos)
   If GetDlgCtrlID_(hWnd)=-1 
    GethWnd=GetParent_(hWnd) 
   Else 
    GethWnd=hWnd
  EndIf
  
   If GetProp_(GethWnd,"PB_WindowID")-1 =-1 
    ; 
    ;---------------------------------- 
   If  IsGadget(GetDlgCtrlID_(GetParent_(GethWnd))) And  GethWnd<>GadgetID(GetProp_(GethWnd,"PB_ID"))
      ProcedureReturn GetProp_(GetParent_(GethWnd),"PB_ID")
    EndIf
    ;----------------------------------
    ProcedureReturn GetProp_(GethWnd,"PB_ID")
   Else  
    ProcedureReturn -1
   EndIf  
   ProcedureReturn -1
  Else  
   ProcedureReturn -1
  EndIf
  CompilerElse  
    ProcedureReturn EventGadget()
  CompilerEndIf
   
EndProcedure
Macro EventGadget()
 GetUnderTheCursorGadget()
EndMacro
      

Macro EventType()
  EventMouse()
EndMacro  

Procedure _WaitWindowEvent()
 If EventGadget()<>-1  
  ProcedureReturn #PB_Event_Gadget
Else
  ProcedureReturn WaitWindowEvent()
EndIf
EndProcedure

Macro WaitWindowEvent()
 _WaitWindowEvent()
EndMacro  

OpenWindow(#DesignerForm, 0, 0, 800, 600, "Designer",#PB_Window_ScreenCentered |  #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget);#WS_EX_COMPOSITED |
OpenWindow(#Form, WindowY(#DesignerForm),WindowX(#DesignerForm), 600, 480, "Test", #PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget, WindowID(#DesignerForm));| #WS_CHILD|#WS_POPUP
 ButtonGadget(3, 15, 75, 200, 125, "ButtonGadget")
 ButtonGadget(8, 65, 100, 200, 125, "ButtonGadget")
 
 HideWindow(#DesignerForm,0) 
 HideWindow(#Form,0)
 
 
 Repeat
   Event = WaitWindowEvent()
  ;Debug EventGadget()
  ;If EventMouse()= #PB_EventType_MouseMove            ;65539
  ;  Debug "Move"
  ;ElseIf EventMouse()= #PB_EventType_LeftButtonDown   ;65540
  ;  Debug "lDown"  
  ;ElseIf EventMouse()= #PB_EventType_LeftButtonUp     ;65541
  ;  Debug "lUp"
  ;ElseIf EventMouse()= #PB_EventType_RightButtonDown  ;65542
  ;  Debug "rDown"  
  ;ElseIf EventMouse()= #PB_EventType_RightButtonUp    ;65543
  ;  Debug "rUp"
  ;ElseIf EventMouse()= #PB_EventType_MiddleButtonDown ;65544
  ;  Debug "mDown"  
  ;ElseIf EventMouse()= #PB_EventType_MiddleButtonUp   ;65545
  ;  Debug "mUp"
  ;EndIf  
  
  If Event=#PB_Event_LeftClick 
    
   ; If EventGadget()=3
       Debug "fd"
   ;EndIf  
  EndIf  
  
  If Event=#PB_Event_Gadget And EventType()=#PB_EventType_LeftButtonDown
    
   ; If EventGadget()=3
       Debug Str(EventGadget())+ "  dn"
   ;EndIf  
  EndIf
  
  If Event=#PB_Event_Gadget And EventType()=#PB_EventType_LeftButtonUp
    
   ; If EventGadget()=3
       Debug Str(EventGadget())+ "  up"
   ;EndIf  
  EndIf  
  
  
  
 Until Event= #PB_Event_CloseWindow
User avatar
Fangbeast
PureBasic Protozoa
PureBasic Protozoa
Posts: 4792
Joined: Fri Apr 25, 2003 3:08 pm
Location: Not Sydney!!! (Bad water, no goats)

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by Fangbeast »

Or, we could just use Netmaestro's lovely mousehover library :):)

I think that's what it was called. Makes it real easy to do what you asked above.
Amateur Radio/VK3HAF, (D-STAR/DMR and more), Arduino, ESP32, Coding, Crochet
User avatar
netmaestro
PureBasic Bullfrog
PureBasic Bullfrog
Posts: 8452
Joined: Wed Jul 06, 2005 5:42 am
Location: Fort Nelson, BC, Canada

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by netmaestro »

Ha, I'd actually forgotten about it! It's here: http://www.purebasic.fr/english/viewtop ... 14&t=23294
BERESHEIT
User avatar
blueb
Addict
Addict
Posts: 1118
Joined: Sat Apr 26, 2003 2:15 pm
Location: Cuernavaca, Mexico

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by blueb »

Hi Nettie...

Just ran a quick test with 5.21 LTS (x86)

I'm getting a POLINK error on..

Code: Select all

Import ""
  PB_Gadget_SendGadgetCommand(hwnd, EventType)
EndImport
- It was too lonely at the top.

System : PB 6.21(x64) and Win 11 Pro (x64)
Hardware: AMD Ryzen 9 5900X w/64 gigs Ram, AMD RX 6950 XT Graphics w/16gigs Mem
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by mestnyi »

Code: Select all

PB_Gadget_SendGadgetCommand(hwnd, EventType)
This is where the thing about where such things can be read?
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by mestnyi »

Here's something that happened :D

Code: Select all

#DesignerForm = 0
#Form =1

Import ""
  PB_Gadget_SendGadgetCommand(hWnd, EventType)
EndImport

Procedure EventMouse(id=-1)
 #PB_EventType_MouseDownMove=65539 +100
 CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    Click = Abs(GetAsyncKeyState_(#VK_LBUTTON) + GetAsyncKeyState_(#VK_RBUTTON)*4 + GetAsyncKeyState_(#VK_MBUTTON)*2)/$8000   
  CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
    Protected *Window.GTKWindow = WindowID(Window)
    Protected gdkWnd.l = *Window\bin\child\window
    Protected  x.l, y.l, mask.l
    gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
    Click = Abs(mask)/$100 
  CompilerElse
    ProcedureReturn 0
  CompilerEndIf    
 Static OldhWnd=-1,lClick,rClick,mClick,dmx,dmy,mx,my,OutClick =-1
 
 If id <>-1 And IsGadget(id)
  hWnd=GadgetID(Id)
 EndIf  
 
 If Click=0
   If lClick :lClick=#False ;lUp
    PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_LeftButtonUp)
   EndIf
   
   If rClick :rClick=#False ;rUp
    PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_RightButtonUp)
   EndIf
   
   If mClick :mClick=#False ;mUp
    PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MiddleButtonUp)
   EndIf
   
    If hWnd
      If OldhWnd <> hWnd
       If OldhWnd
            PB_Gadget_SendGadgetCommand(OldhWnd, #PB_EventType_MouseLeave)
          EndIf
          OldhWnd = hWnd
          PB_Gadget_SendGadgetCommand(OldhWnd, #PB_EventType_MouseEnter)
        EndIf
      Else
       If OldhWnd
          PB_Gadget_SendGadgetCommand(OldhWnd, #PB_EventType_MouseLeave)
          OldhWnd = #False
        EndIf
      EndIf
   
   
  If mx<>DesktopMouseX() Or my<>DesktopMouseY() 
    mx=DesktopMouseX()
    my=DesktopMouseY()
    PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MouseMove)
   EndIf
   
  ElseIf Click= 1  
   If lClick <>1 :lClick=#True ;Down
    PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_LeftButtonDown)
    EndIf
    
  ElseIf Click= 4  
   If rClick <>1 :rClick=#True ;Down
     PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_RightButtonDown)
    EndIf
    
  ElseIf Click= 2  
   If mClick <>1 :mClick=#True ;Down
     PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MiddleButtonDown)
    EndIf
    
  EndIf 
   
   If lClick Or rClick Or mClick 
    If dmx<>DesktopMouseX() Or dmy<>DesktopMouseY() 
     dmx=DesktopMouseX()
     dmy=DesktopMouseY()
     PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MouseDownMove)
    EndIf
   EndIf
EndProcedure

Procedure  GetUnderTheCursorGadget()
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    
    Protected Click = 1;Abs(GetAsyncKeyState_(#VK_LBUTTON))/$8000   
   
   
   Protected GethWnd,hWnd,cursorpos.q
   If  Click :GetCursorPos_(@cursorpos)
   hWnd=WindowFromPoint_ (cursorpos)
    ScreenToClient_ (hWnd, @cursorpos) 
    ChildWindowFromPoint_ (hWnd, cursorpos)
   If GetDlgCtrlID_(hWnd)=-1 
    GethWnd=GetParent_(hWnd) 
   Else 
    GethWnd=hWnd
  EndIf
     
   If GetProp_(GethWnd,"PB_WindowID")-1 =-1 
    ; 
    ;---------------------------------- 
   If  IsGadget(GetDlgCtrlID_(GetParent_(GethWnd))) And  GethWnd<>GadgetID(GetProp_(GethWnd,"PB_ID"))
      ProcedureReturn GetProp_(GetParent_(GethWnd),"PB_ID")
    EndIf
    ;----------------------------------
    
    ProcedureReturn GetProp_(GethWnd,"PB_ID")
   Else  
    ProcedureReturn -1
   EndIf  
   ProcedureReturn -1
  Else  
   ProcedureReturn -1
  EndIf
  CompilerElse  
    ProcedureReturn EventGadget()
  CompilerEndIf
   
EndProcedure


OpenWindow(#DesignerForm, 0, 0, 800, 600, "Designer",#PB_Window_ScreenCentered |  #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget);#WS_EX_COMPOSITED |
OpenWindow(#Form, WindowY(#DesignerForm),WindowX(#DesignerForm), 600, 480, "Test", #PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget, WindowID(#DesignerForm));| #WS_CHILD|#WS_POPUP
 ButtonGadget(3, 15, 75, 200, 125, "ButtonGadget")
 ButtonGadget(8, 65, 100, 200, 125, "ButtonGadget")
 
 HideWindow(#DesignerForm,0) 
 HideWindow(#Form,0)
    
    
 
 Repeat
  Event = WaitWindowEvent()
   
  EventMouse(GetUnderTheCursorGadget())
  
 If Event = #PB_Event_Gadget And EventGadget()
  If  EventType()= #PB_EventType_MouseMove Or EventType()= #PB_EventType_MouseDownMove 
    Debug "Move  " +Str(EventGadget())
  ElseIf EventType()= #PB_EventType_MouseEnter   ;655
    Debug "Enter  " +Str(EventGadget())  
  ElseIf EventType()= #PB_EventType_MouseLeave     ;655
    Debug "Leave  " +Str(EventGadget())
  ElseIf EventType()= #PB_EventType_LeftButtonDown   ;65540
    Debug "lDown  " +Str(EventGadget())  
  ElseIf EventType()= #PB_EventType_LeftButtonUp     ;65541
    Debug "lUp  " +Str(EventGadget())
  ElseIf EventType()= #PB_EventType_RightButtonDown  ;65542
    Debug "rDown  " +Str(EventGadget())  
  ElseIf EventType()= #PB_EventType_RightButtonUp    ;65543
    Debug "rUp  " +Str(EventGadget())
  ElseIf EventType()= #PB_EventType_MiddleButtonDown ;65544
    Debug "mDown  " +Str(EventGadget())  
  ElseIf EventType()= #PB_EventType_MiddleButtonUp   ;65545
    Debug "mUp  " +Str(EventGadget())
  EndIf  
 EndIf 
Add two more events MouseEnter and MouseLeave
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by mestnyi »

A little bit refined, you can now specify one gadget :D

Code: Select all

    #DesignerForm = 0
    #Form =1

    Import ""
      PB_Gadget_SendGadgetCommand(hWnd, EventType)
    EndImport

    Procedure EventMouse(Gadget=-1)
     #PB_EventType_MouseDownMove=65539 +100
     CompilerIf #PB_Compiler_OS = #PB_OS_Windows
        Click = Abs(GetAsyncKeyState_(#VK_LBUTTON) + GetAsyncKeyState_(#VK_RBUTTON)*4 + GetAsyncKeyState_(#VK_MBUTTON)*2)/$8000   
      CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
        Protected *Window.GTKWindow = WindowID(Window)
        Protected gdkWnd.l = *Window\bin\child\window
        Protected  x.l, y.l, mask.l
        gdk_window_get_pointer_(gdkWnd, @x, @y, @mask)
        Click = Abs(mask)/$100
      CompilerElse
        ProcedureReturn #False
      CompilerEndIf   
     Static OldhWnd,lClick,rClick,mClick,dmx,dmy,mmx,mmy,OldGadget
     
     If Gadget <>-1 And IsGadget(Gadget)
     If IsGadget(Gadget)
      Protected mx = DesktopMouseX()
      Protected my = DesktopMouseY()
      Protected x=GadgetX(Gadget,#PB_Gadget_ScreenCoordinate)
      Protected y=GadgetY(Gadget,#PB_Gadget_ScreenCoordinate)
      Protected w=GadgetWidth(Gadget)
      Protected h=GadgetHeight(Gadget)
     EndIf
     If mx >= x And mx < (x+w) And my >= y And my < (y+h)
       hWnd=GadgetID(Gadget)
       If OldGadget<>Gadget
         PB_Gadget_SendGadgetCommand(GadgetID(Gadget), #PB_EventType_MouseEnter)
         OldGadget=Gadget
       EndIf  
     Else
       If OldGadget=Gadget
         PB_Gadget_SendGadgetCommand(GadgetID(Gadget), #PB_EventType_MouseLeave)
         OldGadget=#False
       EndIf  
      ProcedureReturn #False
     EndIf
    EndIf 
    
    OldGadget=Gadget
       
     If Click=0
       If lClick :lClick=#False ;lUp
        PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_LeftButtonUp)
       EndIf
       
       If rClick :rClick=#False ;rUp
        PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_RightButtonUp)
       EndIf
       
       If mClick :mClick=#False ;mUp
        PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MiddleButtonUp)
       EndIf
       
       
       If hWnd
       If OldhWnd <> hWnd
        OldhWnd = hWnd
       EndIf
      Else
       If OldhWnd
         PB_Gadget_SendGadgetCommand(OldhWnd, #PB_EventType_MouseLeave)
         OldhWnd = #False
       EndIf
      EndIf
   
       
      If mmx<>DesktopMouseX() Or mmy<>DesktopMouseY()
        mmx=DesktopMouseX()
        mmy=DesktopMouseY()
        PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MouseMove)
       EndIf
       
      ElseIf Click= 1 
       If lClick <>1 :lClick=#True ;Down
        PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_LeftButtonDown)
        EndIf
       
      ElseIf Click= 4 
       If rClick <>1 :rClick=#True ;Down
         PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_RightButtonDown)
        EndIf
       
      ElseIf Click= 2 
       If mClick <>1 :mClick=#True ;Down
         PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MiddleButtonDown)
        EndIf
       
      EndIf
       
     If lClick Or rClick Or mClick
        If dmx<>DesktopMouseX() Or dmy<>DesktopMouseY()
         dmx=DesktopMouseX()
         dmy=DesktopMouseY()
         PB_Gadget_SendGadgetCommand(hWnd, #PB_EventType_MouseDownMove)
        EndIf
       EndIf
 EndProcedure

    Procedure  GetUnderTheCursorGadget()
      CompilerIf #PB_Compiler_OS = #PB_OS_Windows
       
        Protected Click = 1;Abs(GetAsyncKeyState_(#VK_LBUTTON))/$8000   
       
       
       Protected GethWnd,hWnd,cursorpos.q
       If  Click :GetCursorPos_(@cursorpos)
       hWnd=WindowFromPoint_ (cursorpos)
        ScreenToClient_ (hWnd, @cursorpos)
        ChildWindowFromPoint_ (hWnd, cursorpos)
       If GetDlgCtrlID_(hWnd)=-1
        GethWnd=GetParent_(hWnd)
       Else
        GethWnd=hWnd
      EndIf
         
       If GetProp_(GethWnd,"PB_WindowID")-1 =-1
        ;
        ;----------------------------------
       If  IsGadget(GetDlgCtrlID_(GetParent_(GethWnd))) And  GethWnd<>GadgetID(GetProp_(GethWnd,"PB_ID"))
          ProcedureReturn GetProp_(GetParent_(GethWnd),"PB_ID")
        EndIf
        ;----------------------------------
       
        ProcedureReturn GetProp_(GethWnd,"PB_ID")
       Else 
        ProcedureReturn -1
       EndIf 
       ProcedureReturn -1
      Else 
       ProcedureReturn -1
      EndIf
      CompilerElse 
        ProcedureReturn EventGadget()
      CompilerEndIf
       
    EndProcedure


    OpenWindow(#DesignerForm, 0, 0, 800, 600, "Designer",#PB_Window_ScreenCentered |  #PB_Window_Invisible | #PB_Window_SystemMenu | #PB_Window_SizeGadget);#WS_EX_COMPOSITED |
    OpenWindow(#Form, WindowY(#DesignerForm),WindowX(#DesignerForm), 600, 480, "Test", #PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget, WindowID(#DesignerForm));| #WS_CHILD|#WS_POPUP
     ButtonGadget(3, 15, 75, 200, 125, "ButtonGadget")
     ButtonGadget(8, 65, 200, 200, 125, "ButtonGadget")
     
     HideWindow(#DesignerForm,0)
     HideWindow(#Form,0)
       
       
     
     Repeat
      Event = WaitWindowEvent()
       
      EventMouse(3)
      EventMouse(8)
     
     If Event = #PB_Event_Gadget And EventGadget()
      If  EventType()= #PB_EventType_MouseMove Or EventType()= #PB_EventType_MouseDownMove
        ;Debug "Move  " +Str(EventGadget())
      ElseIf EventType()= #PB_EventType_MouseEnter   ;655
        Debug "Enter  " +Str(EventGadget()) 
      ElseIf EventType()= #PB_EventType_MouseLeave     ;655
        Debug "Leave  " +Str(EventGadget())
      ElseIf EventType()= #PB_EventType_LeftButtonDown   ;65540
        Debug "lDown  " +Str(EventGadget()) 
      ElseIf EventType()= #PB_EventType_LeftButtonUp     ;65541
        Debug "lUp  " +Str(EventGadget())
      ElseIf EventType()= #PB_EventType_RightButtonDown  ;65542
        Debug "rDown  " +Str(EventGadget()) 
      ElseIf EventType()= #PB_EventType_RightButtonUp    ;65543
        Debug "rUp  " +Str(EventGadget())
      ElseIf EventType()= #PB_EventType_MiddleButtonDown ;65544
        Debug "mDown  " +Str(EventGadget()) 
      ElseIf EventType()= #PB_EventType_MiddleButtonUp   ;65545
        Debug "mUp  " +Str(EventGadget())
      EndIf 
    EndIf 
    
  Until Event = #PB_Event_CloseWindow
  
and yet this help where information about it? :cry:

Code: Select all

Import ""
  PB_Gadget_SendGadgetCommand(hwnd, EventType)
EndImport
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by mestnyi »

GetUnderTheCursorGadget() For Linux is possible to write, and if so then where drip?
mestnyi
Addict
Addict
Posts: 1102
Joined: Mon Nov 25, 2013 6:41 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by mestnyi »

Why is this happening that is at loss of focus stringgadget event returns 256, 512

Code: Select all

Enumeration Gadget ;- Gadget
  #Form_0_Button_1
  #Form_0_String_1
EndEnumeration

OpenWindow( #PB_Any, 33, 55, 333, 222, "Form_0", #PB_Window_SystemMenu)
   ButtonGadget(#Form_0_Button_1, 6, 42, 97, 31,"ButtonGadget")
    StringGadget(#Form_0_String_1, 6, 6, 97, 31,"StringGadget")
 

 While  Event ! #PB_Event_CloseWindow
      Event = WaitWindowEvent( )
      If Event = #PB_Event_Gadget
        Select EventGadget( )
          Case #Form_0_Button_1
            If EventType() = #PB_EventType_LeftClick
              Debug "#Form_0_Button1 - #PB_EventType_LeftClick"
            EndIf
            
          Case #Form_0_String_1
            If EventType() = #PB_EventType_Focus
              Debug "#Form_0_String2 - #PB_EventType_Focus"
            ElseIf EventType() = #PB_EventType_LostFocus
              Debug "#Form_0_String2 - #PB_EventType_LostFocus"
            ElseIf EventType() = #PB_EventType_Change
              Debug "#Form_0_String2 - #PB_EventType_Change"
            Else
              Debug "Why "+EventType()
            EndIf
            
        EndSelect
      EndIf
   Wend

  
User avatar
Danilo
Addict
Addict
Posts: 3036
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by Danilo »

Just ignore all non-PB-events within the main event loop. Windows sends hundreds of different messages for everything,
and it's seemingly not easy to block all of them.

Anyway, for your information:

Code: Select all

512 = #EN_KILLFOCUS
256 = #EN_SETFOCUS
User avatar
Bisonte
Addict
Addict
Posts: 1320
Joined: Tue Oct 09, 2007 2:15 am

Re: with "# PB_Event_Gadget" and "EventGadget ()" should do

Post by Bisonte »

A simple method to add two events to any gadget crossplatform (thread)

Code: Select all

;: MouseEnter and MouseLeave
;: Example for all Gadgets crossplatform

DeclareModule xTraEvents
  
  Declare RegisterGadget(Window, Gadget)
  
EndDeclareModule
Module xTraEvents
  
  EnableExplicit
  
  Structure struct_xtra
    Thread.i
    Window.i
    List Gadget.i()
  EndStructure
  
  Global Mutex = CreateMutex()
  
  Procedure wThread(*p.struct_xtra)
    
    Protected OldGadget = -1
    Protected NewGadget = -1
    Protected mx, my
    
    If Not *p : ProcedureReturn #False : EndIf
    
    Repeat
      
      ;: Check Windows or free all
      If Not IsWindow(*p\Window)
        FreeList(*p\Gadget())
        FreeStructure(*p)
        ProcedureReturn #False
      EndIf
      ;: Get Mouse Position
      mx = WindowMouseX(*p\Window) : my = WindowMouseY(*p\Window)
      ;: Set Variables
      NewGadget = -1
      
      ;: Check if mouse is over a gadget
      ForEach *p\Gadget()
        
        If IsGadget(*p\Gadget()) ; Check Gadget
          If mx => GadgetX(*p\Gadget()) And mx <= (GadgetX(*p\Gadget()) + GadgetWidth(*p\Gadget()))
            If my => GadgetY(*p\Gadget()) And my <= (GadgetY(*p\Gadget()) + GadgetHeight(*p\Gadget()))  
              NewGadget = *p\Gadget()
              Break ; Leave loop if mouse is in a gadget that is registered
            EndIf
          EndIf        
        Else ; Or delete it
          LockMutex(Mutex)
          DeleteElement(*p\Gadget(), 1)
          UnlockMutex(Mutex)
        EndIf
        
      Next
      
      ;: Check wich gadget is entering and leaving and send a message to the window
      If NewGadget = -1
        If OldGadget <> NewGadget
          PostEvent(#PB_Event_Gadget, *p\Window, OldGadget, #PB_EventType_MouseLeave)
          OldGadget = NewGadget  
        EndIf
      Else
        If OldGadget <> NewGadget
          If IsGadget(OldGadget)
            PostEvent(#PB_Event_Gadget, *p\Window, OldGadget, #PB_EventType_MouseLeave)
          EndIf
          OldGadget = NewGadget
          PostEvent(#PB_Event_Gadget, *p\Window, NewGadget, #PB_EventType_MouseEnter)
        EndIf
      EndIf
      
      Delay(1) ; No barbecue
    ForEver
    
  EndProcedure
  
  Procedure RegisterGadget(Window, Gadget)
    
    Protected *p.struct_xtra
    
    If Not IsGadget(Gadget) : ProcedureReturn #False : EndIf
    
    If IsWindow(Window)
      *p = GetWindowData(Window)
      If Not *p
        *p = AllocateStructure(struct_xtra)
        SetWindowData(Window, *p)  
      EndIf
      If Not *p : ProcedureReturn #False : EndIf
      *p\Window = Window
      LockMutex(Mutex)
      AddElement(*p\Gadget())
      *p\Gadget() = Gadget
      UnlockMutex(Mutex)
      If Not *p\Thread
        *p\Thread = CreateThread(@wThread(), *p)
      EndIf
    Else
      ProcedureReturn #False
    EndIf
    
    ProcedureReturn #True
    
  EndProcedure  
  
EndModule

CompilerIf #PB_Compiler_IsMainFile
  
  UseModule xTraEvents
  
  OpenWindow(0, 0, 0, 640, 480, "", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  ImageGadget(1, 10, 10, 200, 200, 0, #PB_Image_Border)
  ImageGadget(2, 210, 10, 200, 200, 0, #PB_Image_Border)
  RegisterGadget(0,1)
  RegisterGadget(0,2)
  Repeat
    
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_CloseWindow
      quit = #True
    EndIf
    
    If Event = #PB_Event_Gadget
      Select EventGadget()
        Case 1
          If EventType() = #PB_EventType_MouseEnter
            Debug "Enter1"
          EndIf
          If EventType() = #PB_EventType_MouseLeave
            Debug "Leave1"
          EndIf
        Case 2
          If EventType() = #PB_EventType_MouseEnter
            Debug "Enter2"
          EndIf
          If EventType() = #PB_EventType_MouseLeave
            Debug "Leave2"
          EndIf          
      EndSelect
      
    EndIf
    
  Until quit
CompilerEndIf
I hope, i've done all right ...

Edit: Correcting typo
PureBasic 6.21 (Windows x64) | Windows 11 Pro | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
English is not my native language... (I often use DeepL.)
Post Reply