gjrbyek ajhev
Отредактировано Webarion (13.06.2025 14:21:51)
PureBasic - форум |
Привет, Гость! Войдите или зарегистрируйтесь.
Вы здесь » PureBasic - форум » PureBasic для Windows » Правильное определение событий над ImageGadget
gjrbyek ajhev
Отредактировано Webarion (13.06.2025 14:21:51)
Procedure GadgetMouseHandler(hWnd, uMsg, wParam, lParam)
Protected stat.s, sysProc = GetProp_(hWnd, "sysProc")
Protected gadgetNo = GetProp_(hWnd, "gadgetNo")
Select uMsg
Case #WM_LBUTTONDOWN
stat = "#WM_LBUTTONDOWN " + Str(gadgetNo)
Case #WM_LBUTTONUP
stat = "#WM_LBUTTONUP " + Str(gadgetNo)
Case #WM_LBUTTONDBLCLK
stat = "#WM_LBUTTONDBLCLK " + Str(gadgetNo)
Case #WM_RBUTTONDOWN
stat = "#WM_RBUTTONDOWN " + Str(gadgetNo)
Case #WM_RBUTTONUP
stat = "#WM_RBUTTONUP " + Str(gadgetNo)
Case #WM_RBUTTONDBLCLK
stat = "#WM_RBUTTONDBLCLK " + Str(gadgetNo)
EndSelect
If IsGadget(gadgetNo) And stat
Debug stat
EndIf
ProcedureReturn CallWindowProc_(sysProc, hWnd, uMsg, wParam, lParam)
EndProcedure
Procedure SetGadgetCallback(gadgetNo)
Protected sysProc = SetWindowLongPtr_(GadgetID(gadgetNo), #GWL_WNDPROC, @GadgetMouseHandler())
SetProp_(GadgetID(gadgetNo), "gadgetNo", gadgetNo)
SetProp_(GadgetID(gadgetNo), "sysProc", sysProc)
EndProcedure
;- Enumeration
#Window = 0
Enumeration Gadgets 100
#ImgGadget1
#ImgGadget2
EndEnumeration
Enumeration Images
#Image1
#Image2
EndEnumeration
Define wFlags.i = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
OpenWindow(#Window, 0, 0, 390, 240, "ImageGadget Events", wFlags)
CreateImage(#Image2, 300, 100, 32)
StartDrawing(ImageOutput(#Image2))
Box(0,0,300,100,#Red)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(8, 5, "#ImgGadget2")
StopDrawing()
ImageGadget(#ImgGadget2, 70, 70, 0, 0, ImageID(#Image2))
SetWindowLongPtr_(GadgetID(#ImgGadget2), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#ImgGadget2), #GWL_STYLE)|#WS_CLIPSIBLINGS)
CreateImage(#Image1, 200, 200, 32)
StartDrawing(ImageOutput(#Image1))
Box(0,0, 200, 200,#Blue)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(8, 5, "#ImgGadget1")
StopDrawing()
ImageGadget(#ImgGadget1, 20, 20, 0, 0, ImageID(#Image1))
SetWindowLongPtr_(GadgetID(#ImgGadget1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#ImgGadget1), #GWL_STYLE)|#WS_CLIPSIBLINGS)
;SetGadgetCallback(#ImgGadget1)
SetGadgetCallback(#ImgGadget2)
While WaitWindowEvent() ! #PB_Event_CloseWindow : Wendhttps://www.purebasic.fr/english/viewtopic.php?t=78640
Проверь события с нажатыми Ctrl и Shift
EnableExplicit
Global hGUI
Procedure GadgetMouseHandler(hWnd, uMsg, wParam, lParam)
Protected stat.s, sysProc = GetProp_(hWnd, "sysProc")
Protected gadgetNo = GetProp_(hWnd, "gadgetNo")
Static ChangingID
Protected key.l = wParam & $FFFF ; LoWord
Protected Delta.l = wParam >> 16 ; HiWord
Protected hCurWnd, pt.POINT
Select uMsg
Case #WM_LBUTTONDOWN
stat = "#WM_LBUTTONDOWN " + Str(gadgetNo) + " " + key
Case #WM_LBUTTONUP
stat = "#WM_LBUTTONUP " + Str(gadgetNo) + " " + key
Case #WM_LBUTTONDBLCLK
stat = "#WM_LBUTTONDBLCLK " + Str(gadgetNo) + " " + key
Case #WM_RBUTTONDOWN
stat = "#WM_RBUTTONDOWN " + Str(gadgetNo) + " " + key
Case #WM_RBUTTONUP
stat = "#WM_RBUTTONUP " + Str(gadgetNo) + " " + key
Case #WM_RBUTTONDBLCLK
stat = "#WM_RBUTTONDBLCLK " + Str(gadgetNo) + " " + key
Case #WM_MOUSEWHEEL
If Delta & $8000
Delta = 1
Else
Delta = 0
EndIf
stat = "#WM_MOUSEWHEEL" + Str(gadgetNo) + " " + key + " " + Delta
; Case #WM_MOUSELEAVE
; stat = "#WM_MOUSELEAVE" + Str(gadgetNo) + " " + key + " " + Delta
Case #WM_MOUSEMOVE
GetCursorPos_(@pt.POINT)
hCurWnd=WindowFromPoint_(PeekQ(@pt))
If ChangingID <> hCurWnd
ChangingID = hCurWnd
; Debug ChangingID
Debug "Gadget "+Str(gadgetNo)+" Changing"
EndIf
EndSelect
If IsGadget(gadgetNo) And stat
Debug stat
EndIf
ProcedureReturn CallWindowProc_(sysProc, hWnd, uMsg, wParam, lParam)
EndProcedure
Procedure SetGadgetCallback(hwnd, gadgetNo)
Protected sysProc = SetWindowLongPtr_(hwnd, #GWL_WNDPROC, @GadgetMouseHandler())
; gadgetNo = GetDlgCtrlID_(hwnd)
SetProp_(hwnd, "gadgetNo", gadgetNo)
SetProp_(hwnd, "sysProc", sysProc)
EndProcedure
;- Enumeration
#Window = 0
Enumeration Gadgets 100
#ImgGadget1
#ImgGadget2
EndEnumeration
Enumeration Images
#Image1
#Image2
EndEnumeration
Define wFlags.i = #PB_Window_SystemMenu | #PB_Window_ScreenCentered
hGUI = OpenWindow(#Window, 0, 0, 390, 240, "ImageGadget Events", wFlags)
CreateImage(#Image2, 300, 100, 32)
StartDrawing(ImageOutput(#Image2))
Box(0,0,300,100,#Red)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(8, 5, "#ImgGadget2")
StopDrawing()
ImageGadget(#ImgGadget2, 70, 70, 0, 0, ImageID(#Image2))
SetWindowLongPtr_(GadgetID(#ImgGadget2), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#ImgGadget2), #GWL_STYLE)|#WS_CLIPSIBLINGS)
CreateImage(#Image1, 200, 200, 32)
StartDrawing(ImageOutput(#Image1))
Box(0,0, 200, 200,#Blue)
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(8, 5, "#ImgGadget1")
StopDrawing()
ImageGadget(#ImgGadget1, 20, 20, 0, 0, ImageID(#Image1))
SetWindowLongPtr_(GadgetID(#ImgGadget1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#ImgGadget1), #GWL_STYLE)|#WS_CLIPSIBLINGS)
;SetGadgetCallback(#ImgGadget1)
SetGadgetCallback(GadgetID(#ImgGadget1), #ImgGadget1)
SetGadgetCallback(GadgetID(#ImgGadget2), #ImgGadget2)
SetGadgetCallback(hGUI, -1)
While WaitWindowEvent() ! #PB_Event_CloseWindow : WendВ следующем примере, событие определяется только в том месте, где элементы не накладываются
Можно использовать WinAPI: CombineRgn, GetWindowRgn
Отредактировано AZJIO (10.02.2022 20:06:04)
Подскажите пожалуйста, возможно ли в этой процедуре обработки событий получить WM_MOUSELEAVE и WM_MOUSEWHEEL, если да, то как?
Чем канвас не подошел?
В нем есть эти события и многое другое.
Вы здесь » PureBasic - форум » PureBasic для Windows » Правильное определение событий над ImageGadget