Как заставить нажатие клавиши табуляции работать с окном win32, которое не является диалогом - PullRequest
4 голосов
/ 21 июля 2010

Я создал несколько элементов управления в своем окне в обработчике сообщений WM_CREATE, и я хочу разрешить использование клавиши табуляции для перемещения фокуса через набор элементов управления от одного к следующему.

Создание элемента управления выглядит следующим образом:

case WM_CREATE:
{
    CreateWindowA("button", "Refresh Listview",
                  BS_MULTILINE | WS_CHILD | WS_VISIBLE, 10, 10, 70, 50,
                  hwnd, (HMENU)IDC_REFRESHLW, g_hInst, NULL);
    break;
}

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

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

Но мне не нужен диалог!

1 Ответ

9 голосов
/ 21 июля 2010

Чтобы табуляция работала в диалоговом окне, вам нужно встроить вызов IsDialogMessage в ваш цикл сообщений.

Ваш цикл сообщений должен выглядеть примерно так:

HWND hwnd; // main window handle

MSG msg;
while(GetMessage(&msg,0,0,0)>0)
{
  if(!IsDialogMessage(hwnd,&msg))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
}

IsDialogMessage работает, проверяя сообщение и выясняя, является ли оно VK_TAB или связанным сообщением, - затем просматривает переданный hwnd, чтобы увидеть, какое из его дочерних окон имеет фокус, и, если дочернее окно имеет фокус, ищет другие дочерние окна со стилем WS_TABSTOP и перемещают фокус к следующему включенному элементу управления TABSTOP в окне. Окно НЕ должно быть диалоговым окном, чтобы использовать эту функцию, просто иметь дочерние окна, которые могут принимать фокус, и иметь стиль WS_TABSTOP.

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