Вопрос по c++, c – Добавление ускорителей (ярлыков) в MFC - КАК?

4

Я нашел эту ссылку:http://support.microsoft.com/kb/222829

Но я не могу этого понять.

Хорошо, я понял, что мне нужно добавить это в мой заголовочный файл:

HACCEL  m_hAccelTable;

и тогда это:

m_hAccelTable = LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));

на мой основной .cpp

Но куда это девается?

BOOL CAboutDlg::PreTranslateMessage(MSG* pMsg) {
   if (m_hAccelTable) {
      if (::TranslateAccelerator(m_hWnd, m_hAccelTable, pMsg)) {
         return(TRUE);
      }
   }
   return CDialog::PreTranslateMessage(pMsg);

}

Мне нужно около 6 ярлыков (CTRL + U, чтобы загрузить что-то, CTRL + O, чтобы загрузить что-то еще), я не могу понять, как это работает, нужна небольшая помощь

Ваш Ответ

2   ответа
12

как добавить ускорители в блок About, и только блок About сможет обрабатывать ускоритель, что в данном случае эквивалентно нажатию кнопки с IDC_BUTTON1 ID.

Вам нужно сделать что-то совершенно другое, чтобы все объекты в вашем приложении могли обработать это сообщение. Это делается для вас в приложениях MDI / SDI.

После того как вы создали таблицу ускорителей в ресурсе, вы должны добавить ускорители: Комбинация клавиш, парная комбинация клавиш ускорителя, при использовании генерирует командное сообщение с соответствующим идентификатором. Как только вы закончите добавление, вы должны создать обработчики командных сообщений для каждого идентификатора. Когда используется акселератор, вызывается обработчик, и вы можете добавить нужный код. Теперь сделайте это: Объявите переменную типа HACCEL для вашего класса приложения. В InitInstance вызовите LoadAccelerators. Используйте мастер для вставки переопределения PreTranslateMessage в ваш класс приложения. Добавить следующее:

      if (m_hAccelTable) 
      {
                if (::TranslateAccelerator(*m_pMainWnd, m_hAccelTable, pMsg)) 
                {
                          return(TRUE);
                }
      }

Это позволит основному диалогу обрабатывать ускорители. Примечание * m_pMainWnd. Это ваш дескриптор диалога (автоматически приведен). Теперь вы можете добавить обработчики для любого ускорителя в диалог или в класс приложения. Вы также можете направлять командные сообщения в любое окно вашего приложения, используя OnCmdMsg.

Мой совет на будущее. Когда вы решите сделать свое приложение диалоговым, подумайте о создании приложения SDI с производным классом CFormView. Вы можете изменить стиль фрейма, чтобы не допускать изменения размера, и это будет похоже на диалог, но. , , У вас будет возможность бесплатно пользоваться панелью инструментов и меню, а главное, вы будете иметь все ускорители и команды маршрутизации бесплатно.

0

на которую вы ссылаетесь, описывается добавление таблицы ускорителей в приложение на основе диалога.

Вы создаете диалоговое приложение или просто обычное MFC-приложение с панелью меню?

Если вы делаете первое, то в качестве страницы, на которую вы ссылались, предлагается переопределить метод диалогового окна PreTranslateMessage.

Если вы делаете позже, вам нужно только позвонитьCFrameWnd :: LoadAccelTable функция.

Вам не нужно ничего добавлять в приложение MDI / SDI, созданное мастером. Framework обрабатывает все сложности ускорителей и команд обработки / маршрутизации. В образце MSDN не указано, что это за приложение. В нем показано, как добавить ускорители в поле «О программе», вместо этого показан другой пример, который будет более понятным.

Похожие вопросы