Tab проходит через две группы управления независимо - PullRequest
0 голосов
/ 17 января 2020

Я хочу использовать клавишу табуляции, чтобы изменить фокус между 6 элементами управления.

Я установил стиль родительского окна на WS_EX_CONTROLPARENT

Я установил стиль элементов управления на WS_TABSTOP

Я вызываю IsDialogMessage, чтобы игнорировать сообщения, которые были обработаны

Это прекрасно работает!

Теперь я хочу разделить элементы управления на две группы по три, чтобы табуляция в третьем элементе управления возвращала фокус к первому и табуляция в шестом возвращает управление четвертому (а не первому)

Поэтому я добавляю WS_GROUP к стилю первого и четвертого элемента управления

    auto ret = SetWindowLongPtr(
        myEditbox.handle(),
        GWL_STYLE,
        GetWindowLongPtr( myEditbox.handle(), GWL_STYLE) | WS_GROUP  );
    if( ret == 0 )
        throw std::runtime_error("setGroupStyle");

Ничего не происходит , Вкладка заставляет фокусировку клавиатуры перемещаться по элементам управления с 1 по 6 и обратно на 1. Как и прежде.

@ PaulSanders указывает, что WS_GROUP влияет на поведение клавиши со стрелкой, а НЕ на клавишу табуляции. Подтверждение этому появляется в документации Windows.

Окно является первым элементом управления группы элементов управления. Группа состоит из этого первого элемента управления и всех элементов управления, определенных после него, вплоть до следующего элемента управления со стилем WS_GROUP. Первый элемент управления в каждой группе обычно имеет стиль WS_TABSTOP, чтобы пользователь мог переходить из группы в группу. Пользователь может впоследствии изменить фокус клавиатуры с одного элемента управления в группе на следующий элемент управления в группе, используя клавиши со стрелками. Вы можете включить или выключить этот стиль, чтобы изменить навигацию в диалоговом окне. Чтобы изменить этот стиль после создания окна, используйте функцию SetWindowLong. (https://docs.microsoft.com/en-us/windows/win32/winmsg/window-styles)

Итак, я попытался удалить стиль WS_TABSTOP из элементов управления, ожидая, что регуляторы направления изменят фокус. Не работает - клавиши со стрелками просто перемещают текстовый курсор через элемент управления редактирования, а не фокус между элементами управления.

Что мне нужно сделать больше или по-другому?

Ответы [ 2 ]

2 голосов
/ 17 января 2020

Это отличается от обычного обхода диалога, поэтому вам придется реализовать его самостоятельно, а не полагаться на IsDialogMessage(). может быть возможным использовать немодальные дочерние диалоги, исключая расширенный стиль WS_EX_CONTROLPARENT, но я не верю, что это действительно сделает то, что вы хотите.

Я предлагаю вам использовать SetWindowSubClass(), чтобы прикрепить функцию подкласса к первому и последнему элементам управления редактирования каждой группы и заставить ее обрабатывать WM_CHAR сообщений с символами табуляции, устанавливая фокус в зависимости от ситуации.

0 голосов
/ 24 января 2020

Мне удалось заставить это работать, используя IsDialogMessage

Два трюка:

  • Добавьте WS_TABSTOP к каждому элементу управления, который вы хотите посетить, с помощью вкладки

  • Добавьте WS_EX_CONTROLPARENT в каждое окно, содержащее элементы управления, которые посещаются вкладками. Это включает windows, которые содержат другие windows, которые в конечном счете содержат элементы управления. (Если это опущено, IsDialogMessage будет зависать, когда табуляция достигает конечного элемента управления и должна l oop вернуться к первому) { ссылка }

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