Заставить клавишу TAB работать в диалоге Windows - PullRequest
3 голосов
/ 28 сентября 2010

Я работаю над проектом Windows с простым диалогом, созданным с помощью CreateWindowEx(). Он содержит несколько панелей, загруженных с помощью CreateDialog() для загрузки макета из файла ресурсов. На дочерних панелях есть несколько элементов управления, в том числе текстовые поля и кнопки, которые я хотел бы использовать TAB для навигации, но все, что я получаю, это «bing» Windows, сообщающий мне, что ключ ничего не делает. Мой цикл сообщений выглядит так:

while( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
{
    if( !IsDialogMessage(0, &msg) )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}

И каждое окно управления имеет WS_TABSTOP, установленный в стиле, а также панель владельца, имеющую WS_EX_CONTROLPARENT.

Что еще нужно сделать, чтобы клавиша Tab работала?

Спасибо, J * +1010 *

Ответы [ 3 ]

3 голосов
/ 28 сентября 2010

Попробуйте это:

http://support.microsoft.com/kb/71450 (Как использовать один вызов IsDialogMessage () для многих немодальных диалогов)

Ваши панели - это немодальные диалоги, и IsDialogMessage отвечает за обработку клавиш Tab. Я надеюсь, что эта статья точно соответствует вашему случаю.

2 голосов
/ 28 сентября 2010

Стиль WS_TABSTOP Стиль WS_TABSTOP определяет элементы управления, к которым пользователь может перейти, нажимая клавишу TAB или клавиши SHIFT + TAB.

Когда пользователь нажимает клавишу TAB или SHIFT + TAB, система сначала определяет, обрабатываются ли эти клавиши элементом управления, который в данный момент имеет фокус ввода. Он отправляет элементу управления сообщение WM_GETDLGCODE, и, если элемент управления возвращает DLGC_WANTTAB, система передает ключи элементу управления. В противном случае система использует функцию GetNextDlgTabItem, чтобы найти следующий видимый, не отключенный элемент управления, имеющий стиль WS_TABSTOP. Поиск начинается с элемента управления, в настоящее время имеющего фокус ввода, и продолжается в том порядке, в котором они были созданы, то есть в порядке, в котором они определены в шаблоне диалогового окна. Когда система находит элемент управления, имеющий требуемые характеристики, система перемещает фокус ввода на него.

Если при поиске следующего элемента управления в стиле WS_TABSTOP встречается окно со стилем WS_EX_CONTROLPARENT, система рекурсивно ищет дочерние элементы окна.

Приложение может также использовать GetNextDlgTabItem, чтобы найти элементы управления, имеющие стиль WS_TABSTOP. Функция извлекает дескриптор окна следующего или предыдущего элемента управления в стиле WS_TABSTOP без перемещения фокуса ввода.

Источник: MSDN.

1 голос
/ 28 сентября 2010
if( !IsDialogMessage(0, &msg) )

Первый аргумент не должен быть NULL, он должен быть дескриптором диалога. Больно тут конечно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...