На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются.
4. Используйте теги [ code=cpp ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Старайтесь формулировать свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной и более давности без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта (C++) user posted image FAQ Форума user posted image Наши Исходники user posted image Поиск по Разделу user posted image MSDN Library Online (Windows Driver Kit) user posted image Google

Ваше мнение о модераторах: user posted image B.V.
Модераторы: B.V.
  
> Акселераторы в диалоговом окне , Не получается прикрутить
    Доброго времени суток! Прошу помощи.

    Файл ресурсов:
    ExpandedWrap disabled
      APP_ACCELERATORS ACCELERATORS
      BEGIN
      VK_F1, CM_AHHELP, VIRTKEY
      END


    Загружаю акселератор из файла ресурсов и модифицирую главный цикл программы:
    ExpandedWrap disabled
          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 и открываю справку.
    В основном окне, пока оно развёрнуто и в фокусе это работает просто замечательно, как задумано.
    Но я не могу понять, как прикрутить этот же акселератор к модальному диалогу.
    Открывается диалог так:
    ExpandedWrap disabled
      DialogBoxParam(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_SETTINGSBOX), hWnd, SettingsProc, (LPARAM)myGlobData);

    Т.к. цикл диалога за пределами моего приложения, я не могу его модифицировать так, как это сделано в цикле главного окна

    ExpandedWrap disabled
              if (!hAccel || !TranslateAccelerator(hMainWnd, hAccel, &msg))
              {
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
              }


    Пожалуйста, дайте мне пинок в нужном направлении.
      Если хотите использовать и дальше системный цикл обработки сообщений из DialogBoxParam, тогда придется эмитировать TranslateAccelerator в процедуре диалогового окна (преобразовывать соответствующие нажатия на клавиши в сообщения WM_COMMAND). Но вы можете создать диалог через CreateDialogParam и использовать дальше свой цикл обработки сообщений с TranslateAccelerator.
        macomics, я не совсем понял, а где ловить нажатия на клавиши? Для каждого элемента в диалоговом окне, который может получить фокус, делать свой субкласс?
          Вот поэтому проще создать окно по шаблону через CreateDialogParam и после написать обычный цикл обработки сообщений с TranslateAccelerator.

          А вообще да. Надо будет устанавливать процедуру(ы)-фильтр нажатий на все дочерние окна в диалоге.
            Да проще вообще зарегистрировать HOTKEY, но он отменяет действие этой клавиши (или сочетания клавиш) в других приложениях, пока не закроешь моё. Что безусловно, будет бесить пользователей.
            С CreateDialogParam тоже, скорее всего, не всё так просто. Нужно будет как-то делать из немодального модальное. Не сталкивался ещё и даже не смотрел, но подозреваю, что придётся поработать над этим...
            Очень странно, что акселераторы не реализованы в стандартном модальном диалоге.

            Добавлено
            Немного подумав я реализовал отслеживание нажатия F1 для открытия справки через хук. Теперь это работает и в главном окне и в модальном. Костыль, конечно, как по мне, но работает.
            Зато акселераторы никакие теперь не нужны. Хотя может и нужны, если нужна комбинация клавиш, но мне-то для моих задач пока нужна только одна F1.
            macomics, спасибо за помощь.
            Тему пока не отмечаю решённой, вдруг кто предложит ещё какие варианты?
              Цитата Timon K @
              Нужно будет как-то делать из немодального модальное.

              https://learn.microsoft.com/en-us/windows/w...er-enablewindow
                Цитата macomics @
                Цитата Timon K @
                Нужно будет как-то делать из немодального модальное.

                https://learn.microsoft.com/en-us/windows/w...er-enablewindow

                Как я мог не подумать про эту опцию, при том, что я про неё прекрасно знаю... macomics, ещё раз спасибо.
                  Через CreateDialogParam акселераторы работают отлично в окне диалога, а немодальное окно становится модальным отключением главного окна.
                  Но мне показалось, что через хук имитировать акселераторы даже проще, там всё делается в одной процедуре без таблицы акселераторов.
                    Цитата Timon K @
                    Очень странно, что акселераторы не реализованы в стандартном модальном диалоге.
                    Подозреваю, что акселераторам мешала бы стандартная механика переходов по акцентным клавишам. Тем, которые вводятся в элементы управления символом & в их надписях, как в меню. По сути это и есть акселераторы.
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0291 ]   [ 16 queries used ]   [ Generated: 19.04.25, 04:40 GMT ]