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