Фокус клавиатуры: ищем общую стратегию

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

Моя проблема в том, что когда элемент управления на боковой панели находится в фокусе, основная графическая область не будет получать никаких клавиатурных команд, поэтому это сбивает с толку пользователей. Однако для некоторых элементов управления это предусмотрено, например, элементы управления редактированием текста.

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

Я ищу чистую и надежную стратегию для решения этой проблемы, используя Windows API или Borland Vcl.

Буду признателен, если вы хотите поделиться своими идеями.

0

Решение

Я еще не полностью решил проблему, но очень полезное сообщение для перехвата на уровне формы CM_DIALOGKEY (Только Borland Vcl). Он отправляется для каждого ключа, который обычно используется для навигации в пользовательском интерфейсе. То есть клавиши курсора, вкладка и shift-tab, Enter и, возможно, другие.

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

0

Другие решения

Я знаю, что вы имеете в виду, у меня была похожая проблема с некоторыми БОЛЬШИМИ приложениями, такими как CAD / CAM …

Мое решение простое, надежное, и я использую его годами.

1. все нажатия клавиш для этой области gfx

  • должно быть сделано в случаях формы, где находится область
  • не в панелях, коробка для краски, что угодно …

2. создать функцию расфокусировки (желательно член формы, но это не обязательно)

  • эта функция потеряет фокус на любом элементе VCL
  • так что фокус идет на формирование себя, что вы хотите
  • Я использую это:

    //---------------------------------------------------------------------------
    void main_unfocus()
    {
    Main->bt_unfocus->Visible=true;
    Main->bt_unfocus->SetFocus();
    Main->bt_unfocus->Visible=false;
    }
    //---------------------------------------------------------------------------
    
  • Основным является указатель формы

  • bt_unfocus — кнопка (может быть любым фокусируемым компонентом VCL)
  • Я обычно размещаю эту кнопку в левом верхнем углу приложения и устанавливаю ее размер 2×2 пикселей
  • это невидимо в начале
  • идея состоит в том, чтобы сосредоточиться на нем (но сначала раскройте его, чтобы не было выброшено исключение)
  • а затем спрятать его, чтобы он потерял фокус
  • хорошо работают в BCB5 и BDS2006 (не использовал его с любой другой IDE)
  • как вы можете видеть, большую часть времени этот компонент невидим

4. когда звонить main_unfocus?

  • когда вы двигаете мышью снаружи внутрь вашей области gfx (событие OnMouseMove)
  • или когда вы нажимаете на него
  • также вы можете комбинировать это с запоминанием, находится ли фокус в области gfx или нет
  • это можно сделать с помощью таких событий, как OnExit …
  • или когда вы нажимаете клавишу Esc, когда фокус находится внутри поля редактирования … \
  • Я уверен, что вы поняли идею и приспособили ее к вашим потребностям

Надеюсь, поможет

0