R@kot |
Отправлено: 20.02.2005, 06:31 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 32
|
Вот в чём вопрос:
На форме имеется Лабел синего цвета. Требуется при наведении на него мышью изменить цвет на красный, а как только мышь перестанет находиться над Лабелом, снова вернуть ему синий цвет. Как узнать, что мышь больше не находится над надписью?
Помогите, кому не лень, плиз!
|
|
** 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
|
Блин, ну надо ж было взять такой неудачный пример! Вообще-то изначально мне нужно было, чтобы не Label менял свой цвет, а менялся Picture у Image'а (как в Windows XP, когда наводишь мышкой на крест закрытия окна), но я обобщил, решив, что в этом отношении особой разницы между компонентами не будет. И вот, блин, оболомался — у Label'а действительно есть события OnMouseEnter и OnMouseLeave (кстати, спасибо, ребята — сам я что-то не углядел ), а вот у 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 Так что теперь всё в ажуре
|
|
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
Можно взять оконный компонент типа 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.
Не спорю, конечно коряво НО РАБОТАЕТ! А в моей ситуации это было самое главное.
Кстати, идея Rius'а насчёт прозрачного TLabel мне безумно понравилась — простенько и со вкусом, а главное — тоже неплохо работает, да и мороки поменьше ! Так что отдельное ему спасибо!
|
|