Глава 19. Ресурсы клавиш-акселераторов
Чтобы ускорить выбор строк из меню, в приложениях используются таблицы клавиш акселераторов. Они задают соответствие комбинаций клавиш идентификаторам командных сообщений. Когда пользователь нажимает комбинацию клавиш, определенную в таблице акселераторов, приложению передается командное сообщение с соответствующим идентификатором.
Bообще говоря, в принципе, можно определить комбинации клавиш акселерации, не только дублирующие строки меню, но и вызывающие передачу других командных сообщений.Для создания и изменения таблиц акселераторов следует использовать редактор ресурсов
Microsoft Visual C++. Он позволяет определить соответствие комбинаций клавиш и идентификаторов командных сообщений.Для приложений, имеющих оконный интерфейс и созданных с использованием
MFC AppWizard, таблица акселераторов с идентификатором IDR_MAINFRAME создается автоматически. Загружается же она приложением во время создания главного окна.Например, таблица акселераторов с идентификатором
IDR_MAINFRAME загружается многооконным приложением во время создания главного окна методом LoadFrame , вызываемом в методе InitInstance главного класса приложения. Метод LoadFrame также используется для одновременной загрузки и ряда других ресурсов (меню, таблицы текстовых строк, пиктограммы), имеющих одинаковый идентификатор ресурса :CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; pMainFrame->ShowWindow(m_nCmdShow); pMainFrame->UpdateWindow(); m_pMainWnd = pMainFrame;
Каждый тип документа может иметь собственную таблицу акселераторов. Эта таблица будет загружена
автоматически вместе с меню (и некоторыми другими ресурсами), когда пользователь откроет окно просмотра документа данного типа.Чтобы определить таблицу акселераторов для документов данного типа, надо просто включить ее в файл ресурсов приложения, присвоив ей идентификатор данного типа документов
(например, IDR_MULTITYPE). Тогда, если в список шаблонов документов приложения при добавлен шаблон документа типа IDR_MULTITYPE, то при создании окна просмотра для документа этого типа будет загружатся соответствующая таблица акселераторов. Шаблон документа добавляется в список шаблонов следующим образом :AddDocTemplate(new CMultiDocTemplate(IDR_MULTITYPE, RUNTIME_CLASS(CMultiDoc), RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CMultiView)));
Если документ создается без использования средств
MFC AppWizard и модели “ Document-View”, то можно загрузит таблицу акселераторов с помощью метода LoadAccelTable , входящего в состав класса CFrameWnd . В качестве параметра этому методу следует указать имя ресурса таблицы акселераторов. Если таблица акселераторов вместо строкового имени имеет числовой идентификатор, то необходимо воспользоваться макрокомандой MAKEINTRESOURCE.