как отследить наезд курсора на кнопку? Цель - повторить программку на делфи (исходник утерян). Писал давно и всё забыл. Есть также попытка создания аналога на asm, но на делфи лучше: если на Asm можно догнать кнопку, то на делфи кнопку не догнать (без специального софта не отправить событие онклик). Программы и исходник на асм прилагаются.
аналог события delphi OnMouseMove на button
Страница: 1
Сообщений 1 страница 6 из 6
Поделиться205.08.2025 00:31:33
Можете отслеживать событие #WM_MOUSEMOVE и проверять когда курсор окажется на кнопке.
Или воспользуйтесь функцией TrackMouseEvent().
Поделиться507.08.2025 17:43:24
Код:
Здесь реализован наезд и уход с гаджетов #WC_BUTTON
Сплит-кнопка, кнопка, чек, радио.
Код возвращает координаты и размеры гаджета на который наехали\уехали.
Где это использовать и как модернизировать, это ваши проблемы.
Работает только если нет рисования.
При рисовании кнопки не получают #WM_NOTIFY, только сплит получает.
кому надо рисованное, то канвас или #WC_STATIC, на них можно реализовать
EnableExplicit
Macro pb : " " : EndMacro
Global win1, NewMap but()
Structure NMBCHOTITEM
hdr.NMHDR
dwFlags.l
EndStructure
#BS_SPLITBUTTON = 12
#BCN_FIRST = -1250
#BCN_HOTITEMCHANGE = #BCN_FIRST+1
#HICF_MOUSE = 1
#HICF_ENTERING = 16
#HICF_LEAVING = 32
Procedure MyCallback(hWnd, uMsg, wParam, lParam)
Protected res, s.s
Protected *nmHI.NMBCHOTITEM, rc.RECT, wp.WINDOWPLACEMENT
res=#PB_ProcessPureBasicEvents
wp\Length=SizeOf(WINDOWPLACEMENT)
Select uMsg
Case #WM_NOTIFY
;{
*nmHI = lParam
If *nmHI\hdr\code = #BCN_HOTITEMCHANGE
GetWindowRect_(*nmHI\hdr\hwndFrom, rc); на столе
GetWindowPlacement_(*nmHI\hdr\hwndFrom, wp); в окне
ForEach but()
If but()=*nmHI\hdr\hwndFrom
s=MapKey(but())
Select *nmHI\dwFlags
Case #HICF_MOUSE|#HICF_ENTERING
;{
Debug s+" наехал"
; координаты и размеры на столе
Debug ""+rc\left+pb+rc\top+pb+rc\right+pb+rc\bottom
; координаты и размеры в окне
Debug ""+wp\rcNormalPosition\left+pb+wp\rcNormalPosition\top+pb+wp\rcNormalPosition\right+pb+wp\rcNormalPosition\bottom
;}
Case #HICF_MOUSE|#HICF_LEAVING
;{
Debug s+" уехал"
;}
EndSelect; = *nmHI\dwFlags
EndIf
Next
EndIf; = *nmDD\hdr\code
;} = #WM_NOTIFY
EndSelect; = uMsg
ProcedureReturn res
EndProcedure
Procedure senior()
Protected ev, f1
win1=OpenWindow(1234, 870, 690, 500, 310, "text")
SetWindowCallback(@MyCallback())
f1=#WS_CHILD|#WS_VISIBLE|#BS_SPLITBUTTON
but("split")=CreateWindow_(#WC_BUTTON, "кнопка с меню", f1, 10, 10, 200, 35, win1, 0, 0, 0)
f1=#WS_CHILD|#WS_VISIBLE|#BS_PUSHLIKE
but("button")=CreateWindow_(#WC_BUTTON, "простая кнопка", f1, 230, 10, 200, 35, win1, 0, 0, 0)
f1=#WS_CHILD|#WS_VISIBLE|#BS_AUTORADIOBUTTON|#WS_BORDER
but("radio")=CreateWindow_(#WC_BUTTON, "радио", f1, 10, 70, 200, 35, win1, 0, 0, 0)
f1=#WS_CHILD|#WS_VISIBLE|#BS_AUTOCHECKBOX|#WS_BORDER
but("check")=CreateWindow_(#WC_BUTTON, "чек", f1, 230, 70, 200, 35, win1, 0, 0, 0)
Repeat
ev=WaitWindowEvent()
If GetAsyncKeyState_(#VK_ESCAPE)=32768:Break:EndIf
Until ev=#PB_Event_CloseWindow
EndProcedure
senior()
Поделиться607.08.2025 20:32:06
Всем спасибо! Буду разбираться и пилить опрос, как немного разберусь с делами)
Страница: 1