purebasic.info

PureBasic forum
Текущее время: Ср дек 19, 2018 9:19 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Сб янв 07, 2017 8:39 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
Столкнулся с отсутствием функции IsMouseOut(wnd), всё что удалось найти
Код:
1
2
3
4
5
If IsMouseOver(wnd)
 
Else
 
Endif


в итоге получается, если мышь не на гаджете, то бесконечно выполняется код в Else, но это же неправильно, должна быть IsMouseOut(wnd) которая выполнится один раз, почему нет её?
это не так часто нужно, но ведь нужно, или ни кто не задумывался, что выполняется море бесполезных действий, типа успевает и ладно!!!!

На карвасе же есть такое, но использовать канвас где ни попадя тоже неохота.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Сб янв 07, 2017 1:28 pm 
Не в сети
профессор

Зарегистрирован: Вс авг 31, 2014 12:11 am
Сообщений: 457
Благодарил (а): 51 раз.
Поблагодарили: 20 раз.
Пункты репутации: 10
newJS, проверять потерю фокуса определённым гаджетом, не? GetActiveGadget() и SetActiveGadget()


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Сб янв 07, 2017 1:34 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Задача просто решается.
Код:
1
2
3
4
5
6
7
Flag = #False
 
If IsMouseOver(wnd) And Flag = #False
  Flag = #True
ElseIf Flag = #True
  Flag = #False
EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вс янв 08, 2017 7:04 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
knower писал(а):
проверять потерю фокуса определённым гаджетом, не?

да, оно
Пётр писал(а):
Задача просто решается.

посмотрим

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вс янв 08, 2017 7:58 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
knower, получится то же самое, что я написал изначально.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вс янв 08, 2017 8:47 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6414
Благодарил (а): 21 раз.
Поблагодарили: 201 раз.
Пункты репутации: 52
newJS писал(а):
при движении мыши над гаджетом постоянно переключается.

Похоже, просто ты неправильно используешь эту функцию, или не понял, для чего она нужна, вот отсюда и проблема.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вс янв 08, 2017 3:15 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
newJS писал(а):
при движении мыши над гаджетом постоянно переключается.
Тогда так
Код:
1
2
3
4
5
6
7
8
9
Flag = #False
 
If IsMouseOver(wnd)
  If Flag = #False
    Flag = #True
  EndIf
ElseIf Flag = #True
  Flag = #False
EndIf


newJS писал(а):
как то винда это отслеживает, значит есть готовое, мне так кажется, винда как то подсвечивает элементы при наезде
TrackMouseEvent http://vsokovikov.narod.ru/New_MSDN_API ... eevent.htm
Пример здесь viewtopic.php?t=1867&p=30415#p30415

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Пн янв 09, 2017 5:52 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
kvitaliy писал(а):
Похоже, просто ты неправильно используешь эту функцию, или не понял, для чего она нужна, вот отсюда и проблема.

Не, не в этот раз. Виталя, я про то, что Пётр дал, а ты про чё? :D


Пётр, я так сделал. Срабатывает один раз при наезде и один раз при уходе.
Код:
1
2
3
4
5
6
7
8
9
10
11
If IsMouseOver(txtF)
If over=1
SetGadgetColor(txtF, gbc, dark(getWinColor(1)))
out=1
over=0
EndIf
ElseIf out=1
out=0
over=1
SetGadgetColor(txtF, gbc, -1)
EndIf



TrackMouseEvent, её я вчера нашёл, только это для меня сложно.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Пн янв 09, 2017 9:22 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6414
Благодарил (а): 21 раз.
Поблагодарили: 201 раз.
Пункты репутации: 52
newJS писал(а):
ты про чё? :D
.

Я про то, что сейчас у тебя в коде
Код:
1
2
3
4
5
If IsMouseOver(txtF)
If over=1
SetGadgetColor(txtF, gbc, dark(getWinColor(1)))
out=1
...


функция IsMouseOver(txtF) вызывается и срабатывает постоянно.
Т.е. , как ты и написал вначале:
Цитата:
выполняется море бесполезных действий, типа успевает и ладно!!!!


И весь твой код это по сути тот же код Перта с флагами,
Код:
1
2
3
4
5
6
Flag = #False
 If IsMouseOver(wnd) And Flag = #False
  Flag = #True
ElseIf Flag = #True
  Flag = #False
EndIf


Но только ты его не понял как применить у себя и переписал чуть длиннее :D

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вт янв 10, 2017 6:35 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
kvitaliy писал(а):
Но только ты его не понял как применить у себя и переписал чуть длиннее

В том том то и дело, изначальный код Петра не работает как надо, потому и переделал его.
Аж интересно стало, это ж как я её неправильно применил?
kvitaliy писал(а):
функция IsMouseOver(txtF) вызывается и срабатывает постоянно.

