Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.135.217.228] |
|
Сообщ.
#1
,
|
|
|
Есть MDI приложение. В нем CView. Открываю CView, начинаю ввод с клавиатуры. Сообщения от клавиатуры не приходят! От мыши приходят, а от клавиатуры нет. Если окно CView свернуть и развернуть, то сообщения от клавиатуры начинают приходить. Пробовал разные варианты, устанавливал фокус, активировал просмотр, трассировал процесс открытия просмотра, ничего не получается. Где грабли?
|
Сообщ.
#2
,
|
|
|
Цитата a_n_y_a @ Есть MDI приложение. В нем CView. Открываю CView, начинаю ввод с клавиатуры. Сообщения от клавиатуры не приходят! От мыши приходят, а от клавиатуры нет. Если окно CView свернуть и развернуть, то сообщения от клавиатуры начинают приходить. Пробовал разные варианты, устанавливал фокус, активировал просмотр, трассировал процесс открытия просмотра, ничего не получается. Где грабли? Проблема решена, дело в следующем, в CView создается объект: mv = new CVosprZvukVideo(this); mv->Create(IDD_VOSPROIZVEDENIE_ZVUKA_VIDEO, this); IDD_VOSPROIZVEDENIE_ZVUKA_VIDEO - это диалог, и его инициализация заканчивается оператором return TRUE; Соответственно фокус ввода устанавливается на этот диалог, а не на CView! Я это заметил, но переключение фокуса ввода на CView, после сворачивания и разворачивания окна, ввело меня в заблуждение. Когда все варианты были исчерпаны, я проверил последний, изменил: return TRUE; на return FALSE; и все заработало! |
Сообщ.
#3
,
|
|
|
Но есть непонятки. Создаю диалог в окне просмотра:
mv = NULL; mv = new CVosprZvukVideo(this); BOOL Rez = FALSE;/// Rez=mv->Create(IDD_VOSPROIZVEDENIE_ZVUKA_VIDEO, this); В диалоге инициализация с выходом TRUE: BOOL CVosprZvukVideo::OnInitDialog() { CDialogEx::OnInitDialog(); // TODO: Add extra initialization here return TRUE; // return TRUE unless you set the focus to a control } Если посмотреть работу функции: BOOL CVievDom::PreTranslateMessage(MSG* pMsg) { if (pMsg->message== WM_CHAR) Rez = Rez; /// Вот здесь я ставлю точку останова } то фокус ввода на диалоге и при нажатии кнопки клавиатуры сообщение WM_CHAR в просмотр не приходит! Но объект диалога в окне просмотра! Сообщения должны сначала приходить в главное окно и только потом в дочерние?! Я правильно понимаю? Или майкрософтовцы чего-то с диалогом намудрили? После сворачивания и разворачивания окна просмотра сообщения от клавиатуры начинают приходить в просмотр и срабатывает точка останова. |
Сообщ.
#4
,
|
|
|
Цитата a_n_y_a @ то фокус ввода на диалоге и при нажатии кнопки клавиатуры сообщение WM_CHAR в просмотр не приходит! Но объект диалога в окне просмотра! Сообщения должны сначала приходить в главное окно и только потом в дочерние?! Я правильно понимаю? Или майкрософтовцы чего-то с диалогом намудрили? После сворачивания и разворачивания окна просмотра сообщения от клавиатуры начинают приходить в просмотр и срабатывает точка останова. Что у тебя возвращает функция PreTranslateMessage, когда летит WM_CHAR ? Диалоговые окна съедают все сообщения внутри своей функции PreTranslateMessage, чтоб оно пошло дальше, ЕМНИП нужно возвращать не return PreTranslateMessage(pMsg), а return false(или что там чтоб сообщение пошло дальше). Это стандартное поведение MFC диалогов. Добавлено Почитай ка еще вот эту статейку: https://rsdn.org/article/mfc/maze.xml |