Кнопки, COMBO BOX и KEYBOARD KEYS блокируют друг друга (winapi) - PullRequest
0 голосов
/ 06 ноября 2010

В моем интерфейсе у меня есть несколько кнопок, поле со списком и окно, в котором я отображаю последовательность изображений. Эти кнопки перемещаются по последовательности, но я также хотел перемещаться по стрелкам ВЛЕВО и ВПРАВО на клавиатуре. После компиляции клавиши клавиатуры работают нормально, потому что Фокус установлен в главном окне, но после нажатия кнопки или комбинации клавиш клавиатуры не работает. Я управляю этим с помощью SetFocus (main_hwnd) в моем главном цикле, но тогда поле со списком не реагирует на нажатие.

Пример ниже:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   switch (message)
   {

      case WM_CREATE:
        CreateWindowEx(0, "COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLIST, 478, 5, 50, 200, hwnd, (HMENU)ID_COMBO1, GetModuleHandle(NULL), NULL);
        break;

      case WM_COMMAND:
      break;

      case WM_KEYDOWN:
        switch(wParam)
        {
           case VK_SPACE:
           PostQuitMessage(0);
           break;
        }
      break;

      case WM_DESTROY:
           PostQuitMessage (0);
           break;

      default:
           return DefWindowProc (hwnd, message, wParam, lParam);
   }
   // SetFocus(hwnd);
   return 0;
} 

рассмотрим этот пример: после компиляции SPACE KEY будет работать, но после нажатия на выпадающий список, он не будет работать. Если я использую SetFocus (hwnd), SPACE KEY всегда будет работать, но поле со списком будет отключено.

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 07 ноября 2010

Да, ваша оконная процедура предназначена только для этого окна, поле со списком - отдельное окно. Мне нравится обрабатывать горячие клавиши внутри цикла сообщений примерно так:

MSG msg;

while (GetMessage(&msg, NULL, 0, 0) > 0)
{
    if (msg.message == WM_KEYDOWN)
    {
        if ((UINT)msg.wParam == VK_SPACE)
        {
            return 0; // or use postquitmessage
        }
    }

    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
1 голос
/ 06 ноября 2010

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

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