Есть диалог в котором расположены несколько контролов.
Контролы создаются на куче в OnCreate().
Не работало переключение фокуса по нажатию клавиши Tab.
Я занялся извращением и переопределил метод PreTranslateMessage(), в котором по нажатию клавиши Tab переключал фокус вручную путем m_pControl->SetFocus();
Но тут появилась вторая проблема — фокус переключается, но не отрисовывается FocusRect (Рамочка фокуса). Использовать DrawFocusRect() не предлагать. Я конечно извращенец, но не до такой же степени.
Помогите пожалуйста с этим болотом под названием MFC
Здравствуйте, <Аноним>, Вы писали:
А>Имею небольшую проблему:
А>Есть диалог в котором расположены несколько контролов. А>Контролы создаются на куче в OnCreate(). А>Не работало переключение фокуса по нажатию клавиши Tab. А>Я занялся извращением и переопределил метод PreTranslateMessage(), в котором по нажатию клавиши Tab переключал фокус вручную путем m_pControl->SetFocus();
А>Но тут появилась вторая проблема — фокус переключается, но не отрисовывается FocusRect (Рамочка фокуса). Использовать DrawFocusRect() не предлагать. Я конечно извращенец, но не до такой же степени.
А>Помогите пожалуйста с этим болотом под названием MFC
Здравствуйте, Кодт, Вы писали:
К>Это не болото, это ты забыл им стиль WS_TABSTOP включить, наверно.
Вот у меня такой вопрос, если создавать контролы динамически то у них перемещение по Tab в порядке создания будет — у меня была задача сделать между кнопками диалога свой динамический контрол, так беда в том что таб ордер он получает последний, а нужно чтобы следующий за кнопкой. Как это победить?
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Помогите пожалуйста с этим болотом под названием MFC
К>Это не болото, это ты забыл им стиль WS_TABSTOP включить, наверно
Стиль какраз-таки стоит везде. Проблема в другом. В настройках виндовз есть опция отключения этой рамочки по-умолчанию. Она появляется если нажать alt. Можно отключить ее и тогда рамочка будет видна всегда.
Например в ХР — правый щелчек по десктопу -> свойства -> оформления -> эффекты
там есть чекбокс соответствующий.
Возникает логичный вопрос — можно как-нить включить эту рамку для конкретного диалога, не изменяя настроек винды в реестре. Можно в принципе слать WM_KEYDOWN — VK_ALT, но это как-то не кашерно )
Здравствуйте, zitz, Вы писали:
Z>Поправьте пожалуйста форматирование
Z>Смысл в том что нужно вызывать не SetFocus, а WM_NEXTDLGCTL
Спасибо, я помню пробовал и такой вариант, но фокус не переключается. Вполне возможно что я делал что-то неправильно. Но смысл был у меня такой же как и в вашенм примере.
Z>Вот у меня такой вопрос, если создавать контролы динамически то у них перемещение по Tab в порядке создания будет — у меня была задача сделать между кнопками диалога свой динамический контрол, так беда в том что таб ордер он получает последний, а нужно чтобы следующий за кнопкой. Как это победить?
Победить это можно вызовом SetWindowPos, меняя z-ордер контрола. Табордер в диалоге — он же z-order.
A>Стиль какраз-таки стоит везде. Проблема в другом. В настройках виндовз есть опция отключения этой рамочки по-умолчанию. Она появляется если нажать alt. Можно отключить ее и тогда рамочка будет видна всегда.
A>Например в ХР — правый щелчек по десктопу -> свойства -> оформления -> эффекты A>там есть чекбокс соответствующий.
A>Возникает логичный вопрос — можно как-нить включить эту рамку для конкретного диалога, не изменяя настроек винды в реестре. Можно в принципе слать WM_KEYDOWN — VK_ALT, но это как-то не кашерно )
Смотри в сторону сообщений WM_CHANGEUISTATE, WM_UPDATEUISTATE и т.д.
А>>Я занялся извращением и переопределил метод PreTranslateMessage(), в котором по нажатию клавиши Tab переключал фокус вручную путем m_pControl->SetFocus();
А вот это делать не надо. Не отбирайте хлеб у функции IsDialogMessage.
Она вызывается в CDialog::PreTranslateMessage() и прекрасно справляется с переключением фокуса и
другими особенностями диалоговых окон.