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 : Wend
https://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