Win32 API. Быстрые клавиши
Страница 10. Создание клавиш - ускорителей для атрибутов шрифта


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

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

  1. Создать ресурс таблицы клавиш-ускорителей.
  2. Загрузить таблицу акселераторов во время прогона программы.
  3. Преобразовать клавиши - ускорители в цикле сообщений.
  4. Обработать сообщения 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;
}

 
Следующая статья »