![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.173] |
![]() |
|
Сообщ.
#1
,
|
|
|
Для главного окна программы есть такой код
![]() ![]() int APIENTRY WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow) { // ... while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hwnd, haccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (INT) msg.wParam; } Как подключить акселераторы для модальных диалоговых окон ? |
Сообщ.
#2
,
|
|
|
Цитата E.A. @ Как подключить акселераторы для модальных диалоговых окон ? Модальные диалоговые окна перехватывают цикл обработки всех сообщений на себя(ну кроме нескольких ЕМНИП сообщений, таких как отрисовка вроде, возможно путаю). Другими словами, то что у тебя написано в WinMain - не будет отрабатывать в модальном диалоге, потому как открытое диалоговое окно имеет тоже свой цикл обработки сообщений, и он когда получает какое то сообщение, не пропускает его дальше, а обрабатывает сам, т.е. примерно вот такой вот код в своей оконной функции: ![]() ![]() while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(hwnd, haccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Надеюсь мысль ясна? Т.е. тебе нужно в диалоге делать свою таблицу акселераторов и обрабатывать в нем же вот примерно таким же методом ее. - Куда ее запихнуть в диалоге? - В функцию PreTranslateMessage, если говорить об MFC, в чистом WinAPI - я если честно не помню, вроде в главную оконную функцию DefWindowProc ЕМНИП, давно очень с этим работал. Причем для диалога она должна быть своя, а для главного окна приложения своя. |
Сообщ.
#3
,
|
|
|
https://docs.microsoft.com/ru-ru/windows/wi...-keyboard-input ![]() ![]() #define SHIFTED 0x8000 nVirtKey = GetKeyState(VK_SHIFT); if (nVirtKey & SHIFTED) Добавлено Цитата E.A. @ Меня интересует теперь другой вариант, (мне он больше нравится) это отследить нажатие клавиш без всяких while{} Ну в WinAPI трансляция сообщений в цикле while - это стандартный подход. Добавлено Ну в первом посте у тебя цикл обработки сообщений расположен в функции WinMain. А для обработки сообщений для модального диалога - должен располагаться в оконной функции этого диалога. Потому что модальный диалог не пропускает свои сообщения дальше себя. |
Сообщ.
#4
,
|
|
|
Цитата E.A. @ Я сделал так чтобы работали и акселераторы главного окна и диалога, но появилась следующая неприятность: Когда открыт диалог, то сообщения не доходят до главного окна и оно не обновляется Прикреплённая картинка не обновляется даже если при изменении размеров и перетаскивании послать главному окну Да, все верно, потому что в оконной функции модального диалога - все сообщения перехватываются, обрабатываются самим диалогом, и после никуда не идут. Их попросту модальный диалог сжирает. Но ты можешь сам переопределить оконную функцию модального диалога, и некоторые сообщения не съедать в нем, а посылать дальше(вроде это можно сделать, я не помню если честно, т.к. работал с этим лет 8-10 назад, искать нужно). Цитата E.A. @ Поэтому мне и представляется более красивым отловить нажатие Ctrl+X | Ctrl+C | Ctrl+V | Delete Не понятно, почему нажатие Ctrl попадает в WM_KEYDOWN, нажатие X попадает в WM_KEYDOWN, а нажатие X при нажатом Ctrl даже не попадает в WM_KEYDOWN А куда тогда это сообщение Ctrl+X отправляется ??? Такие нажатия отслеживаются через таблицу акселераторов. Например вот тут про это написано - https://docs.microsoft.com/ru-ru/windows/wi...ateacceleratora Либо летят в сообщении WM_SYSKEYDOWN https://docs.microsoft.com/ru-ru/windows/wi...v/wm-syskeydown |