Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить фокус ввода для собственного окна 
:(
    Опции темы
lgv
Дата 25.1.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Добрый день, такой вопрос: 
создаю в ручную некое окно примерно так
m_bwnd = new CBaseWnd; // мой клас наследник CWnd
m_bwnd->CreateEx( 0, AfxRegisterWndClass(0),
        _T("title"), WS_CHILD | WS_VISIBLE | WS_BORDER | WS_TABSTOP,
        CRect(0, 0, 50, 50),
        this,
        NULL,
        NULL );
теперь нужно, чтобы это окно получало фокус ввода и реагировало не только на мышь но и на нажатие кнопок мыши.
Как заставить такое окно реагировать на клавиатурный ввод (предполагаю, что окно должно получить стату контрола, но не уверен)?
Спасибо.
PM MAIL   Вверх
Earnest
Дата 25.1.2010, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Установить фокус - SetFocus(). А чтобы "реагировало" - писать нужно, как именно.


--------------------
...
PM   Вверх
lgv
Дата 25.1.2010, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Цитата(Earnest @ 25.1.2010,  16:47)
Установить фокус - SetFocus(). А чтобы "реагировало" - писать нужно, как именно.

ну, да, фокус окно обрабатывает, если искусственно перевести его ф-цией SetFocus, тогда почему окно молчит на нажатие кнопок?
PM MAIL   Вверх
Earnest
Дата 25.1.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



А ты ждал, что оно петь тебе будет? У CWnd нет реакции на клавиатуру по-умолчанию. Реакция - это обработка событий + реализация нужного поведения. Сначала определи, что ты хочешь увидеть, потом пропиши это. В зависимости от задачи, лови либо WM_CHAR, либо WM_KEYDOWN\WM_KEYUP. 
С мышью аналогично: обрабатывай WM_LBUTTONDOWN, ...UP, ...DBLCLK и т.д. - что нужно.


--------------------
...
PM   Вверх
lgv
Дата 25.1.2010, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 25.1.2010

Репутация: нет
Всего: нет



Цитата(Earnest @ 25.1.2010,  17:02)
А ты ждал, что оно петь тебе будет? У CWnd нет реакции на клавиатуру по-умолчанию. Реакция - это обработка событий + реализация нужного поведения. Сначала определи, что ты хочешь увидеть, потом пропиши это. В зависимости от задачи, лови либо WM_CHAR, либо WM_KEYDOWN\WM_KEYUP.

нет, спасибо, петь я сам буду, когда окно будет ловить KEYDOWN smile
в этом и вопрос, почему KEYDOWN не приходит после появления фокуса ввода, а также почему фокус не сходит после табуляции.

на другов форуме советовали прикрутить IsDialogMessage в PreTranslateMessage, но пока этот вариант тоже результата не дал.
PM MAIL   Вверх
GavriKos
Дата 26.1.2010, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Код в студию. по поводу табуляции - окно ловит все сообщения, потом кидает нужные выделенному потомку себя (вроде так).

Тебе нужно чтобы KEYDOWN пришел именно когда фокус появился? 
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Earnest
Дата 26.1.2010, 09:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Давай по порядку.
1) Переход фокуса по табуляции - это вовсе не встроенное поведение. За это обычно отвечает родительский диалог. Если родитель не диалог (CDialog), то это поведение нужно прикрутить, как тебе правильно посоветовали, написав  PreTranslateMessage с IsDialogMessage - в родительском окне! А как писать - спиши слова в MFC, можно в диалоге.
2) Обработчик WM_KEYDOWN нужно писать в своем дочернем окне. Если управление туда не приходит, нужно разбираться, почему. И тут есть масса вариантов сделать неправильно: от неправильно встроенного обработчика до перехвата сообщения кем-то еще.


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1686 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.