PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Определить направление вращения колёсика мыши


Определить направление вращения колёсика мыши

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

1

есть известная функция, но она использует устаревшую функцию EventwParam()
в любой момент её могут убрать

Код:
Procedure.w MouseWheelDelta()
Protected x.w=(EventwParam()>>16)&$FFFF
ProcedureReturn -(x/120)
EndProcedure

в справке сказано

Эта функция больше не поддерживается и не должна использоваться в новом проекте. Чтобы получить полный контроль над событиями Окон - используйте процедуры обратного вызова, с помощью SetWindowCallback().

сделал вот так, но не могу понять как получить результат, тогда когда он мне нужен

Код:

;{
; #WM_MouseActivate = 33
; #WM_MouseFirst = 512
; #WM_MouseHover = 673
; #WM_MouseHWheel = 526
; #WM_MouseLast = 521
; #WM_MouseLeave = 675
; #WM_MouseMove = 512
; #WM_MouseWheel = 522
;}

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
Protected x.w, ret=#PB_ProcessPureBasicEvents
If IsWindow(21)
Select Message
Case #WM_MOUSEWHEEL
Debug "#WM_MouseWheel "+Message+" : WParam="+wParam+" , LParam="+lParam
x=wParam>>16&$FFFF
Debug Str(-(x/120))
;ProcedureReturn -(x/120)
EndSelect
ProcedureReturn ret
EndIf
EndProcedure

Procedure senior()
Protected ev, eg, em, et
If OpenWindow(21, 870, 640, 400, 300, "")
AddKeyboardShortcut(21, #PB_Shortcut_Escape, 0); ESC
SetWindowCallback(@MyWindowCallback())


Repeat
ev=WaitWindowEvent():eg=EventGadget():et=EventType():em=EventMenu()
If ev=#PB_Event_Menu And em=0:Break:EndIf; ESC

If ev=#PB_Event_Gadget

EndIf

Until ev=#PB_Event_CloseWindow
EndIf
EndProcedure

senior()

0

2

Код:
EnableExplicit

#Gui = 0

Enumeration 
	#Label1
	#Label2
	#Label3
	#Label4
	#Input
EndEnumeration

Global k1 = 0
Global k2 = 0

Procedure.s _KeysHeld(iKeys)
	Protected sKeyHeld.s
	If iKeys & #MK_CONTROL
    sKeyHeld + "CTRL" + #CRLF$	
	EndIf
	If iKeys & #MK_LBUTTON
    sKeyHeld + "Левая кнопка мыши" + #CRLF$
	EndIf
	If iKeys & #MK_MBUTTON
    sKeyHeld + "Средняя кнопка мыши" + #CRLF$
	EndIf
	If iKeys & #MK_RBUTTON
    sKeyHeld + "Правая кнопка мыши" + #CRLF$
	EndIf
	If iKeys & #MK_SHIFT
    sKeyHeld + "SHIFT" + #CRLF$
	EndIf
	If iKeys & #MK_XBUTTON1
    sKeyHeld + "Windows 2000/XP: Первая X кнопка" + #CRLF$
	EndIf
	If iKeys & #MK_XBUTTON2
    sKeyHeld + "Windows 2000/XP: Вторая X кнопка" + #CRLF$
	EndIf
	ProcedureReturn sKeyHeld
EndProcedure

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
	Protected Delta, key.s, X, Y

	Select Message
    Case #WM_MOUSEWHEEL
    	Delta = wParam >> 16    ; HiWord
    	key = _KeysHeld(wParam & $FFFF) ; LoWord
    	X = lParam & $FFFF        ; LoWord
    	Y = lParam >> 16        ; HiWord
    	
    	; Одновременно нажатые клавиши
    	If key
        key = #CRLF$ + "Одновременно удерживаемые клавиши:" + #CRLF$ + key
    	EndIf
    	
    	SetGadgetText(#Label3, "Delta: " + Delta + ",     X: " + X + ", Y: " + Y + key)
    	
    	If Delta > 0
        k1 + 1
        SetGadgetText(#Label1, "колесо мыши сдвинулось вверх " + Str(k1) + " раз")
        SetWindowTitle(#Gui, "вверх " + Str(k1) + " раз, вниз " + Str(k2) + " раз")
        SetGadgetText(#Input, Str(k1) + " - " + Str(k2) + " = " + Str(k1 - k2))
    	Else
        k2 + 1
        SetGadgetText(#Label2, "колесо мыши сдвинулось вниз   " + Str(k2) + " раз")
        SetWindowTitle(#Gui, "вверх " + Str(k1) + " раз, вниз " + Str(k2) + " раз")
        SetGadgetText(#Input, Str(k1) + " - " + Str(k2) + " = " + Str(k1 - k2))
    	EndIf
	EndSelect
	ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

If OpenWindow(#Gui, 0, 0, 370, 200, "WM_MOUSEWHEEL", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
	TextGadget(#Label4,5, 5, 360, 34,"Функция WM_MOUSEWHEEL выполняется при вращения колёсика мыши. Удерживайте Ctrl, Shift и кнопки мыши при вращении колёсика.")
	TextGadget(#Label1,20, 45, 226, 17,"колесо мыши сдвинулось вверх 0 раз")
	TextGadget(#Label2,20, 62, 226, 17,"колесо мыши сдвинулось вниз   0 раз")
	TextGadget(#Label3,10, 80, 360, 115,"")
	StringGadget(#Input , 250, 50, 100, 21, "")
	
	SetWindowCallback(@MyWindowCallback())
	
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

0

3

так из этой функции можно что то вернуть или только через глобальные? куда ретурн уходит?
глобальные сразу просились, но это как то не кошерно
ты забыл дельту разделить на 120, дельта должна быть +1-1, тогда без проблем умножаешь на нужный множитель и получаешь приращивание в нужном направлении

в качестве множителей использую не клавиши, а кнопки мыши
вращение используется над определёнными гаджетами, кнопки на мыше удобней получаются чем клавиши

0

4

ты забыл дельту разделить на 120

а надо ли? Это лишнее действие, даже если использовать нужный множитель, всё равно получатся какие то числа, просто они будут в 120 раз больше, а число шагов процессора при умножении остаётся тоже самое, просто добавится лишнее действие деление.

А я гадал, что за возврат нужен. Я вот не помню, если вызвать через событие через SendMessage, то можно что-то возвратить и то не для всех событий, как таковая функция вызывается способом не поддерживающим возврат куда-то. Я помню в некоторых случаях используется возврат True/False, чтобы определить некоторые действия, например завершить перенос файла в окно или закончить редактирование пункта листвью. В общем через глобальные и Shared наверно.
И к тому же в AutoIt3 писалось тоже возврат некой константы ($GUI_RUNDEFMSG) описание которой писалось так: "чтобы правильно завершить функцию". Можешь прочитать описание GUIRegisterMsg в AutoIt3

!!! Если вы хотите, чтобы AutoIt выполнил внутренний обработчик для сообщения, возвратите переменную $GUI_RUNDEFMSG (в GUIConstantsEx.au3) из функции (смотрите также примеры) !!!
То есть если вы хотите выполнить Return раньше, чем функция закончится и также выполнить внутренний обработчик сообщения AutoIt.

Отредактировано AZJIO (18.09.2020 05:22:35)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Определить направление вращения колёсика мыши