Сочетания клавиш меню, не обнаруживающиеся (Delphi 2009)

В зависимости от того, что вы делаете в случае получения itemClicked, вы можете вместо этого использовать currentItemChanged в качестве обходного пути. Это может быть даже полезно для пользователей клавиатуры. Но это действительно зависит от того, что вы хотите сделать после получения itemClicked.

8
задан Jan Doggen 6 August 2018 в 09:36
поделиться

4 ответа

Существует стандартная установка Windows (под свойствами дисплея) для нормального сокрытия тех акселераторов, если клавиша Alt не удерживается. Это объяснило бы, почему открытие меню с Alt+F10 показывает им для Вас. Возможно, это - причина?

[Править]: Нет, это не. Я просто попробовал, и простой TForm с пунктом меню показывает акселератор, но как только я добавляю TImageList и устанавливаю ImageIndex единственного пункта меню или просто устанавливаю OwnerDraw на истинный, затем подчеркивание акселератора исчезает. Я предполагаю, что действительно ошибка в VCL.

BTW, это находится на Windows XP.

Обходное решение:

Я отладил этот Delphi использования 2009 на Windows XP 64, и первопричина для недостающих акселераторов, кажется, что Windows отправляет WM_DRAWITEM сообщения с ODS_NOACCEL набор флага, который это не было должно, если система установлена показать акселераторы в любом случае. Таким образом, Вы могли сказать, что это не ошибка VCL, а проблема Windows, которая VCL не работает вокруг.

Однако можно работать вокруг этого в собственном коде, просто необходимо сбросить флаг прежде, чем передать сообщение VCL. Переопределите окно proc

protected
  procedure WndProc(var Message: TMessage); override;

как так:

procedure TYourForm.WndProc(var Message: TMessage);
const
  ODS_NOACCEL = $100;
var
  pDIS: PDrawItemStruct;
  ShowAccel: BOOL;
begin
  if (Message.Msg = WM_DRAWITEM) then begin
    pDIS := PDrawItemStruct(Message.LParam);
    if (pDIS^.CtlType = ODT_MENU)
      and SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, @ShowAccel, 0)
    then begin
      if ShowAccel then
        pDIS^.itemState := pDIS^.itemState and not ODS_NOACCEL;
    end;
  end;
  inherited;
end;

Это - демонстрационный код только, Вы не должны звонить SystemParametersInfo() каждый раз a WM_DRAWITEM сообщение получено, но после того как в программе запускаются, и затем каждый раз, когда Ваша программа получает a WM_SETTINGCHANGE сообщение.

7
ответ дан 5 December 2019 в 12:14
поделиться

Я не думаю, что это - сгенерированная ошибка Delphi, поскольку у Вас есть то же поведение с Блокнотом на Vista. Также в самом Delphi BTW...
Я должен признаться, что не обращал внимание перед Вашим вопросом. Спасибо за указание на него.

1
ответ дан 5 December 2019 в 12:14
поделиться

Как Jim McKeeth отметил выше (правильно), это - "дизайном" поведение. Если меню инициированы посредством действия клавиатуры, акселераторы нужно показать, но, если инициировано мышью акселераторы намеренно не показывают.

Мне настроили мой XP для показа акселераторов в любом случае, но быстрый тест с той измененной опцией подтверждает, что меню не должны показывать подчеркиваниям ни одного (Visual Studio ответила, как я ожидал, никакие подчеркивания при использовании мыши). Однако Microsoft Office игнорирует эту установку и всегда показывает подчеркивания. Таким образом, похоже на ошибку в том, как меню оттянуты в Delphi (у меня нет опыта с Delphi самого).

Я нашел опцию для Vista также: http://www.vistax64.com/vista-general/42125-always-show-menu-underline-keyboard-accelerators.html

Можно включить это в новой Простоте Центра Доступа (перейдите к Панели управления, нажмите Ease of Access и затем нажмите Ease of Access Center). В Простоте Центра Доступа нажмите Make, клавиатура, легче использовать, и в самой нижней части, устанавливает флажок сочетаний клавиш и ключей доступа Underline.

При проведении дальнейшего исследования я нашел эту связанную ошибку на форумах Delphi: http://qc.codegear.com/wc/qcmain.aspx?d=37403

Это похоже в Вашем случае, дочерние окна (оттянутые меню) не получают или не обрабатывают сообщение WM_UIUPDATESTATE из своего родительского окна, которое является тем, что вызывает перерисовку с акселераторами.

0
ответ дан 5 December 2019 в 12:14
поделиться

Это - "функция", начатая с Windows 2000:

Старая Новая Вещь: Почему Windows скрывает сочетания клавиш и прямоугольники фокусировки по умолчанию?

Казалось бы, что Delphi 4 не поддерживал эту функцию Windows.

Чтобы иметь 2000 и меню XP показывают сочетания клавиш, щелкают правой кнопкой по пустому месту по рабочему столу, выбирают Properties, нажимают вкладку Appearance, и под Эффектами, снятие флажка Скрывают Подчеркнутые Буквы для Перемещения с помощью клавиатуры, пока я Не Нажимаю Alt Key. Нажмите "OK" дважды.

Не уверенный, как сделать это в Vista.

6
ответ дан 5 December 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: