Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
43-70_otvety_na_teplogo.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
87.53 Кб
Скачать

63,Б. Использование системного меню для построения меню пользователя

Для добавления в системное меню пользовательских команд необходимо, сперва получить описатель (хэндл) системного меню. Делается это так:

hMenu = GetSystemMenu(hwnd, FALSE);

После чего нужный пункт меню добавляется в системное меню таким образом:

AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);

AppendMenu(hMenu, MF_STRING, IDM_ABOUT, "About...");

В данном случае к системному меню добавится разделитель и пункт «About…».

Для удаления добавленных пунктов меню нужно сделать так:

GetSystemMenu(hwnd, TRUE);

64. Клавиши акселератора. Назначение и описание в файле ресурсов. Обработка сообщений от клавиш акселератора в цикле обработки сообщений.

64,А. Отличия сообщения wm_command для меню и акселераторов

Предполагается, что акселераторі определені в главном окне hwnd. Функция TranslateMessage проверяет посланное сообщение msg на соответсвие акселератору главного окна, если комбинация клавиш соответсвует то посілает сообщение WM_COMMAND с идентификатором акселератора. В этом случае функции TranslateMessage и DispatchMessage не выполняются.

64,Б. Зачем нужны акселераторы, если имеются различные виды сообщений от клавиатуры?

Предназначены для дублирования действия отдельных пунктов меню. Каждый акселератор имеет ID действия, который совпадает в большинстве случаев с ID 1из MENUITEM, однако можно описать акселератор, который выполняет собственное действие и имеет свой ID.

Это комбинация из 1 или нескольких клавиш, и можно было бы отказаться от акселераторов, и обрабатывать сообщения от клавиатуры и выполнять теже действия, однако меню и программа обработки действия находятся в оконнной процедуре главного окна, если фокус принадлежит дочернему окну, то все сообщения клавиатуры поступающие в дочернее окно, и тогда в нем надо дублировать действие акселераторов.

64,В. Дополнения в цикле чтения сообщений при использовании акселераторов.

Для того чтобы акселераторы работали, необходимо выполнить два условия:

  • должна быть загружена таблица акселераторов. Для этого используется функция LoadAccelerators;

  • сообщения, пришедшие от акселератора, следует преобразовать в сообщение WM_COMMAND. Здесь нам пригодится функция TranslateAccelerator.

    Остановимся подробнее на втором пункте. Функция TranslateAccelerator преобразует сообщения WM_KEYDOWNи WM_SYSKEYDOWN в сообщения WM_COMMAND и WM_SYSCOMMAND соответственно. При этом в старшем слове параметра WPARAM помещается 1 как отличие для акселератора. В младшем слове, как вы помните, содержится идентификатор пункта меню. Возникает вопрос: для чего необходимы два сообщения WM_COMMAND ИWM_SYSCOMMAND? Здесь все закономерно: сообщение WM_SYSCOMMAND генерируется для пункта системного меню или меню окна

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

{ if (!Translate Accelerator(hwnd,hAccel,&msg))

{TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

}

64,Г. Порядок загрузки акселераторов в приложение.

4 способа построения акселераторов

  1. “char”, id[SHIFT][CONTROL][ALT]

‘A’, ID_A

Такой акселератор зависит от регистра и языковой панели т.е. для его работы надо проверять: Shift, Caps Lock, языковую панель.

  1. “^Char”, ID [,SHIFT][,ALT]

‘^A’, ID_A

Комбинация Ctrl+Char -> генератор уникальных кодов и не зависит от языковой панели, Shift, Caps Lock.

  1. nCode, ID, ASCII[,SHIFT][,CONTROL][,ALT]

65, ID_A, ASCII

Совпадает с 1-м типом и имеет те же недостатки.

  1. nCode, ID, VirtKey [,SHIFT][,CONTROL][,ALT]

Виртуальные коды для каждой клавиши уникальны и не зависят от комбинаций других клавиш. Такие акселераторы используют обычно функциональные клавиши:

VK_F5, ID_START1, VIRTKEY //Запуск на отладку

VK_F5, ID_START2, VIRTKEY, CONTROL //Запуск без отладки

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

{ if (!Translate Accelerator(hwnd,hAccel,&msg))

{TranslateMessage(&Msg);

DispatchMessage(&Msg);

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]