PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Сделать Hover для TextGadget


Сделать Hover для TextGadget

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

1

Что-то не пойму, можно ли сделать hover (изменение фона, к примеру) над TextGadget ?
Использовать Button() вместо TextGadget() я не хочу.
Нашел вот только такой код, но я не в силах переделать его под свои хотелки

Код:

Global mouse_normal = LoadCursor_(0,#IDC_ARROW)
Global mouse_hand = LoadCursor_(0,#IDC_HAND)

OpenWindow(0,0,0,300,80,"test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(2,10,45,100,25,"Button 2", #SS_NOTIFY)

Repeat
  ev = WaitWindowEvent()
  If ev = #WM_MOUSEMOVE
    GetCursorPos_(@pt.POINT)
    hWnd = WindowFromPoint_(PeekQ(@pt))
    If hWnd = WindowID(0) ; Mouse is over window background.
      SetCursor_(mouse_normal)
    Else ; Mouse is over a gadget.
      SetCursor_(mouse_hand)
    EndIf
  EndIf
Until ev = #PB_Event_CloseWindow

Ну и, довеском, может кто подскажет, только общих словах, как вообще можно портировать windows код на mac os, если в нем немало виндусовых API?

0

2

https://www.purebasic.fr/english/viewto … 41#p574941

Код:
Global mouse_normal = LoadCursor_(0,#IDC_ARROW)
Global mouse_hand = LoadCursor_(0,#IDC_HAND)

OpenWindow(0,0,0,300,80,"test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(2,10,45,100,25,"Button 2", #SS_NOTIFY)
SetGadgetColor(2, #PB_Gadget_BackColor, $ffff00)

Repeat
  ev = WaitWindowEvent()
  If ev = #WM_MOUSEMOVE
    GetCursorPos_(@pt.POINT)
    hWnd = WindowFromPoint_(PeekQ(@pt))
    If hWnd = WindowID(0) ; Mouse is over window background.
    	SetCursor_(mouse_normal)
    	SetGadgetColor(2, #PB_Gadget_BackColor, $ffff00)
    Else ; Mouse is over a gadget.
      SetCursor_(mouse_hand)
    	SetGadgetColor(2, #PB_Gadget_BackColor, $00ffff)
    EndIf
  EndIf
Until ev = #PB_Event_CloseWindow
Goga написал(а):

я не в силах переделать его под свои хотелки

не верю... посмотреть поддерживает ли гаджет изменение фона достаточно просто - в описании всегда это указано для многих гаджетов.

Отредактировано AZJIO (17.06.2023 16:08:51)

0

3

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

не верю... посмотреть поддерживает ли гаджет изменение фона достаточно просто - в описании всегда это указано для многих гаджетов.

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

0

4

Goga
код предложенный вами именно это и делает - возвращает дескриптор под курсором. Да, там только для одного гаджета по условию Else, но кто мешает получить идентификатор и применить к нему цвет. Также там проблема что когда мышь пролетает над элементом то она несколько раз сотню, а то и больше красит гаджет, а надо если покрасил то уже не красить, то есть триггер, которые контролирует что мышь над гаджетом, покрашена и не перекрашивать пока курсор не спрыгнет с него. Получить PureBasic-ковский идентификатор из дескриптора выкладывал mk-soft, вот GadgetPB

Код:
EnableExplicit

XIncludeFile "GadgetPB.pbi" ; mk-soft
Global hGUI, OverGadget, wwe, hWnd, id, pt.POINT

hGUI = OpenWindow(0,0,0,300,80,"test",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
TextGadget(1,10,15,100,25,"Button 1", #SS_NOTIFY)
TextGadget(2,10,45,100,25,"Button 2", #SS_NOTIFY)
SetGadgetColor(1, #PB_Gadget_BackColor, $ffff00)
SetGadgetColor(2, #PB_Gadget_BackColor, $ffff00)


Repeat
	wwe = WaitWindowEvent()
	If wwe = #WM_MOUSEMOVE
    GetCursorPos_(@pt)
    hWnd = WindowFromPoint_(PeekQ(@pt))
    ;     SetWindowTitle(0 , Str(hWnd))
    If hWnd = hGUI
    	If OverGadget
        SetGadgetColor(OverGadget, #PB_Gadget_BackColor, $ffff00)
        OverGadget = 0
    	EndIf
    Else 
    	If Not OverGadget
        id = GadgetPB(hWnd)
        SetGadgetColor(id, #PB_Gadget_BackColor, $00ffff)
        OverGadget = id
    	EndIf
    EndIf
	EndIf
Until wwe = #PB_Event_CloseWindow

Отредактировано AZJIO (17.06.2023 17:48:41)

0

5

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

Goga
код предложенный вами именно это и делает - возвращает дескриптор под курсором. Да, там только для одного гаджета по условию Else, но кто мешает получить идентификатор и применить к нему цвет. Также там проблема что когда мышь пролетает над элементом то она несколько раз сотню, а то и больше красит гаджет, а надо если покрасил то уже не красить, то есть триггер, которые контролирует что мышь над гаджетом, покрашена и не перекрашивать пока курсор не спрыгнет с него. Получить PureBasic-ковский идентификатор из дескриптора выкладывал mk-soft, вот GadgetPB

Отредактировано AZJIO (Сегодня 00:48:41)

Именно я это и хотел найти, получение PB номера гаджета и по дескриптору, только не мог правильно сформулировать запрос, поэтому ничего не нашел. AZJIO, чтобы я без вас делал )) Вы выручаете меня не в первый раз.

0

6

Там ещё нюанс, если два гаджета вплотную, то нет перехода на GUI, по условию которого гаджет восстанавливает старый цвет. Для таких случаев надо проверять изменение гаджета - добавить OldGadget, чтобы на предыдущем гаджете возвратить окрас, а новый подсветить.

Код:
EnableExplicit

XIncludeFile "GadgetPB.pbi"
Global hGUI, CurrentGadget, wwe, hWnd, NewGadget, pt.POINT

hGUI = OpenWindow(0, 0, 0, 300, 80, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(1, 10, 15, 100, 25, "Button 1", #SS_NOTIFY)
TextGadget(2, 10, 40, 100, 25, "Button 2", #SS_NOTIFY)
SetGadgetColor(1, #PB_Gadget_BackColor, $dddddd)
SetGadgetColor(2, #PB_Gadget_BackColor, $dddddd)


Repeat
	wwe = WaitWindowEvent()
	If wwe = #WM_MOUSEMOVE
    GetCursorPos_(@pt)
    hWnd = WindowFromPoint_(PeekQ(@pt))
    If hWnd = hGUI
    	If CurrentGadget
        SetGadgetColor(CurrentGadget, #PB_Gadget_BackColor, $dddddd)
        CurrentGadget = 0
    	EndIf
    Else
    	NewGadget = GadgetPB(hWnd)
    	If CurrentGadget <> NewGadget
        If CurrentGadget
        	SetGadgetColor(CurrentGadget, #PB_Gadget_BackColor, $dddddd)
        EndIf
        SetGadgetColor(NewGadget, #PB_Gadget_BackColor, $aaaaff)
        CurrentGadget = NewGadget
    	EndIf
    EndIf
	EndIf
Until wwe = #PB_Event_CloseWindow

0

7

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

Там ещё нюанс, если два гаджета вплотную, то нет перехода на GUI, по условию которого гаджет восстанавливает старый цвет. Для таких случаев надо проверять изменение гаджета - добавить OldGadget, чтобы на предыдущем гаджете возвратить окрас, а новый подсветить.

В последнем примере ошибка, может возникать #Gadjet is not initialized я хорошо так поводить мышкой. Но я разбираться в этом не буду, т.к. у меня нет "плотных" гаджетов.

0

8

Goga
там гаджет надо начинать с 1, так как 0 используется как отсутствие гаджетов. Иначе переделать на "-1" как отсутствие гаджетов, но тогда во всех условиях надо делать сравнение с "-1".

Код:
EnableExplicit

XIncludeFile "GadgetPB.pbi"
Global hGUI, CurrentGadget = -1, wwe, hWnd, NewGadget = -1, pt.POINT

hGUI = OpenWindow(0, 0, 0, 300, 80, "test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(0, 10, 15, 100, 25, "Button 1", #SS_NOTIFY)
TextGadget(1, 10, 40, 100, 25, "Button 2", #SS_NOTIFY)
SetGadgetColor(0, #PB_Gadget_BackColor, $dddddd)
SetGadgetColor(1, #PB_Gadget_BackColor, $dddddd)


Repeat
	wwe = WaitWindowEvent()
	If wwe = #WM_MOUSEMOVE
    GetCursorPos_(@pt)
    hWnd = WindowFromPoint_(PeekQ(@pt))
    If hWnd = hGUI
    	If CurrentGadget <> -1
        SetGadgetColor(CurrentGadget, #PB_Gadget_BackColor, $dddddd)
        CurrentGadget = -1
    	EndIf
    Else
    	NewGadget = GadgetPB(hWnd)
    	If CurrentGadget <> NewGadget
        If CurrentGadget <> -1
        	SetGadgetColor(CurrentGadget, #PB_Gadget_BackColor, $dddddd)
        EndIf
        SetGadgetColor(NewGadget, #PB_Gadget_BackColor, $aaaaff)
        CurrentGadget = NewGadget
    	EndIf
    EndIf
	EndIf
Until wwe = #PB_Event_CloseWindow

Обновил код 2 раза, везде надо -1 в том числе при объявлении.

Отредактировано AZJIO (18.06.2023 10:20:48)

0

9

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

Goga
там гаджет надо начинать с 1, так как 0 используется как отсутствие гаджетов. Иначе переделать на "-1" как отсутствие гаджетов, но тогда во всех условиях надо делать сравнение с "-1".

Обновил код 2 раза, везде надо -1 в том числе при объявлении.

Отредактировано AZJIO (Вчера 17:20:48)

Спасибо. Продуктивно все получилось. :writing:

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Сделать Hover для TextGadget