wc.lpszClassName - "#201"

Имя ресурса не должно начинаться с цифры, и для работы системных функций, работающих с меню, компилятор ресурсов автоматически добавляет к строке "201" первый символ #. Есть и другой вариант работы, когда используется следующая строка:

wc.lpszClassName - (char *)201

В указатель wc. 1 pszCl assName будет занесено число 201. Ни одна строка не может иметь такого адреса. Операционная система распознает это по нулю в старшем слове wc. IpszClassName и использует для идентификации меню не строку по адресу wc. 1 pszCl assName, а целое число (і nt) wc. 1 pszCl assName.

Рассмотренная ситуация возникает, если в редакторе ресурсов имя IDRMENU1 задать строкой без кавычек. Редактор выполнит с именем меню такие же действия, как с названиями его пунктов, то есть сначала сгенерирует число (например, 101), азатем вставит в заголовочный файл resource.h, кроме команд меню, следующую строку:

#define IDR_MENU1 101

В результате ресурс будет идентифицироваться строкой #101 или числом 101, поэтому при регистрации оконного класса уже нельзя использовать оператор

Создание и использование меню

wc.lpszClassName - "IDR_MENU1". Но нельзя и написать wc.lpszClassName - IDR_MENU1, так как в этом случае проект не пройдет даже этапа компиляции из-за попытки записать целое число 101 в строку wc. 1 pszCl assName.

Чтобы не смущать программиста явным преобразованием целого в указатель, преобразование (char*) 101 выполняется специальным макросом MAKEINTRE-S0URCEC101). Понятно, что при включении в программу файла resource.h для этого удобнее использовать синоним числа 101, как показано ниже:

MAKEINTRESOURCE(IDR_MENU1)

В седьмой версии Visual Studio изменился порядок замены имени меню. Надо выделить имя меню в окне Resource View, а потом переключиться в окно Properties Window, в котором имя уже можно будет изменить.

Порядок обмена сообщениями при работе с меню

Сообщение WM_COMMAND не является единственным сообщением, которое генерируется при работе пользователя с меню. Предположим, что пользователь щелкнул левой кнопкой мыши на подменю File и в раскрывшемся подменю медленно перевел курсор на последний пункт Save. Он увидит, что при прохождении курсора над очередным пунктом тот выделяется особым цветом текста и фона. А после этого пользователь щелкнул на пункте Save и получил на экране текст Выбран пункт меню Save, выведенный функцией MessageBox(). В следующем списке перечислены сообщения, которые будут при этом поступать в окно приложения: О WM_SYSCOMMAND. При щелчке на пункте File сообщение WM_LBUTT0ND0WN из очереди потока в оконную функцию, естественно, не попадает, так как меню не является рабочей областью. Но по этому сообщению операционная система перешлет оконной процедуре сообщение WM_SYSCOMMAND, указывающее, что на экран необходимо вывести подменю. Источник сообщения идентифицируется значением параметра wParam.


⇐ Предыдущая| |Следующая ⇒