C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Событие OnMouseMove
R@kot
  Отправлено: 20.02.2005, 06:31


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Вот в чём вопрос:
На форме имеется Лабел синего цвета. Требуется при наведении на него мышью изменить цвет на красный, а как только мышь перестанет находиться над Лабелом, снова вернуть ему синий цвет. Как узнать, что мышь больше не находится над надписью?
Помогите, кому не лень, плиз! smile.gif
** Sergey
Отправлено: 20.02.2005, 12:08


Не зарегистрирован







В событии OnMouseEnter пишешь Label->Color=нужный цвет
В событии OnMouseLeave Label->Colr=clBlue(или какой там тебе цвет надо)
Sl@Sh
Отправлено: 20.02.2005, 14:42


Мастер участка

Группа: Участник
Сообщений: 383



QUOTE
В событии OnMouseEnter пишешь Label->Color=нужный цвет
В событии OnMouseLeave Label->Colr=clBlue(или какой там тебе цвет надо)


Этот код изменит цвет фона Label. А если вы хотите менять цвет текста, то так Label->Font->Color = clRed;
R@kot
Отправлено: 21.02.2005, 04:14


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Блин, ну надо ж было взять такой неудачный пример! sad.gif Вообще-то изначально мне нужно было, чтобы не Label менял свой цвет, а менялся Picture у Image'а (как в Windows XP, когда наводишь мышкой на крест закрытия окна), но я обобщил, решив, что в этом отношении особой разницы между компонентами не будет. И вот, блин, оболомался — у Label'а действительно есть события OnMouseEnter и OnMouseLeave (кстати, спасибо, ребята — сам я что-то не углядел smile.gif ), а вот у Image-то нету :'(
Георгий
Отправлено: 21.02.2005, 10:25


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



делал так:
под image клал панель большую чем image на 20-40 пикселей
и когда получал сообщение что мышка над панелью — то считал, что её нет над image (вроде логично)

правда при резких рывках мышкой можно было убрать курсор с image не наехав на panel
olegenty
Отправлено: 21.02.2005, 11:51


Ветеран

Группа: Модератор
Сообщений: 2412



Application шлёт контролу внутреннее "пользовательское" сообщение CM_MOUSELEAVE. стоит его обработать, и желаемый результат будет достигнут. сам пользовался, когда писал контрол — поле морского боя, и нужно было избавиться от подсветки квадратика, над которым находится мышь, когда мышь покидала контрол. сие событие мне оч. помогло.
R@kot
Отправлено: 23.02.2005, 01:29


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Спасибо за идеи, но мне подсказали как сделать ещё круче — просто написать класс-потомок класса TImage, у которого будут события OnMouseEnter и OnMouseLeave biggrin.gif Так что теперь всё в ажуре smile.gif
Gedeon
Отправлено: 23.02.2005, 09:46


Ветеран

Группа: Модератор
Сообщений: 1742



Переопределять WndProc, писать наследника — это конечно хорошо, но TImage не окно, как вы хотите реализовать эти события?
Rius
Отправлено: 23.02.2005, 11:12


Мастер участка

Группа: Участник
Сообщений: 321



QUOTE
под image клал панель большую чем image на 20-40 пикселей
и когда получал сообщение что мышка над панелью — то считал, что её нет над image (вроде логично)

правда при резких рывках мышкой можно было убрать курсор с image не наехав на panel
Когда-то и я так делал — поверх TImage клал прозрачный TLabel wink.gif
Можно взять оконный компонент типа TCustomPanel, добавить к нему TImage как свойство (или даже два) и потом просто перерисовывать по событию WM_Paint, сам рисунок менять по CM_MOUSELEAVE и CM_MOUSEENTER (по крайней мере у меня так работает)

Отредактировано Rius — 23/02/2005, 13:16
R@kot
Отправлено: 24.02.2005, 02:04


Дежурный стрелочник

Группа: Участник
Сообщений: 32



Gedeon, вот тот самый класс-потомок:

CODE

//Класс-потомок класса TImage, имеющий события OnEnter и OnLeave
class TMyImage:public TImage
{
public:

       //Событие OnMouseEnter
       virtual void __fastcall Process_OnEnter(TMessage &msg){
               Picture = EnterPic;
       }

       //Событие OnMouseLeave
       virtual void __fastcall Process_OnLeave(TMessage &msg){
               Picture = LeavePic;
       }

         

         //Конструктор, принимающий в качестве аргументов 2 картинки (когда мышка попадает на объект и когда
         //покидает его) и объект TImage, события которого присваиваются потом нашему объекту.          
       _fastcall TMyImage::TMyImage(TPicture* Pic1, TPicture* Pic2, TImage* ParentImage, TComponent*Owner):TImage(Owner){
               Picture = ParentImage->Picture;//Задаём начальную картинку для изображения
               Left = ParentImage->Left;
               Top = ParentImage->Top;
               OnClick = ParentImage->OnClick;
               OnMouseDown = ParentImage->OnMouseDown;
               OnMouseUp = ParentImage->OnMouseUp;
               Visible = true;
               AutoSize = true;

               EnterPic=Pic1;
               LeavePic = Pic2;

       }



private:

       TPicture* EnterPic;
       TPicture* LeavePic;


BEGIN_MESSAGE_MAP
       VCL_MESSAGE_HANDLER(CM_MOUSEENTER,TMessage,Process_OnEnter);
       VCL_MESSAGE_HANDLER(CM_MOUSELEAVE,TMessage,Process_OnLeave);
END_MESSAGE_MAP(TImage)
};




На форму кидается компонент TImage (который в дальнейшем и будет играть роль того самого ParentImage) в то место, на котором затем должен будет появиться новоявленный компонент TMyImage. Свойство Visible этого TImage cтавится в false (нам нужен не он сам, а только его положение и события).

Создаётся внутренняя переменная NewMyImage типа TMyImage* (наш будущий объект), а в событии формы OnCreate пишется:
CODE

NewMyImage = new TMyImage(MouseMovePicture, NormalPicture, ParentImage, this);
NewMyImage_Image->Parent = this;


где MouseMovePicture и NormalPicture — картинки, которые появляются при событии OnMouseEnter и OnMouseLeave (они либо грузятся из внешних файлов, либо берутся у TImage'ей на форме).

И наконец, просто заполняются события компонента TImage (нашего ParentImage). Эти события будут выполняться при нажатии на компонент NewMyImage.


Не спорю, конечно коряво sad.gif НО РАБОТАЕТ! biggrin.gif А в моей ситуации это было самое главное.


Кстати, идея Rius'а насчёт прозрачного TLabel мне безумно понравилась — простенько и со вкусом, а главное — тоже неплохо работает, да и мороки поменьше wink.gif ! Так что отдельное ему спасибо!


Вернуться в Вопросы программирования в C++Builder