как отследить наезд курсора на кнопку? Цель - повторить программку на делфи (исходник утерян). Писал давно и всё забыл. Есть также попытка создания аналога на 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