Как Правильно Передавать Фокус Ввода Элементам?

Artur1987

Active Member
31.03.2007
31
0
#1
Доброго времени суток! Хотелось бы узнать мнения профессионалов по вот какому вопросу. Я пытаюсь реализовать передачу фокуса ввода элементу диалогового окна, когда курсор мыши попадает в область этого элемента. Получается пока не очень.

Итак, кратко и по сути. Есть главное диалоговое окно. В окне есть элемент список (CListBox). Нужно, чтобы фокус ввода передавался к ListBox, если курсор мыши находится внутри элемента, и возвращался обратно к диалоговому окну, если курсор мыши покидает область элемента ListBox.

Я реализовал это через координаты курсора мыши point.x и point.y (кусочек кода выделен цветом). Проблема в том, что фокус передаётся, только если перемещать мышь медленно и плавно (и только справа налево почему-то). А если перемещать мышь чуть быстрее, фокус не передаётся. Мне кажется, что алгоритм должен быть в принципе другим. Может быть, попробовать через класс CRegion ? Очень надеюсь на толковый совет.



void CFilmotekaView::OnMouseMove(UINT nFlags, CPoint point)
{
CRect mainWndRect; //для хранения координат главного диалога
CRect childWndRect; //для хранения координат ListBox
this->GetWindowRect(mainWndRect);

CWnd* pWnd = (CWnd*) GetDlgItem(IDC_LIST1);
if(pWnd->IsWindowEnabled() &&
pWnd->IsWindowVisible())
{​
pWnd->GetWindowRect(childWndRect);

//рассчитываю координаты ListBox относительно CDialog и проверяю,
//находится ли курсор внутри элемента

if(point.x > (childWndRect.left - mainWndRect.left) &&
point.x < (childWndRect.right - mainWndRect.left) &&
point.y > (childWndRect.top - mainWndRect.top) &&
point.y < (childWndRect.bottom - mainWndRect.top))
{
pWnd->SetFocus();
pWnd->HideCaret();​
}

// ...если нет, то установить фокус на родительском окне
else
{
this->SetFocus();​
}​
}
COleDBRecordView::OnMouseMove(nFlags, point);​
}

P.S. Подобный алгоритм реализован практически везде, включая этот форум. как же его запрограммировать?..