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

Тема в разделе "MS Visual C++", создана пользователем Artur1987, 9 апр 2014.

  1. Artur1987

    Artur1987 Active Member

    Регистрация:
    31 мар 2007
    Сообщения:
    31
    Симпатии:
    0
    Доброго времени суток! Хотелось бы узнать мнения профессионалов по вот какому вопросу. Я пытаюсь реализовать передачу фокуса ввода элементу диалогового окна, когда курсор мыши попадает в область этого элемента. Получается пока не очень.

    Итак, кратко и по сути. Есть главное диалоговое окно. В окне есть элемент список (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. Подобный алгоритм реализован практически везде, включая этот форум. как же его запрограммировать?..
     
Загрузка...

Поделиться этой страницей