
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.170] |
![]() |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток! Прошу помощи.
Файл ресурсов: ![]() ![]() APP_ACCELERATORS ACCELERATORS BEGIN VK_F1, CM_AHHELP, VIRTKEY END Загружаю акселератор из файла ресурсов и модифицирую главный цикл программы: ![]() ![]() hAccel = LoadAccelerators(GetModuleHandle(NULL), TEXT("APP_ACCELERATORS")); while (GetMessage(&msg, NULL, 0, 0)) { if (!hAccel || !TranslateAccelerator(hMainWnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } В обработчике событий главного окна отлавливаю команду CM_AHHELP и открываю справку. В основном окне, пока оно развёрнуто и в фокусе это работает просто замечательно, как задумано. Но я не могу понять, как прикрутить этот же акселератор к модальному диалогу. Открывается диалог так: ![]() ![]() DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_SETTINGSBOX), hWnd, SettingsProc, (LPARAM)myGlobData); Т.к. цикл диалога за пределами моего приложения, я не могу его модифицировать так, как это сделано в цикле главного окна ![]() ![]() if (!hAccel || !TranslateAccelerator(hMainWnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } Пожалуйста, дайте мне пинок в нужном направлении. |
Сообщ.
#2
,
|
|
|
Если хотите использовать и дальше системный цикл обработки сообщений из DialogBoxParam, тогда придется эмитировать TranslateAccelerator в процедуре диалогового окна (преобразовывать соответствующие нажатия на клавиши в сообщения WM_COMMAND). Но вы можете создать диалог через CreateDialogParam и использовать дальше свой цикл обработки сообщений с TranslateAccelerator.
|
Сообщ.
#3
,
|
|
|
macomics, я не совсем понял, а где ловить нажатия на клавиши? Для каждого элемента в диалоговом окне, который может получить фокус, делать свой субкласс?
|
Сообщ.
#4
,
|
|
|
Вот поэтому проще создать окно по шаблону через CreateDialogParam и после написать обычный цикл обработки сообщений с TranslateAccelerator.
А вообще да. Надо будет устанавливать процедуру(ы)-фильтр нажатий на все дочерние окна в диалоге. |
Сообщ.
#5
,
|
|
|
Да проще вообще зарегистрировать HOTKEY, но он отменяет действие этой клавиши (или сочетания клавиш) в других приложениях, пока не закроешь моё. Что безусловно, будет бесить пользователей.
С CreateDialogParam тоже, скорее всего, не всё так просто. Нужно будет как-то делать из немодального модальное. Не сталкивался ещё и даже не смотрел, но подозреваю, что придётся поработать над этим... Очень странно, что акселераторы не реализованы в стандартном модальном диалоге. Добавлено Немного подумав я реализовал отслеживание нажатия F1 для открытия справки через хук. Теперь это работает и в главном окне и в модальном. Костыль, конечно, как по мне, но работает. Зато акселераторы никакие теперь не нужны. Хотя может и нужны, если нужна комбинация клавиш, но мне-то для моих задач пока нужна только одна F1. macomics, спасибо за помощь. Тему пока не отмечаю решённой, вдруг кто предложит ещё какие варианты? |
Сообщ.
#6
,
|
|
|
Цитата Timon K @ Нужно будет как-то делать из немодального модальное. https://learn.microsoft.com/en-us/windows/w...er-enablewindow |
Сообщ.
#7
,
|
|
|
Цитата macomics @ Цитата Timon K @ Нужно будет как-то делать из немодального модальное. https://learn.microsoft.com/en-us/windows/w...er-enablewindow Как я мог не подумать про эту опцию, при том, что я про неё прекрасно знаю... macomics, ещё раз спасибо. |
Сообщ.
#8
,
|
|
|
Через CreateDialogParam акселераторы работают отлично в окне диалога, а немодальное окно становится модальным отключением главного окна.
Но мне показалось, что через хук имитировать акселераторы даже проще, там всё делается в одной процедуре без таблицы акселераторов. |
![]() |
Сообщ.
#9
,
|
|
Цитата Timon K @ Подозреваю, что акселераторам мешала бы стандартная механика переходов по акцентным клавишам. Тем, которые вводятся в элементы управления символом & в их надписях, как в меню. По сути это и есть акселераторы. Очень странно, что акселераторы не реализованы в стандартном модальном диалоге. |