Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C++ Builder > Анимированная кнопка |
Автор: artsb 17.7.2007, 19:58 |
Привет. Хочу узнать как можно сделать так, чтобы при наведении на компонент Image картинка менялась на другую, а потом обратно? Спасибо. |
Автор: SkyHawk 18.7.2007, 06:53 |
Событие OnMouseMove, обработка координатов курсора и немного смекалки. ![]() |
Автор: Santilka85 18.7.2007, 07:35 |
а по моему обработка координат тут совсем удобна. Я так понимаю что тут достаточно OnMouseMove. просто словами: <наводим курсор(OnMouseMove)> { загружаем в Image1 нужную картинку; а тут можно Sleep (500); поставить ну или скок нада; а иначе просто тут придёться голову поломать загружаем в Image1 бывшую картинку; } покопаюсь у себя сразу напишу.. |
Автор: artsb 18.7.2007, 10:40 |
Ну как менять при наведении я разобрался, а вот обратно - проблема :( |
Автор: Santilka85 18.7.2007, 10:45 |
а мой пример тебе не подходит? ну в смысле когда 1. наводишь на картинку. 2. она меняется. 3. отсчитывается к примеру 0.1 сек. 4. загрузить предыдущую картинку. или ты картинки хочешь в EXE-файле хранить потом? Добавлено @ 10:45 напиши хоть часть кода ![]() |
Автор: HappyLife 18.7.2007, 12:54 |
artsb, Отслеживать координаты Мышки. |
Автор: Lazin 18.7.2007, 14:56 |
OnMouseEnter, OnMouseLeave. И не надо ничего отслеживать ![]() Кадры анимации нужно хранить в ImageList затем при перерисовке ImageList->Draw(Canvas, x,y, №кадра); |
Автор: Lazin 18.7.2007, 15:20 | ||
При наведении курсора сначала приложение замрет на 0,5с а затем появится "бывшая картинка", "нужную картинку" юзверь не увидит так как в место перерисовки GUIшный поток будет крепко спать ![]() |
Автор: mr.Anderson 18.7.2007, 17:27 | ||
Пра-а-а-а-вда? ![]() |
Автор: artsb 18.7.2007, 17:30 |
А разве у Image есть событие OnMouseLeave. Если нет напишите как отслеживать координаты. |
Автор: mr.Anderson 18.7.2007, 17:35 |
![]() Вообще, есть два варианта. Первый - поместить, скажем, TImage поверх всех контролов на форме (естественно, картинку в него загружать не надо, чтобы он остался прозрачным). И отслеживать его событие OnMouseMove, анализируя передаваемые туда параметры X и Y и соотнося их с позициями других компонентов на форме. Метод не совсем удобный, поэтому предлагаю другой. Второй метод - переопределить метод AppMsg и отслеживать перемещение мыши в нем путем анализа события WM_MOUSEMOVE. Как перегрузить этот метод - обсуждалось много раз, поищи. |
Автор: Santilka85 19.7.2007, 05:42 |
а если таймер использовать? ![]() |
Автор: Lazin 19.7.2007, 07:48 | ||||||
BDS2006 Help
У пэйнт бокса например есть, и у кнопки тоже. TImage не использую т.к. имхо компонент кривой, и предназначен в основном для отображения статических изображений.
а если свой компонент написать? А вообще с таймером нормально должно работать. Можно так-же со Sleep, только перед ним нужно вызвать Image->Repaint() но это плохой вариант так как засыпать будет основной поток, т.е. каждый раз когда пользователь наводит курсор прога будет останавливаться (сообщения не будет обрабатывать). PS щас как посмотрел на этот TImage, и оказалось что у него тоже есть события OnMouseEnter & OnMouseLeave ![]() |
Автор: Santilka85 19.7.2007, 11:09 |
ну тада чё морочиться???? ипсользовать Timer и ВСЁ!! ![]() |
Автор: Lazin 19.7.2007, 11:20 |
нафига таймер если события есть? |
Автор: Santilka85 19.7.2007, 11:32 |
ну ладно картинку ты изменишь при наведении, а обратно то КАК? извини конечно, я, может чего то недопонял ![]() |
Автор: Lazin 19.7.2007, 11:48 |
cобытие OnMouseLeave |
Автор: Santilka85 19.7.2007, 11:54 |
в справке не нашёл, а как оно работает, когда выполняется? ![]() |
Автор: Lazin 19.7.2007, 12:58 | ||
А на чём пишешь? У меня BDS2006, там эти события есть, в 6-м я их не нашёл. Как вариант: можно обрабатывать событие OnMouseMove у Image-а и у формы(панели) на которой он лежит. При движении указателя мыша по имагу устанавливать одно изображение, а при движении по форме возвращать старое:
|
Автор: Klin 20.7.2007, 21:07 |
Вот http://forum.vingrad.ru/index.php?showtopic=153228&view=findpost&p=1146862 добавления этих событий для RichEdit. Переделать легко. |
Автор: SerK 4.8.2007, 00:43 | ||
Доброй ночи! Для себя я решил эту проблему так:
Что самое главное, так это то, что нет мигания изображения. Мне эта функция помогает для создания своих кнопок и выведения оригинальных изображений на них. Наверное, эту функцию можно еще оптимизировать, но пока до этого еще не дошли руки. |
Автор: ivan219 4.8.2007, 12:41 | ||
Извиняюсь за код но в C++ пока неочень так что могу предложить вареант на Delphi это новый компонент созданный на основе TImage но с нужными событиями:
|
Автор: xKOCMOCx 5.8.2007, 13:46 | ||
Что за функции мудрёные, что вы глумитесь, функция Image1MouseMove: загружаем новую картинку, функция FormMouseMove: загружаем старую картинку! |
Автор: mr.Anderson 5.8.2007, 16:47 |
xKOCMOCx, вообще, ваш вариант не совсем правильный. Не всегда за пределами этого изображения будет находиться именно форма. А еще более сложный вариант - если изображение окружено несколькими другими объектами. Тогда придется прописывать перезагрузку картинки для каждого OnMouseMove на каждом из этих контролов. Чего огород-то городить?! Плюс представьте, что мы сделаем загрузку картинки по ImageMouseMove. Что тогда? При ДВИЖЕНИИ МЫШИ по этому изображению картинка будет постоянно перезагружаться! Можно, конечно, это искусственно обойти, но вместе с вышесказанным это будет вообще сверхтяжелый код. И очень нерациональный, имхо. |
Автор: Uraxa 11.8.2007, 23:29 | ||
насколько я вкупил речь идет о нескольких версиях bcb. а помоему таймер нах. Лучшеиспользовать локальную переменную
также возможно я наврал с тру и фалос, не очень помню как там фф bool но надеюсь моё предложение поятно. |