2008-11-11 3 views
7

Я пробовал свои силы и не могу понять, что здесь произошло. Он отлично работал в Delphi 4. После перехода на Delphi 2009 я не знаю, работает ли это так, или если это проблема:Клавиши ускорителя меню не отображаются (Delphi 2009)

Это меню моей программы выглядит как в режиме разработки под Delphi 2009:

alt text http://www.beholdgenealogy.com/img/menu1.gif

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

Вы получаете их таким образом с помощью «&» характер как часть заголовка пункта, например: Сохранить как ... &

Когда я запускаю мое приложение, и использовать мышь, чтобы открыть меню Файл, это выглядит следующим образом:

alt text http://www.beholdgenealogy.com/img/menu2.gif

символы подчеркнуты в главном меню, но не подчеркнуты в меню Файл.

Если вместо этого, я использую клавишу Alt-F, чтобы открыть подменю File, то это выглядит правильно так:

alt text http://www.beholdgenealogy.com/img/menu3.gif

и все Accelerator Ключевые письма правильно подчеркнуты.

Я играл с опцией AutoHotKeys, но это не проблема.

С кем-то сталкивалась эта проблема раньше? Является ли пример второго правильного поведения изображения, о котором я не знаю? Или есть какой-то вариант или ошибка в кодировке, которую я, возможно, пропустил?


ноября 2009 (один год): mghie, похоже, попал в корень этого и понял, проблема. См. Его принятый ответ ниже.

ответ

7

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

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

BTW, это на Windows XP.

Обход:

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

Однако вы можете обойти его в своем собственном коде, вам просто нужно сбросить флаг перед передачей сообщения в VCL. Переопределение окна процедурного

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() каждый раз, когда получает WM_DRAWITEM сообщения, но один раз при запуске программы, а затем каждый раз, когда ваша программа получает сообщение WM_SETTINGCHANGE.

+0

Я тоже на Windows XP. После этих ответов и моего размышления об этом и вашей помощи я согласен, что это может быть ошибкой в ​​VCL. Я сообщу об этом. – lkessler 2008-11-11 22:48:08

+0

Сообщается как ошибка для Embarcadero: http://qc.codegear.com/wc/qcmain.aspx?d=68816 – lkessler 2008-11-11 23:03:18

+0

BTW, я получаю то же поведение с Delphi 2007. – mghie 2008-11-15 09:25:04

1

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

+0

№ В Delphi 2009 для меня все элементы подменю показывают клавишу ускорителя, даже когда я выбираю меню с помощью мыши. Вот почему я подумал, что это была какая-то настройка, а не Delphi или операционная система. Это определенно один из проводов, я потратил около 4 часов, пытаясь исправить это. – lkessler 2008-11-11 09:10:44

6

Это "особенность" введена с Windows 2000:

забытое старое: Why does Windows hide keyboard accelerators and focus rectangles by default?

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

Чтобы в меню 2000 и XP отображались клавиши ускорителя, щелкните правой кнопкой мыши пустое место на рабочем столе, выберите «Свойства», нажмите вкладку «Внешний вид» и «Эффекты», снимите отметку Скрыть подчеркнутые буквы для навигации по клавиатуре, пока я не нажмем клавишу «Alt». Дважды нажмите кнопку ОК.

Не знаете, как это сделать в Vista.

0

Как отметил Джим МакКит (правильно), это поведение «по дизайну». Если меню запускаются с помощью клавиатуры, следует показывать ускорители, но если они запускаются с помощью мыши, ускорители намеренно не отображаются.

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

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

Вы можете это включить в новом Центре специальных возможностей (перейти к Control Panel, нажмите Простоту доступа и выберите Центр специальных возможностей). В Центр простоты доступа нажмите «Сделать клавиатуру проще в использовании», а в самом низу выберите ярлыки «Подчеркнутые клавиши» и установите флажок « ».

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^