Форум » GUI » Не могу понять , почему не срабатывает ? » Ответить

Не могу понять , почему не срабатывает ?

Softlog86: Ситуация : Define window FOTO_WINDOW AT 10 , 10 WIDTH 100 HEIGHT 100 TITLE 'Изображение товара' nosysmenu ON INTERACTIVECLOSE .F. NOSHOW child // В это окно выводим картинку товара (cPictureName) // При наведении мышки на картинку - включаем (выводим поверх картинки) кнопку [ЗАКРЫТЬ] и делаем в фокусе // При снятии мыши с картинки - убираем кнопку [ЗАКРЫТЬ] @ 20,0 image TOVAR_PICTURE picture cPICTUREName ; ON MOUSEHOVER (FOTO_WINDOW.BTNCLOSE.SHOW , FOTO_WINDOW.BTNCLOSE.SETFOCUS ); ON MOUSELEAVE (FOTO_WINDOW.BTNCLOSE.HIDE ) // Собственно - кнопочка [ЗАКРЫТЬ] : // Если кликаем мышкой на неё - должно выполнить то что написано по OnClick (ACTION) - то есть сделать 'невидимым' это окно @ 40,10 BUTTON BTNCLOSE CAPTION 'Закрыть ' ; OnClick ( FOTO_VISIBLE:=.F. , FOTO_WINDOW.HIDE ) End Window По задумке - при наведении мыши на картинку - должна открыть кнопку [Закрыть] и собтcветсвенно при клике на неё - сделать всё , что указано По факту - при наведении мыши - кнопка действительно появляется (.SHOW) но клик по ней - не обрабатывается (мышкой) . Работает только если мышка на кнопке и нажимаем на клаве ENTER .... Что не так ?

Ответов - 12

gfilatov2002: Softlog86 пишет: Что не так ? Дело в том, что при использовании события ON MOUSEHOVER картинка перехватывает на себя нажатие мышки. Решение: используйте для закрытия окна действие ACTION самой картинки, а вместо вывода кнопки 'Закрыть' при наведении на фото используйте вывод подсказки TOOLTIP с текстом типа "Нажмите на фото для закрытия окна"

Softlog86: Спасибо за совет .... Но мне нужно несколько иное . Кнопка была для примера - на картинке их будет несколько (Закрыть/Увеличить/и т д ) ..... поэтому обрабатывать всё-же придётся каким-то другим способом ....

gfilatov2002: Softlog86 пишет: Кнопка была для примера - на картинке их будет несколько В таком случае бывает удобно использовать на этой форме элемент управления TOOLBAR


SergKis: Softlog86 а если использовать ButtonEx со своим ON MOUSEHOVER , ON MOUSELEAVE по идее должен сработать

Softlog86: В обычном состоянии ( мышка не в регионе картинки) - никаких кнопок поверх картинки (IMAGE) не выводится .... Кнопки проявляются только при наведении мыши на картинку . Мне нужно выводить кнопки(надписи) только при наведении и прятать при снятии мыши ..... (например на некоторых сайтах при просмотре товара - так реализовано - появляются кнопки вправо-влево .) ТООЛБАР - не совсем правильно , так как кнопки будут не всегда в верхней части .

gfilatov2002: Softlog86 пишет: Мне нужно выводить кнопки(надписи) только при наведении и прятать при снятии мыши Понятно. Тогда добавьте в обработчики картинки следующий код @ 20,0 image TOVAR_PICTURE picture cPICTUREName ; ON MOUSEHOVER (ChangeStyle ( GetControlHandle ('TOVAR_PICTURE','FOTO_WINDOW') , , SS_NOTIFY ),; FOTO_WINDOW.BTNCLOSE.SHOW , FOTO_WINDOW.BTNCLOSE.SETFOCUS ); ON MOUSELEAVE (ChangeStyle ( GetControlHandle ('TOVAR_PICTURE','FOTO_WINDOW') , SS_NOTIFY ),FOTO_WINDOW.BTNCLOSE.HIDE ) и определите #define SS_NOTIFY 256

Softlog86: При наведении: ON MOUSEHOVER (ChangeStyle ( GetControlHandle ('TOVAR_PICTURE','FOTO_WINDOW') , , SS_NOTIFY ), .... Внимание на : " , , SS_NOTIFY)" При покидании зоны : ON MOUSELEAVE (ChangeStyle ( GetControlHandle ('TOVAR_PICTURE','FOTO_WINDOW') , SS_NOTIFY ) Внимание на : " , SS_NOTIFY) " В первом случае и во втором параметр SS_NOTIFY в разных местах . Так и нужно ? - вылетает программа при наведении на картинку .... Проблема во второй строчке - там где MOUSELEAVE ....

gfilatov2002: Softlog86 пишет: В первом случае и во втором параметр SS_NOTIFY в разных местах . Так и нужно ? Да, в первом случае убираем перехват действий на фото, а во втором - восстанавливаем. Softlog86 пишет: Проблема во второй строчке - там где MOUSELEAVE Значит, надо использовать флажок, для того, чтобы эта функция срабатывала только один раз. Static lDone:=.f. func onmousehover if ! lDone ChangeStyle ( GetControlHandle ('TOVAR_PICTURE','FOTO_WINDOW') , , SS_NOTIFY ) // убираем перехват lDone:=.t. endif .... func onmouseleave if lDone ChangeStyle ( GetControlHandle ('TOVAR_PICTURE','FOTO_WINDOW') , SS_NOTIFY ) // восстанавливаем перехват lDone:=.f. endif ....

Softlog86: Всё -равно - программа вылетает :( (видно что 'включает' кнопку [Закрыть] (Убираем функцию восcтановления перехвата - программа не вылетает ) Может быть не нравится , что окно FOTO_WINDOW = CHILD ?

gfilatov2002: Softlog86 пишет: Всё -равно - программа вылетает Тогда попробуйте восстанавливать перехват в обработчике нажатия кнопки BTNCLOSE

Softlog86: А что толку ? Курсор покинул область - значит кнопка [ЗАКРЫТЬ] должна быть невидимая (.HIDE) ... то есть никаких нажатий не происходит . соответственно и обработчик не включается .

gfilatov2002: Softlog86 пишет: Курсор покинул область - значит кнопка [ЗАКРЫТЬ] должна быть невидимая (.HIDE) ... то есть никаких нажатий не происходит . соответственно и обработчик не включается Согласен. В таком случае можно по таймеру проверять видимость кнопки и восстанавливать перехват, если кнопка невидимая



полная версия страницы