Консультация № 63743
22.11.2006, 17:39
0.00 руб.
0 3 2
Народ хелп, надо чтобы при наведение курсора мышки на обект класа CStatic (В Visual C++), статик менял цвет или картинку, никак разобратса немогу, и еще одно ... есть какаято ф-я которая возвращает по ID координаты обекта, или что то похожее, зарание благодарен.

Обсуждение

Неизвестный
22.11.2006, 17:50
общий
А с чем конкретно разобраться не можете? Как движение мышки поймать в статике или цвет сменить? Сформулируйте вопрос точнее, пожалуйста.
Неизвестный
22.11.2006, 18:16
общий
это ответ
Здравствуйте, nazarini!
1) Нужно для статика установить свойства NOTIFY. Затем создать свой класс производный от CStatic и обрабатывать события наведения и ухода мышки.
Ну и в OnPaint рисуешь что надо в зависимости от переменной состояние m_is_hover.
2) Есть несколько вариантов, мой см. в приложении.

Приложение:
1)Свой класс Staticclass CLabel : public CStatic{...afx_msg void OnMouseMove(UINT nFlags, CPoint point);afx_msg void OnMouseLeave(WPARAM, LPARAM);void ActivateHover();bool m_is_hover;...}Реализация:void CLabel::OnMouseMove(UINT nFlags, CPoint pt){ bool is_last = m_is_hover; m_is_hover = true; ActivateHover(); if (!is_last) { Invalidate(); }}void CLabel::OnMouseLeave(WPARAM, LPARAM){ m_is_hover = false; Invalidate();}// без этого событие mouse leave никогда не сработаетvoid CLabel::ActivateHover(){ TRACKMOUSEEVENT csTME; csTME.cbSize = sizeof(csTME); csTME.dwFlags = TME_LEAVE; csTME.hwndTrack = m_hWnd; ::_TrackMouseEvent(&csTME);}2)RECT CDialog::GetRectWindow(UINT id){ CWnd * wnd = GetDlgItem(id); ASSERT(wnd); WINDOWPLACEMENT place; wnd->GetWindowPlacement(&place); return place.rcNormalPosition;}
Неизвестный
22.11.2006, 18:40
общий
это ответ
Здравствуйте, nazarini!
Вам следует написать класс потомок для контрол-элемента и перекрыть в нем обрабодчик системного сообщения WM_MOUSEMOVE. Типичный код этого обрабодчика, реализующий отлов наведения и ухода мыши с контрол-элемента приведен в приложении. Кстати, класс CStaticLink потомок класса CStatic

Желаю успехов

Приложение:
void CStaticLink::OnMouseMove(UINT nFlags, CPoint point){ if(this == GetCapture()) { CPoint pt; CRect rc; GetWindowRect(&rc); pt = GetMessagePos(); if(!rc.PtInRect(pt)) { ReleaseCapture(); //Мышь ушла с контрол-элемента } } else { SetCapture(); ::SetCursor(m_hCursor); //Мышь навелась на контроль-элемент }}
Форма ответа