Мое приложение имеет большую графическую область с некоторыми элементами управления (ползунки, кнопки, элементы редактирования текста) на боковой панели. Графическая область понимает некоторые команды клавиатуры.
Моя проблема в том, что когда элемент управления на боковой панели находится в фокусе, основная графическая область не будет получать никаких клавиатурных команд, поэтому это сбивает с толку пользователей. Однако для некоторых элементов управления это предусмотрено, например, элементы управления редактированием текста.
Я хочу, чтобы фокус автоматически возвращался в графическую область при первой же возможности (которую я называю «жадной» фокусировкой) — например, когда редактирование текста завершено (клавиша ввода) или когда пользователь выбрал элемент в поле со списком.
Я ищу чистую и надежную стратегию для решения этой проблемы, используя Windows API или Borland Vcl.
Буду признателен, если вы хотите поделиться своими идеями.
Я еще не полностью решил проблему, но очень полезное сообщение для перехвата на уровне формы CM_DIALOGKEY
(Только Borland Vcl). Он отправляется для каждого ключа, который обычно используется для навигации в пользовательском интерфейсе. То есть клавиши курсора, вкладка и shift-tab, Enter и, возможно, другие.
Я добавил обработчик событий для CM_DIALOGKEY
это возвращает фокус в графическую область, а также перенаправляет нажатие клавиши на этот компонент. Таким образом, пользователь все еще может управлять элементами пользовательского интерфейса с помощью клавиатуры (важно для ввода текста), но клавиши курсора обрабатываются графической областью.
Я знаю, что вы имеете в виду, у меня была похожая проблема с некоторыми БОЛЬШИМИ приложениями, такими как CAD / CAM …
Мое решение простое, надежное, и я использую его годами.
1. все нажатия клавиш для этой области gfx
2. создать функцию расфокусировки (желательно член формы, но это не обязательно)
Я использую это:
//---------------------------------------------------------------------------
void main_unfocus()
{
Main->bt_unfocus->Visible=true;
Main->bt_unfocus->SetFocus();
Main->bt_unfocus->Visible=false;
}
//---------------------------------------------------------------------------
Основным является указатель формы
4. когда звонить main_unfocus?
Надеюсь, поможет