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

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

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

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

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

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

Как в диалоге отловить событие помещения фокуса на какой-нибудь контрол? - C++
Привет всем! А как, собственно говоря, в диалоге отловить событие помещения фокуса на какой-нибудь контрол? Ну т.е. нажали на...

В диалоге лист-контрол, как в InitDialog добавить туда столбец? - C++
Сабж. Нарисовал диалог, в нем лист-контрол. Как туда добавить столбец? Понятно что с помощью InsertColumn, а как её заюзать что-то не...

Как отловить событие модема "линия занята"? - C++
Событие CONNECT отловить легко через функцию WaitCommEvent(). А как отловить событие BUSY? конечно можно читать и парсировать сообщения...

Как отловить событие перехода по ссылке в TWebBrowser? - Delphi
Через бифорнавигате2, по выделенной строке не получается , мб есть какие нибудь другие подходы? не очень хорошо знаком с твеббров. он...

Как установить в диалоге фокус на нужный контрол? - Java
Подскажите, пожалуйста, новичку как установить в диалоге фокус на нужный контрол. Для расположения компонентов на диалоге я использую сетку...

Как отловить опускание клавиши на лист контрол? - Visual C++
Как отловить опускание на ней клавиши ??? Такого обработчика не нашёл :((

3
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);
}
Удачи, Владимир
0
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);
}
Удачи, Владимир
0
30.12.2009, 23:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.12.2009, 23:56
Привет! Вот еще темы с ответами:

Как отловить событие ? - jQuery
Есть следующее: <div id="asd"> <div class="qwe"> <div id="1" class="zxc"></div> <div id="2"...

Как создать событие пользовательского контрола? - C# ASP.NET
Как создать событие созданного пользовательского контрола?

Как отловить событие формы? - 1С
Подскажите как отловить событие формы? В модуле формы пишу процедуру с именем события. Открывал, записывал и тд не работает. Что открываю...

Как отловить событие WM_SIZE? - C++ WinAPI
создаю окно, wndproc switch (Message) { case WM_CLOSE: case WM_SIZE: PostMessage(nullptr, Message, wParam, lParam); ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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