Создание ускорителей для атрибутов шрифта


Пример в этой статье показывает, как осуществить ниже перечисленные задачи:

Эти задачи демонстрируются в контексте приложения, которое включает в себя меню 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; 
}

Назад в оглавление
На главную страницу

Hosted by uCoz