Пример в этой статье показывает, как осуществить ниже перечисленные задачи:
Эти задачи демонстрируются в контексте приложения, которое включает в себя меню Character (Символ) и соответствующие ускорители, которые дают возможность пользователю выбирать атрибуты текущего шрифта.
Ниже следует часть файла определения ресурса, которая определяет меню Character и связанную с ним таблицу клавиш-ускорителей.
Обратите внимание! на то, что пункты меню показывают нажатия клавиш ускорителя, и что каждый ускоритель имеет тот же самый идентификатор, что и связанный с ним пункт меню. |
#include <windows.h> #include "acc.h" MainMenu MENU { POPUP "&Character" { MENUITEM "&Regular\tF5", IDM_REGULAR MENUITEM "&Bold\tCtrl+B", IDM_BOLD MENUITEM "&Italic\tCtrl+I", IDM_ITALIC MENUITEM "&Underline\tCtrl+U", IDM_ULINE } } FontAccel ACCELERATORS { VK_F5, IDM_REGULAR, VIRTKEY "B", IDM_BOLD, CONTROL, VIRTKEY "I", IDM_ITALIC, CONTROL, VIRTKEY "U", IDM_ULINE, CONTROL, VIRTKEY } |
Ниже следует раздел источникового файла приложения, который показывает, как реализовать ускорители.
HWND hwndMain; // дескриптор главного окна HANDLE hinstAcc; // дескриптор экземпляра приложения int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow) { MSG msg; // сообщения приложения BOOL bRet; // возвращаемое значение GetMessage HACCEL haccel; // дескриптор таблицы ускорителей // Выполнение процедур инициализации. // Создаем главное окно этого экземпляра приложения. hwndMain = CreateWindowEx(0L, "MainWindowClass", "Sample Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL ); // Если окно не может быть создано, возвращаем // "завершение из-за ошибки". if (!hwndMain) return FALSE; // Сделаем окно видимым и обновим его рабочую область. ShowWindow(hwndMain, nCmdShow); UpdateWindow(hwndMain); // Загрузим таблицу ускорителей. haccel = LoadAccelerators(hinstAcc, "FontAccel"); if (haccel == NULL) HandleAccelErr(ERR_LOADING); // определяемый приложением // Получаем и распределяем сообщения до тех пор, пока // не примем сообщение WM_QUIT. while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) { if (bRet == -1) { // обработка ошибки и возможно выход из программы } else { // Проверка нажатий клавиш - ускорителей. if (!TranslateAccelerator( hwndMain, // дескриптор принимающего окна haccel, // дескриптор активной таблицы // ускорителей &msg)) // данные сообщения { TranslateMessage(&msg); DispatchMessage(&msg); } } } return msg.wParam; } LRESULT APIENTRY MainWndProc(HWND hwndMain, UINT uMsg, WPARAM wParam, LPARAM lParam) { BYTE fbFontAttrib; // массив флажков атрибутов шрифта static HMENU hmenu; // дескриптор основного меню switch (uMsg) { case WM_CREATE: // Добавим "галочку" к пункту меню Regular, // чтобы обозначить, что он - по умолчанию. hmenu = GetMenu(hwndMain); CheckMenuItem(hmenu, IDM_REGULAR, MF_BYCOMMAND | MF_CHECKED); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { // Обработка ускорителей и команд меню. case IDM_REGULAR: case IDM_BOLD: case IDM_ITALIC: case IDM_ULINE: // GetFontAttributes - определяемая программой // функция, которая устанавливает "галочку" пункту // меню и возвращает атрибуты шрифта // выбранные пользователем. fbFontAttrib = GetFontAttributes( (BYTE) LOWORD(wParam), hmenu); // SetFontAttributes - определяемая программой функция, // которая создает шрифт с атрибутами выбранными // пользователем при помощи контекста устройства // главного окна. SetFontAttributes(fbFontAttrib); break; default: break; } break; // Обработка других сообщений. default: return DefWindowProc(hwndMain, uMsg, wParam, lParam); } return NULL; } |