progs.biz  
Начало>WinAPI>API>Урок 25
C#
VB.NET
Visual C++.NET
ASP.NET
Visual C++ 6
WinAPI
C/C++
Delphi
C++ Builder
Java
SQL
PHP
DirectX
Visual Basic 6.0
Ассемблер
Интернет
Сист. прогр-ние
Pocket PC
Обзор книг
Обзор программ

М. Фленов. Программирование на C++ глазами хакера
М. Фленов. Программирование на C++ глазами хакера
Заказать на Озоне



Яндекс-цитирования

Windows API
Урок 25. Добавляем акселератор

Акселератор - это некоторая комбинация клавиш, которая дублирует команду (скажем, команду меню). Например, для некоторого меню вы можете создать акселератор Ctrl+D - это означает, что и при выборе этого пунтка меню мышкой и при нажатии комбинации клавиш Ctrl+D будет производится одно и то же действие.

Для создания акселератора вы должны сделать следующие действия: создать таблицу акселераторов через API-функцию CreateAcceleratorTable. Далее мы должны в цикле while, обрабатывающем сообщения Windows, вызвать API-функцию TranslateAccelerator, которая переводит сообщения от нажатых клавиш в WM_COMMAND (или в WM_SYSCOMMAND). И, наконец, в соответствующем месте мы должны уничтожить созданную таблицу акселераторов путем вызова API-функции DestroyAcceleratorTable.

Теперь практическая часть урока. А качестве основы возьмем программу с меню, написанную на прошлом уроке.

Шаг первый - создание таблицы акселераторов:

HACCEL CreateAccelerators()
{
    // Массив акселераторов.
    ACCEL acc[1];
    // Задаем акселератор команды.
    // Идентификатор команды.
    acc[0].cmd = 1001;
    // Определяем клавишу-модификатор (Ctrl).
    acc[0].fVirt = FVIRTKEY|FCONTROL;
    // Определяем клавишу.
    acc[0].key = 0x4e;
    // Создаем таблицу акселераторов.
    return CreateAcceleratorTable((LPACCEL)acc, 1);
}

Этот кусок кода можно вставить, например, после include в самом начале программы. В этом фрагменте у нас только один акселератор (в массиве только один элемент). Для акселератора мы должны определить идентификатор команды и комбинацию клавиш, по которой команда будет вызываться. Тут мы определили, что наша команда с идентификатором 1001 будет вызываться по Ctrl+N.

Следующий шаг изменение функции WinMain. Тут мы делаем вызов только что определеной функции CreateAccelerators, изменяем цикл while и уничтожаем таблицу акселераторов:

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    ...
    // Создание таблицы акселераторов.
    HACCEL hAccel = CreateAccelerators();
    
    while(GetMessage(&msg,NULL,0,0))
    {
        // Перевод сообщения от нажатых клавиш в WM_COMMAND.
        if(!(hAccel && TranslateAccelerator(hwnd, hAccel, &msg)))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

    }
    // Уничтожение таблицы акселераторов.
    DestroyAcceleratorTable(hAccel);
    return msg.wParam;
}

Собственно говоря, все. Можно компилировать и запускать программу. Теперь наш messagebox будет появляться не только при выборе соответствующего пункта меню, но и при нажатии Ctrl+N.

Рассылки нашего сайта на Subscribe.Ru
Visual C++, MFC
C# и .NET
VB.NET
ASP.NET new!
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


 
 
Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
© 2002-2008 сайт progs.biz
© 2002-2008 Игорь Алексеев