Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
Nihilum000
1 / 1 / 0
Регистрация: 07.04.2015
Сообщений: 2
#1

Создание акселераторов в runtime посредством CreateAcceleratorTable() или ошибочна ли документация с MSDN - C++ WinAPI

03.01.2018, 22:18. Просмотров 111. Ответов 0
Метки нет (Все метки)

Здравствуйте.

На этом форуме и в интернете уже есть обсуждения похожей проблемы, однако, ни в одном из них не затрагивается суть (как я её вижу), проблемы. Собственно, в чём суть: открыв эту статью, узнаём, что акселератор можно создать двумя способами: используя ресурсы приложения, или непосредственно в runtime, используя структуру ACCEL и функцию CreateAcceleratorTable().

Начнём с первого способа. Используя ResEdit, создаём файл ресурсов со следующим кодом:
C++
1
2
3
4
5
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
IDR_ACCELERATOR1 ACCELERATORS
{
    "A",            CM_ABOUT, VIRTKEY, CONTROL
}
Затем, загружаем этот акселератор:
C++
1
HACCEL hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
После, модифицируем цикл обработки сообщений:
C++
1
2
3
4
5
6
7
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
    if (!TranslateAccelerator(hWnd, hAccel, &msg)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
И в WndProc ловим WM_COMMAND:
C++
1
2
3
4
5
case WM_COMMAND:
    if (LOWORD(wParam) == CM_ABOUT) {
        MessageBox(hWnd, L"Ctrl+A", L"It's working", NULL);
    }
    break;
После этого, запустив приложение, нажимаем клавиши Ctrl+A и наблюдаем ожидаемый вызов MessageBox'а.

Теперь переходим ко второму способу. Структура ACCEL в указанной статье имеет следующее определение:
C++
1
2
3
4
5
typedef struct tagACCEL { // accl 
    BYTE   fVirt; 
    WORD   key; 
    WORD   cmd; 
} ACCEL;
Создаём экземпляр этой структуры, заполняем, и создаём акселератор:
C++
1
2
3
4
5
ACCEL a;
a.cmd = CM_ABOUT;
a.fVirt = FCONTROL | FVIRTKEY;
a.key = 0x41;
HACCEL  hAccel = CreateAcceleratorTable(&a, 1);
После чего запускаем приложение и с растопыренными глазами смотрим, что при нажатии клавиш Ctrl+A уже ничего не происходит, даже не отсылается WM_COMMAND.

Чудеса? Нет, конечно!
После неудачной попытки создать акселератор в runtime, ищем в заголовочных файлах определение структуры ACCEL:
C++
1
2
3
4
5
6
7
8
9
10
11
typedef struct tagACCEL {
#ifndef _MAC
    BYTE   fVirt;               /* Also called the flags field */
    WORD   key;
    WORD   cmd;
#else
    WORD   fVirt;               /* Also called the flags field */
    WORD   key;
    DWORD  cmd;
#endif
} ACCEL, *LPACCEL;
И находим ещё одно определение этой структуры, о котором на MSDN и слова не сказано, даже в статье об этой структуре. Естественно, второе определение неактивно из-за препроцессорного условия.

Руководствуясь смекалкой, переопределяем структуру ACCEL:
C++
1
2
3
4
5
6
struct MyAccel
{
    WORD   fVirt;               /* Also called the flags field */
    WORD   key;
    DWORD  cmd;
};
Снова заполняем экземпляр структуры и вызываем CreateAcceleratorTable():
C++
1
2
3
4
5
MyAccel a;
a.cmd = CM_ABOUT;
a.fVirt = FCONTROL | FVIRTKEY;
a.key = 0x41;
HACCEL  hAccel = CreateAcceleratorTable((ACCEL*)&a, 1);
Запускаем приложение и уже с чуть менее растопыренными глазами наблюдаем ожидаемое от приложения поведение – вызов MessageBox'a по нажатию Ctrl+A. Говорить могу только за себя. На других компьютерах это приложение не тестировал. И, собственно, вопрос: может ли кто-нибудь прокомментировать моё данное наблюдение и, если необходимо, указать на допущенные мною ошибки, приведшие к такому стечению обстоятельств?

Я использовал Microsoft Visual Studio 2010 Express, OS – Windows 7 Домашняя расширенная, x64.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.01.2018, 22:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание акселераторов в runtime посредством CreateAcceleratorTable() или ошибочна ли документация с MSDN (C++ WinAPI):

Документация MSDN 2010-2014 - C++ WinAPI
Здравствуйте! Подскажите, где можно скачать полную документацию MSDN по C/C++ 2010-2014 года? У меня установлена от 2006 года, но она уже,...

Документация MSDN - C++
В библиотеках Windows'a нашел интересные статьи по поводу консоли. Есть ли перевод этой документации? Можно ли их как скачать, чтобы...

MSDN и подобная документация - C#
При открытии документации Visual Studio 2010 или MSDN видится множество пространств имен, классов структур и т.д. каждый такой элемент...

Заменяемость MSDN или Visual.Net - Visual Basic .NET
Работаю на vb6 IDE. Help Требует msdn библиотеку. Нигде в городе не могу найти дисков, говорят уже сняли с продажи. Но есть visual.net,...

Операторы в интерфейсе, кто прав, Troelson или MSDN ? - C#
Читаю Troelson-а, у него написано C# interfaces can define operators! читаю MSDN там написано An interface can't contain constants, fields,...

Где можно скачать MSDN или аналогичны русский HELP? - VB
Здраствуйте! У меня эсть два вопроса: 1. Где можно скачать MSDN или аналогичны русский HELP? 2. Как записывается программу в...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.01.2018, 22:18
Привет! Вот еще темы с ответами:

Можно ли через ардуино по USB посредством кнопки или сенсора включить или выключить монитор компютера? - Arduino
Можно ли через ардуино по USB при помощи кнопки или сенсора включить или выключить монитор компютера?

Создание бд Postgresql в runtime - Delphi БД
Подскажите, как создать программно бд postgresql с помощью компонентов ZEOSLib.

Документация по ИДЕЕ или Эклипсу. - Java
нужны доки по ИДЕЕ или Эклипсу, и вообще на чем остановиться помогите разобраться!!! я к сожалению только начинаю!

Создание визуальных компонет RunTime - VB
Дает ли VB возможность решения Subj? Заранее спасибо, Евгений


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.