Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
verter
Сообщений: n/a
#1

Как отловить событие перехода с контрола на контрол в диалоге? - C++

28.12.2009, 12:13. Просмотров 858. Ответов 3
Метки нет (Все метки)

Есть диалог. На нём лежит несколько контролов(нестандартных).Как средствами самого диалога отловить событие перехода с контрола на контрол?Т.е., например, нельзя использовать сообщение EN_KILLFOCUS,потому что в моём случае такие контролы, которые ничего подобного не посылают.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2009, 12:13     Как отловить событие перехода с контрола на контрол в диалоге?
Посмотрите здесь:

C++ Как отловить закрытие программы?
C++ Как из CStatic сделать контрол?
C++ Как из дочерних форм добраться до методов и свойств контрола?
Как отловить событие модема "линия занята"? C++
C++ В диалоге лист-контрол, как в InitDialog добавить туда столбец?
C++ Как в диалоге отловить событие помещения фокуса на какой-нибудь контрол?
C++ Файлы. Как отловить конец строки.
C++ Как отловить буфер обмена!?
C++ Как отловить место критической ошибки?
C++ Как отловить переполнения?
Как сделать проверку перехода на новую строку? C++
Как отловить +/-INF и NAN? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
29.12.2009, 20:45     Как отловить событие перехода с контрола на контрол в диалоге? #2
Достаточно тривиальная задача, решаемая в рамках MFC путем переопределения ф-ции PreTranslateMessage, например:

Код
BOOL CMySweetyDlg::PreTranslateMessage(MSG* pMsg)
{
    if ((pMsg->message == WM_KEYDOWN) || (pMsg->message == WM_KEYUP))
    {
        // Catch if Tab key was pressed
        if (pMsg->wParam != VK_TAB)
        {
            // Do what ever we supposed to
            // ...
        }
    }

    return CDialog::PreTranslateMessage(pMsg);
}
Удачи, Владимир
verter
Сообщений: n/a
30.12.2009, 10:52     Как отловить событие перехода с контрола на контрол в диалоге? #3
Во-первых, большое спасибо за отклик. А во-вторых, задача на самом деле не такая уж и сложная, но и не тривиальная. Ptretranslate'ом можно отловить нажатие на табуляцию и с помощью вызова GetFocus() получить контрол С КОТОРОГО переходим на следующий по списку табуляции, т.е. фокус принимает СЛЕДУЮЩИЙ контрол. Мне нужно идентифицировать как раз СЛЕДУЮЩИЙ контрол, а не С КОТОРОГО. К тому же с табуляцией я смогу разобраться только клавиатурой. А если контрол выбирают мышкой? Тогда в этом же Pretranslate'е нужно отловить LBUTTUNDOWN и RBUTTONDOWN, но там я смогу опять же определить контрол С КОТОРОГО, а мне нужен СЛЕДУЮЩИЙ. Понимаешь?
Я решил уже эту задачу поставив таймер(WM_TIMER), в обработчике которого каждые 500 мс вызываю GetFocus() и запоминаю в переменной класса диалога указатель на контрол который в данный момент в фокусе.
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
30.12.2009, 23:56     Как отловить событие перехода с контрола на контрол в диалоге? #4
Чтобы не мудрить особо, позволю просто с Вами не согласиться по поводу нетривиальности проблемы и преведу пример, который немногим сложнее предыдущего, но в отличие от оного позволяет определить текст, содержащийся в эелементе получившем фокус:

Код
BOOL CTabTestDlg::PreTranslateMessage(MSG* pMsg)
{
    char str[200];

    // Tabulation
    if (pMsg->wParam == VK_TAB)
    {
        if (pMsg->message == WM_KEYDOWN)
        {
            // Will give us a pointer to the control that is losing focus

            //::GetWindowText(pMsg->hwnd, (char*)&str, 200);
            //AfxMessageBox((char*)&str);
        } else if (pMsg->message == WM_KEYUP)
        {
            // Will return a pointer to the control that has received focus

            ::GetWindowText(pMsg->hwnd, (char*)&str, 200);
            AfxMessageBox((char*)&str);
        }
    }

    // Mouse click
    if (pMsg->message == WM_LBUTTONUP)
    {
        // Exclude the click over the form
        if (pMsg->hwnd != m_hWnd)
        {
            ::GetWindowText(pMsg->hwnd, (char*)&str, 200);
            AfxMessageBox((char*)&str);
        }
    }

    return CDialog::PreTranslateMessage(pMsg);
}
Удачи, Владимир
Yandex
Объявления
30.12.2009, 23:56     Как отловить событие перехода с контрола на контрол в диалоге?
Ответ Создать тему
Опции темы

Текущее время: 17:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru