PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » Правильное определение событий над ImageGadget


Правильное определение событий над ImageGadget

Сообщений 1 страница 6 из 6

1

Прошу помощи в правильном определении событий над каждым ImageGadet. В следующем примере, событие определяется только в том месте, где элементы не накладываются:

Код:
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(#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))

  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))
  
;   SetGadgetCallback(#ImgGadget1)  
  SetGadgetCallback(#ImgGadget2)

While WaitWindowEvent() ! #PB_Event_CloseWindow : Wend

0

2

Код:
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

0

3

Благодарю за ответ! Подскажите пожалуйста, возможно ли в этой процедуре обработки событий получить WM_MOUSELEAVE и WM_MOUSEWHEEL, если да, то как?

0

4

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)

0

5

Webarion написал(а):

Подскажите пожалуйста, возможно ли в этой процедуре обработки событий получить WM_MOUSELEAVE и WM_MOUSEWHEEL, если да, то как?

Чем канвас не подошел?
В нем есть эти события и многое другое.

0

6

Благодарю за подсказки!

Пётр написал(а):

Чем канвас не подошел?

Прозрачность нужна.

Отредактировано Webarion (11.02.2022 11:06:56)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Правильное определение событий над ImageGadget