Win32 API. Быстрые клавиши - Создание клавиш - ускорителей для атрибутов шрифта
ОГЛАВЛЕНИЕ
Страница 10 из 28
Создание клавиш - ускорителей для атрибутов шрифта
Пример в этом разделе показывает, как исполнить следующие задачи:
- Создать ресурс таблицы клавиш-ускорителей.
- Загрузить таблицу акселераторов во время прогона программы.
- Преобразовать клавиши - ускорители в цикле сообщений.
- Обработать сообщения WM_COMMAND, сгенерированные акселераторами.
Эти задачи демонстрируются применительно к прикладной программе, которая включает в себя меню Символ (Character) и соответствующие клавиши - ускорители, которые позволяют пользователю выбирать атрибуты текущего шрифта.
Нижеследующая часть файла определения ресурса определяет меню Character и связанную с ним таблицу клавиш-ускорителей.
Обратите внимание!, что пункты меню показывают нажатие клавиши - ускорителя и то, что каждый акселератор имеет тот же самый идентификатор, что и связанный с ним пункт меню.
#include <windows.h>
#include "acc.h"
MainMenu MENU
BEGIN
POPUP "&Character"
BEGIN
MENUITEM "&Regular\tF5", IDM_REGULAR
MENUITEM "&Bold\tCtrl+B", IDM_BOLD
MENUITEM "&Italic\tCtrl+I", IDM_ITALIC
MENUITEM "&Underline\tCtrl+U", IDM_ULINE
END
END
FontAccel ACCELERATORS
BEGIN
VK_F5, IDM_REGULAR, VIRTKEY
"B", IDM_BOLD, CONTROL, VIRTKEY
"I", IDM_ITALIC, CONTROL, VIRTKEY
"U", IDM_ULINE, CONTROL, VIRTKEY
END
Следующий раздел исходного файла приложения показывает как реализовать акселератор:
HWND hwndMain; /* дескриптор главного окна */
HANDLE hinstAcc; /*дескриптор экземпляра приложения */
int WINAPI WinMain(hinst, hinstPrev, lpCmdLine, nCmdShow)
HINSTANCE hinst;
HINSTANCE hinstPrev;
LPSTR lpCmdLine;
int nCmdShow;
{
MSG msg; /* сообщения прикладной программы */
HACCEL haccel; /* дескриптор таблицы клавиш-ускорителей */
.
. /* Исполнение процедуры инициализации */
.
/* создание главного окна для этого экземпляра приложения. */
hwndMain = CreateWindowEx(0L, "MainWindowClass",
"Sample Application", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL,
hinst, NULL );
/* Если окно невозможно создать возвращается значение "failure." -неудача. */
if (!hwndMain) return FALSE;
/* Сделаем окно видимым и обновим его рабочую область. */
ShowWindow(hwndMain, nCmdShow);
UpdateWindow(hwndMain);
/* Загрузим таблицу клавиш-ускорителей. */
haccel = LoadAccelerators(hinstAcc, "FontAccel");
if (haccel == NULL)
HandleAccelErr(ERR_LOADING); /* заданное приложение */
/*
* Получим и отправим по назначению сообщения, пока не принято сообщение WM_QUIT.
* .
*/
while (GetMessage(&msg, NULL, NULL, NULL)) {
/* Проверка нажата ли клавиша-ускоритель. */
if (!TranslateAccelerator(
hwndMain, /* дескриптор окна-приемника */
haccel, /* дескриптор таблицы активного акселератора */
&msg)) { /* адрес данных для сообщений */
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
LRESULT APIENTRY MainWndProc(hwndMain, uMsg, wParam, lParam)
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;
}