switch(Msg.LParam)
{
case WM_RBUTTONUP:
if (GetCursorPos(&MousePos))
{
//Твой код
}
break;
case WM_LBUTTONUP:
if (GetCursorPos(&MousePos))
{
//Твой код
}
break;
case WM_MOUSEMOVE:{
if (GetCursorPos(&MousePos))
{
//Твой код
}
}
default:
break;
}
Наведении мыши на объект
Меня же интересует есть ли такое подобие этих действий у ComboBox, т.к. этого действия я там не нашел.
Цитата:
Originally posted by ADanilov
У объекта Label есть событие OnMouseMove, OnMouseEnter и т.д. по которому можно настроить любое действие.
Меня же интересует есть ли такое подобие этих действий у ComboBox, т.к. этого действия я там не нашел.
У объекта Label есть событие OnMouseMove, OnMouseEnter и т.д. по которому можно настроить любое действие.
Меня же интересует есть ли такое подобие этих действий у ComboBox, т.к. этого действия я там не нашел.
Самое простое (хотя, наверно и самое корявое) решение - при наведении мыши на форму начиинать сравнивать через определенные интервалы времени координаты курсора с координатами ComboBox. На всякий случай, взятие координат курсора:
TPoint CurrPos;//структура для хранения координат
GetCursorPos(&CurrPos);//Теперь в CurrPos.x - координаты Х, а в CurrPos.y - координаты У.
Цитата:
Originally posted by pacific_7
Самое простое (хотя, наверно и самое корявое) решение - при наведении мыши на форму начиинать сравнивать через определенные интервалы времени координаты курсора с координатами ComboBox. На всякий случай, взятие координат курсора:
TPoint CurrPos;//структура для хранения координат
GetCursorPos(&CurrPos);//Теперь в CurrPos.x - координаты Х, а в CurrPos.y - координаты У.
Самое простое (хотя, наверно и самое корявое) решение - при наведении мыши на форму начиинать сравнивать через определенные интервалы времени координаты курсора с координатами ComboBox. На всякий случай, взятие координат курсора:
TPoint CurrPos;//структура для хранения координат
GetCursorPos(&CurrPos);//Теперь в CurrPos.x - координаты Х, а в CurrPos.y - координаты У.
А если посложнее решение, можно ли создать самомтоятельно событие для любого элемента. Ну, например, OnMouseMove?
Цитата:
Originally posted by ADanilov
А если посложнее решение, можно ли создать самомтоятельно событие для любого элемента. Ну, например, OnMouseMove?
А если посложнее решение, можно ли создать самомтоятельно событие для любого элемента. Ну, например, OnMouseMove?
Самое простое решение - обрабатывать сообщения винды:
Код:
Естественно для этого необходимо зарегестрировать карту сообщений конкретному компоненту
Код:
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_DRAWITEM,TMessage,DrawItem)
MESSAGE_HANDLER(MYWM_NOTIFY,TMessage,MyNotify)
END_MESSAGE_MAP(TComboBox)
MESSAGE_HANDLER(WM_DRAWITEM,TMessage,DrawItem)
MESSAGE_HANDLER(MYWM_NOTIFY,TMessage,MyNotify)
END_MESSAGE_MAP(TComboBox)
И установить функцию обработчик. И всех делов. Или вариант второй - наследовать от нужного компонента свой компонент - определив в нем нужные события. Если это события в компоненте для тебя жизненно важно - второй путь предпочтительней.
Цитата:
Originally posted by ADanilov
А если посложнее решение, можно ли создать самомтоятельно событие для любого элемента. Ну, например, OnMouseMove?
А если посложнее решение, можно ли создать самомтоятельно событие для любого элемента. Ну, например, OnMouseMove?
Общая схема сабклассирования какого-либо контрола:
В хедере...
Код:
private: // User declarations
TWndMethod OldControlWP; //это адрес "старой" оконной процедуры контрола
void __fastcall SubClassControlWP(Messages::TMessage &Message);//это наша оконная процедура
TWndMethod OldControlWP; //это адрес "старой" оконной процедуры контрола
void __fastcall SubClassControlWP(Messages::TMessage &Message);//это наша оконная процедура
в cpp
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//сохраняем адрес оконной проц. контрола
OldControlWP = Control1->WindowProc;
//устанавливаем нашу ок. проц.
Control1->WindowProc = SubClassControlWP;
}
//------------------------------------------------
void __fastcall TForm1::SubClassControlWP(Messages::TMessage &Message)
{
if (Message.Msg == code/*код сообщения WM_ и т. д.*/) {
/*обрабатываем сообщение*/
...
OldControlWP(Message);//незабываем вызвать старую оконную проц.
}
else
OldControlWP(Message);//тоже самое
}
: TForm(Owner)
{
//сохраняем адрес оконной проц. контрола
OldControlWP = Control1->WindowProc;
//устанавливаем нашу ок. проц.
Control1->WindowProc = SubClassControlWP;
}
//------------------------------------------------
void __fastcall TForm1::SubClassControlWP(Messages::TMessage &Message)
{
if (Message.Msg == code/*код сообщения WM_ и т. д.*/) {
/*обрабатываем сообщение*/
...
OldControlWP(Message);//незабываем вызвать старую оконную проц.
}
else
OldControlWP(Message);//тоже самое
}
Возник еще один вопрос. В том случае если у элемента установлено свойствой Enabled = false , то у него не всплывает подсказка которая настроена по событию MouseMove. Можно ли это как то исправить?
Цитата:
Originally posted by ADanilov
[QUOTE]Originally posted by GIZMO
Возник еще один вопрос. В том случае если у элемента установлено свойствой Enabled = false , то у него не всплывает подсказка которая настроена по событию MouseMove. Можно ли это как то исправить?
[QUOTE]Originally posted by GIZMO
Возник еще один вопрос. В том случае если у элемента установлено свойствой Enabled = false , то у него не всплывает подсказка которая настроена по событию MouseMove. Можно ли это как то исправить?
Enabled = false -> вызывается EnableWindow(Handle, false)->MouseMove нет.