У меня есть главное окно программы. Я создаю modeless диалог (от CDialogImpl). В нем 3 кнопки.
Проблема в том, что нельзя переключать фокус с помощью клавиатуры между этими кнопками. Т.е. стрелки влево и вправо не работают; если нажать Tab, вызывается обработчик акселератора из главного окна.
Я пробовал задавать в качестве родительского окна хэндл главного или нуль — результат один и тот же.
На мышь диалог реагирует нормально.
Если создать его модальным, тоже все нормально.
Как пофиксить?
Здравствуйте ilya123, Вы писали:
I>У меня есть главное окно программы. Я создаю modeless диалог (от CDialogImpl). В нем 3 кнопки. I>Проблема в том, что нельзя переключать фокус с помощью клавиатуры между этими кнопками. Т.е. стрелки влево и вправо не работают; если нажать Tab, вызывается обработчик акселератора из главного окна. I>Я пробовал задавать в качестве родительского окна хэндл главного или нуль — результат один и тот же. I>На мышь диалог реагирует нормально. I>Если создать его модальным, тоже все нормально. I>Как пофиксить?
Клавиатурную навигацию в диалоге реализует функция IsDialogMessage, которую надо вызывать в цикле сообщений. Для модального диалога это делается само внутри функции DialogBox (а CDialogImpl::DoModal испольщует именно её). А для немодального ты должен сделать это сам.
Проще всего сделать твой диалог фильтром сообщений (пронаследоваться от CMessageFilter), реализовать метод PreTranslateMessage, вызвать в нём IsDialogMessage и зарегистрировать твой фильтр в цикле сообщений (CMessageLoop::AddMessageFilter).
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
В моем случае главное окно программы — модальный диалог, и из него вызывается немодальный диалог, в котором и возникает рассматриваемая проблема. Чтобы применить предложенный вами способ, нужно где-то взять MessageLoop, или, может, надо применять какой-то иной способ? Подскажите, пожалуйста
Здравствуйте, Epelan, Вы писали:
E>Здравствуйте, Alexander Shargin
E>В моем случае главное окно программы — модальный диалог, и из него вызывается немодальный диалог, в котором и возникает рассматриваемая проблема. Чтобы применить предложенный вами способ, нужно где-то взять MessageLoop, или, может, надо применять какой-то иной способ? Подскажите, пожалуйста
Это не возможно. Мы не имеем доступ к message loop, органицуемому в DialogBoxParam.