2010-06-20 3 views
0

У меня есть динамически созданная панель инструментов в обычном диалоговом окне Win32. Мои кнопки добавлены с помощью & ярлыков, которые правильно помещают символы подчеркивания в символы после амперсанда, но нажатие Alt + (char) вызывает звуковой сигнал, и кнопка не нажимается.Ускорители Амперсанда вызывают звуковой сигнал в диалоговом окне Win32

Прошло некоторое время с тех пор, как я разработал разработку Win32 API. Есть ли что-то, что нужно сделать для динамически созданного дочернего окна (панели инструментов), чтобы ключи ускорителя работали?

Это может быть что-то действительно очевидно, что мне не хватает ...

+0

У меня есть идеи, но вы можете поделиться своим источником? Не уверен, что вы подразумеваете под «динамически созданной панелью инструментов». Вы имеете в виду меню? Или что-то другое? – selbie

+0

Рассмотрим простой диалог Win32. В обработчике 'WM_INITDIALOG' я создаю панель инструментов с помощью' CreateWindowEx'. Затем я добавляю к нему несколько кнопок с ярлыком, например. «& New», «E & dit» и т. Д. Нажатие Alt + N или Alt + D вызывает звуковой сигнал и нажатие клавиши Alt + C для кнопки «& Cancel» (кнопка из диалогового шаблона) работает и закрывает диалог. Я попытаюсь собрать пример кода. – wpfwannabe

+0

Что говорит Spy ++? Что говорит Spy ++ о стороннем приложении, где он работает? –

ответ

1

Ну ... Вы должны написать код для обработки этих нажатий клавиш и конвертировать их в сообщения WM_COMMAND. Традиционный способ сделать это - определить таблицу ускорителей и обработать их с помощью TranslateAccelerator() - но, конечно, вы можете делать это, как хотите ... Просто убедитесь, что ключи, которыми вы управляете, с помощью клавиш, которые вы подчеркиваете!

Вы также можете найти эту статью в KB полезной: How to use accelerator keys within a modal dialog box in Visual C++ ... Или, для более глубокого (и без MFC) взгляда на реализацию обработки пользовательских сообщений в диалогах, ознакомьтесь с статьями Раймонда Чена в диалоговом менеджере, в частности part 4: The dialog loop и part 9: Custom accelerators in dialog boxes (но серьезно, прочитайте все, вы знаете, что хотите ...)

+0

Спасибо за попытку, но я не думаю, что здесь применяются ускорители. Я говорю об Alt + ярлыках, которые как-то автоматические по своей природе. Ни один из элементов управления из шаблона диалога ресурсов не требует ускорителей. – wpfwannabe

+0

@wpfwannabe: да, потому что они определены * в шаблоне диалога *. В отличие от кнопок на панели инструментов. Если вы хотите полагаться на функциональность, встроенную в диалог, добавьте некоторые обычные кнопки и дайте им текст с ярлыками ... Помните: панели инструментов, как и меню, изначально не создавались для использования в диалогах, и поэтому они не действовать как диалоговые элементы управления. – Shog9

+0

Хорошо, я думаю, вы абсолютно правы.Панели инструментов на самом деле не предназначены для диалогов, и правильный способ обработки ускорителей - использовать ускорители Win32. У меня есть проблема, хотя ... Как «TranslateAccelerator» в диалоговом окне Win32 (не-MFC)? Я не владею контуром сообщений. Нет «PreTranslateMessage». – wpfwannabe

1

Звуковой сигнал указывает на то, что команда не обрабатывается любого окна в вашем приложении.

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

Чтобы проверить: нажмите на панель инструментов, чтобы она имела фокус, затем нажмите Alt-, и она должна работать.

+0

Панель инструментов создается как дочернее окно диалога. Таким образом, устанавливается родительский * IS *. Что касается владельца, я никогда не слышал о дочернем окне, нуждающемся в владельце. Я использовал Spy ++ для проверки других дочерних окон (созданных из шаблона диалога), и ни один из них не имеет владельца. Что касается фокуса, даже если панель инструментов имеет фокус, Alt + не работает. В основном, когда я нажимаю на панель инструментов и фокусируется на кнопке, нажатие кнопки SPACE нажимает кнопку, но нажатие клавиши Alt + недоступно! Спасибо за ваши усилия! – wpfwannabe

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