Page 1 of 2
with "# PB_Event_Gadget" and "EventGadget ()" should do some
Posted: Sun Jan 19, 2014 7:52 am
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.
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 8:14 am
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.
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 8:50 am
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?
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 8:52 am
by netmaestro
You're right.
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 9:24 am
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
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 10:01 am
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.
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 10:07 am
by netmaestro
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 1:06 pm
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
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 5:52 pm
by mestnyi
Code: Select all
PB_Gadget_SendGadgetCommand(hwnd, EventType)
This is where the thing about where such things can be read?
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Sun Jan 19, 2014 7:53 pm
by mestnyi
Here's something that happened
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
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Mon Jan 20, 2014 6:05 am
by mestnyi
A little bit refined, you can now specify one gadget
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?
Code: Select all
Import ""
PB_Gadget_SendGadgetCommand(hwnd, EventType)
EndImport
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Tue Jan 21, 2014 10:17 pm
by mestnyi
GetUnderTheCursorGadget() For Linux is possible to write, and if so then where drip?
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Tue Apr 07, 2015 6:15 pm
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
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Wed Apr 08, 2015 7:14 am
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
Re: with "# PB_Event_Gadget" and "EventGadget ()" should do
Posted: Wed Apr 08, 2015 7:34 am
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