Ну да, пока мыша движется над гаджетом она срабатывает, вот потому over и добавил. И теперь срабатывает по разу на заход и уход мыши.

Ты бы не прикалывался, а написал бы как использовать TrackMouseEvent.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вт янв 10, 2017 8:19 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6414
Благодарил (а): 21 раз.
Поблагодарили: 201 раз.
Пункты репутации: 52
newJS писал(а):
как использовать TrackMouseEvent.


Ну как то так
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
 
;- **************** EnableHoverEvents ******Это в программу
#CUSTOM_MSG_MOUSEENTER = #WM_APP+1
#CUSTOM_MSG_MOUSELEAVE = #WM_APP+2
 
Structure HDATA
  oldproc.i
  tracking.i
EndStructure
 
Import "Gadget.lib"
  PB_Gadget_SendGadgetCommand(hwnd, command)
EndImport
 
Procedure HoverProc(hwnd, msg, wparam, lparam)
 
  *hData.HDATA = GetProp_(hwnd, "hdata")
  Protected oldproc = *hData\oldproc
 
  Select msg
    Case #WM_NCDESTROY
      RemoveProp_(hwnd, "hdata")
      FreeMemory(*hData)
 
    Case #WM_MOUSEMOVE
      If Not *hData\tracking
        *hData\tracking = #True
        PB_Gadget_SendGadgetCommand(hwnd, #CUSTOM_MSG_MOUSEENTER)
        With tm.TRACKMOUSEEVENT
          \cbSize = SizeOf(TRACKMOUSEEVENT)
          \dwFlags = #TME_LEAVE
          \hwndTrack = hwnd
        EndWith
        TrackMouseEvent_(@tm)
        CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
        ProcedureReturn 0
      EndIf
             
    Case #WM_MOUSELEAVE
      PB_Gadget_SendGadgetCommand(hwnd, #CUSTOM_MSG_MOUSELEAVE)
      *hData\tracking = #False
      CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
      ProcedureReturn 0
     
  EndSelect
  ProcedureReturn CallWindowProc_(oldproc, hwnd, msg, wparam, lparam)
EndProcedure
 
ProcedureDLL EnableHoverEvents(gadget)
 
  *hData.HDATA = AllocateMemory(SizeOf(HDATA))
  *hData\tracking = #False
  *hData\oldproc = SetWindowLongPtr_(GadgetID(gadget),#GWL_WNDPROC, @HoverProc())
  ProcedureReturn SetProp_(GadgetID(gadget), "hdata", *hData)
EndProcedure
 
;- ********************* Конец EnableHoverEvents*****************************
 
;- Сама программа:
 
OpenWindow(0,0,0,640,480,"",#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
StringGadget(0, 60,  60, 250, 20, "Test"):
TextGadget
 
EnableHoverEvents(0)
 
Repeat
  ev = WaitWindowEvent()
  Select ev
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0
          If EventType() = #CUSTOM_MSG_MOUSEENTER
            SetGadgetColor(0,#PB_Gadget_BackColor,$3aebac)
          ElseIf EventType() = #CUSTOM_MSG_MOUSELEAVE
            SetGadgetColor(0,#PB_Gadget_BackColor,$FFFFFF)
          EndIf
      EndSelect
  EndSelect
Until ev=#PB_Event_CloseWindow


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вт янв 10, 2017 8:28 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
Ну не фигася куча кода :shock:
Виталя, спасибо попробую ради интереса.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вт янв 10, 2017 9:38 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6414
Благодарил (а): 21 раз.
Поблагодарили: 201 раз.
Пункты репутации: 52
newJS писал(а):
Ну не фигася куча кода :shock:
Виталя, спасибо попробую ради интереса.

Разве это код? То, что специально отделил звёздочками, это можно не думая скопипастить в любое место.
В твоей программе только одна строчка на каждый гаджет EnableHoverEvents
и обычная обработка 2-х событий гаджета #CUSTOM_MSG_MOUSEENTER и #CUSTOM_MSG_MOUSELEAVE
Разве это сложно?

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вт янв 10, 2017 10:01 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 712
Благодарил (а): 75 раз.
Поблагодарили: 21 раз.
Пункты репутации: 5
Не, ты не понял, я имел ввиду, что для того чтобы использовать TrackMouseEvent нужно столько кода написать.
Отсюда возникает простой вопрос, мой код, это нормальное решение? типа, а зачем платить больше?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: IsMouseOver(wnd) и IsMouseOut(wnd)
СообщениеДобавлено: Вт янв 10, 2017 10:23 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6414
Благодарил (а): 21 раз.
Поблагодарили: 201 раз.
Пункты репутации: 52
Работает код как ты хотел? Значит нормально.
Я всегда за простоту и понятность кода.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB