Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Загрузка таблицы акселераторов






 

Хотя акселераторы определены в том же файле ресурсов, что и меню, они должны быть отдельно загружены при помощи функции API LoadAccelerators(), которая имеет следующий прототип:

HACCEL LoadAccelerators (HINSTANCE ThisInst, LPSTR Name);

ThisInst – это дескриптор текущего экземпляра приложения, a Name – имя таблицы акселераторов. Функция возвращает дескриптор загруженной таблицы аксе­лераторов либо NULL, если таблица не может быть загружена.

Функцию LoadAccelerators() нужно вызывать сразу после создания окна. Напри­мер, таблица акселераторов для MYMENU загружается так:

HACCEL hAccel;

...

hAccel=LoadAccelerators(hThisInst, " Mymenu");

Значение hAccel будет использовано позже для обработки акселераторных комбинаций.

Несмотря на то, что функция LoadAccelerators() загружает таблицу акселераторов, программа не будет обрабатывать их до тех пор, пока Вы не добавите в цикл обработки сообщений еще одну функцию API. Эта функция называется TranslateAccelerator():

int TranslateAccelerator (HWND hwnd,

HACCEL hAccel,

LPMSG lpMess);

Здесь hwnd является дескриптором окна, для которого должны транслироваться акселераторные комбинации, hAccel – дескриптором таблицы акселераторов, возвра­щаемым функцией LoadAccelerators(), и наконец, lpMess – указателем на сообщение.

Функция TranclateAccelerator() возвращает ненулевое значение, если была исполь­зована акселераторная комбинация, и нулевое – в противном случае. Таким образом, эта функция транслирует акселераторы в соответствующие сообщения WM_COMMAND.

С использованием функции TranslateAccelerator() цикл обработки сообщений будет выглядеть так:

 

while(GetMessage(& msg, NULL, 0, 0))

{

if(! TranslateAccelerator(hwnd, hAccel, & msg))

{

TranslateMessage(& msg); // Использовать клавиатуру

DispatchMessage (& msg); // Вернуть упр. к Windows

}

}

 

Пример 4-3. Попробуйте использовать акселераторы, подставив в предыдущий пример приве­денную ниже версию WinMain() и добавив в файл ресурсов таблицу акселераторов:

 

// Обработка акселераторов

#include < Windows.h>

#include < String.h>

#include < Stdio.h>

#include " Menu.h"

 

LRESULT CALLBACK WindowFunc(HWND, UINT,

WPARAM, LPARAM);

char szWinName[]=" МоеОкно"; // Имя класса окна

 

int WINAPI WinMain(HINSTANCE hThisInst,

HINSTANCE hPrevInst,

LPSTR lpszArgs,

int nWinMode)

{

HWND hwnd;

MSG msg;

HACCEL hAccel; // Для обработки акселераторов

WNDCLASS wcl; // Определить класс окна

wcl.hInstance=hThisInst; // Дескриптор приложения

wcl.lpszClassName=szWinName; // Имя класса окна

wcl.lpfnWndProc=WindowFunc; // Функция окна

wcl.style=0; // Стиль по умолчанию

wcl.hIcon=LoadIcon(NULL, IDI_APPLICATION); // Иконка

wcl.hCursor=LoadCursor(NULL, IDC_ARROW); // Курсор

wcl.lpszMenuName=" Mymenu"; // Главное меню

wcl.cbClsExtra=0; // Без дополнительной информации

wcl.cbWndExtra=0;

wcl.hbrBackground=

(HBRUSH)GetStockObject(WHITE_BRUSH); //Белый фон

if(! RegisterClass(& wcl)) // Регистрируем класс окна

return 0;

hwnd=CreateWindow(szWinName, // Создать окно

" Обработка команд меню",

WS_OVERLAPPEDWINDOW, // Стиль окна

CW_USEDEFAULT, // x-координата

CW_USEDEFAULT, // y-координата

CW_USEDEFAULT, // Ширина

CW_USEDEFAULT, // Высота

HWND_DESKTOP, // Нет родител. окна

NULL, // Нет меню

hThisInst, // Дескриптор приложения

NULL); // Нет дополнит. аргументов

hAccel=LoadAccelerators(hThisInst, " Mymenu");

// Загрузить акселераторы

ShowWindow (hwnd, nWinMode); // Показать окно

UpdateWindow (hwnd); // и перерисовать

 

while(GetMessage(& msg, NULL, 0, 0))

{

if(! TranslateAccelerator(hwnd, hAccel, & msg))

{

TranslateMessage(& msg); // Использ. клавиатуру

DispatchMessage (& msg); // Вернуться. к Windows

}

}

return msg.wParam;

}

 

Прежде чем следовать дальше, поэкспериментируйте со своими собственными окнами сообщений, меню и аксел00ераторами. Попробуйте различные варианты и посмотрите, что получится. Меню и окна сообщений будут часто использоваться в настоящей книге, поэтому важно четко понимать, как работают эти элементы.

 



Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.008 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал