воскресенье, 7 июня 2009 г.

Никогда не устанавливайте фокус на отключенный контрол

Это перевод Never leave focus on a disabled control. Автор: Реймонд Чен.

Одним из самых главных НЕТ-НЕТ в управлении диалоговыми окнами - это отключение (disable) контрола, который владеет фокусом, без перемещения этого фокуса в другое место.

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

(Я видел, как это случалось и в продуктах от Microsoft. Это очень печально).

Перед тем, как вы отключите контрол - проверьте, что он не имеет фокуса. А если имеет, то переместите фокус куда-нибудь ещё перед тем, как отключать контрол, так что пользователь не останется сидеть беспомощным перед ваших диалогом.

Если вы не знаете, кому передать фокус - просто позвольте решать это менеджеру диалоговых окон (dialog manager). К нам на помощь в очередной раз приходит сообщение WM_NEXTDLGCTL.
procedure DialogDisableWindow(hdlg, hwndControl: HWND)
begin
  if hwndControl = GetFocus then
    SendMessage(hdlg, WM_NEXTDLGCTL, 0, 0);
  EnableWindow(hwndControl, False);
end;
(И, конечно же, вы никогда-никогда не должны отключать последний контрол в диалоге. Это не оставит пользователю никакого шанса сбежать от вашего диалога!)

Прим. пер.: в Delphi установка свойства Enabled автоматически решает эту проблему, но всё сказанное остаётся в силе, если вы используете прямой вызов EnableWindow.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.