Бит изображения 0 1
Пиксели экрана
0 1
1 0
Используя нотацию языка С для этих операций, вывод на экран осуществляется в соответствии со следующей формулой:
Display = ( Display & Mask ) /\ Image
Для 16-цветного значка маска битового образа — монохромна и формируется указанным выше способом. Битовый образ изображения содержит 4 бита на пиксель для отображения 16 цветов. Все четыре бита устанавливаются в 1 для той области значка, в которой цвет фона инвертируется.
Получение описателя иконок
В файле описания ресурсов ссылка на файл иконки выглядит примерно так:
myicon ICON iconfile . ico
где ICONFILE . ICO — имя файла значка. В этой инструкции значку присваивается имя " myicon ".
В редакторе ресурсов Microsoft Visual C ++, вы можете задать имя иконки, ее идентификационный номер ( ID _ ICONn ) с помощью диалогового окна "Свойства" (" Properties "), которое можно вызвать, кликнув правой клавишей мыши на идентификаторе нужной иконке.
В программе на С для получения описателя значка используется функция Loadlcon . В функции Loadlcon имеется два параметра. Первым является описатель экземпляра вашей программы, который в WinMain обычно называется hInstance . Этот описатель требуется для Windows , чтобы определить, в каком файле с расширением *.ЕХЕ содержится ресурс значка. Вторым параметром является имя значка из описания ресурсов, заданное в виде указателя на оканчивающуюся нулем строку. Возвращаемым значением функции Loadlcon является значение типа HICON , которое определяется в WINDOWS . H .
Имеется связь между именем значка в описании ресурсов и в инструкции, содержащей функцию Loadlcon вашей программы на С:
Описание ресурсов :
myicon ICON iconfile.ico
Исходный текст программы :
HICON hicon = Loadlcon (hInstance, ''myicon");
Не беспокойтесь о том, в верхнем или нижнем регистре задано имя иконки. Компилятор преобразует в файле описания ресурсов имя иконки символы верхнего регистра и вставляет это имя в таблицу ресурсов в заголовке файла программы с расширением *.ЕХЕ. При первом вызове функции Loadlcon , Windows преобразует строку, заданную вторым параметром в символы верхнего регистра и отыскивает в таблице ресурсов файла с расширением *.ЕХЕ совпадающее с этой строкой имя.
Вместо имени вы также можете использовать число (16-разрядное беззнаковое WORD ). Это число называется идентификатором ( ID ) значка. Ниже показано как это делается:
Описание ресурсов:
125 ICON iconfile . ico
Исходный текст программы:
hicon = Loadlcon ( hInstance , MAKEINTRESOURCE (125));
MAKEINTRESOURCE ( make an integer into a resourse string — преобразовать целое в строку ресурса) является макросом, определенным в заголовочных файлах Windows , который преобразует число в указатель, но со старшими 16 разрядами, установленными в нуль. Так Windows узнает, что второй пара-метр функции Loadlcon является числом, а не указателем на символьную строку.
Если, вы использовали идентификатор иконки, вы можете прочитать его при помощи этого идентификатора (фактически, это аналогично предыдущему случаю, с той разницей, что вы используете не числовое значение, а имя константы ID _ ICONn , которая читается компилятором из файла ресурсов). Например,
hicon = Loadlcon ( hInstance , MAKEINTRESOURCE ( ID _ ICON 1 ));
Использование идентификаторов вместо имен иконок уменьшает размер файла с расширением .ЕХЕ и, вероятно, немного ускоряет работу функции Loadlcon . Больше того, если в вашей программе используется множество значков, то вы обнаружите, что проще хранить их идентификаторы в массиве.
Ранее мы уже использовали предопределенные значки:
Loadlcon ( NULL , IDI _ APPLICATION ) ;
Поскольку параметр hinstance установлен в NULL , Windows узнает, что эта иконка является предопределенным. IDI _ APPLICATION также определяется в заголовочных файлах Windows с использованием макроса MAKEINTRESOURCE :
# define IDI _ APPLICATION MAKEINTRESOURCE (32512)
– 47 –
Предопределенные иконки и курсоры являются частью файла драйвера дисплея.
Использование иконок в программе
Хотя для обозначения программ Windows использует значки несколькими способами, во множестве программ для Windows значок задается только при определении класса окна:
wndclass.hlcon = Loadlcon(hinstance, "Myicon");
wndclass.hIconSm = Loadlcon(hinstance, "MySmIcon");
Вы можете в обеих инструкциях сослаться на один и тот же значок стандартного размера, и Windows при выводе маленькой иконки на экран просто приведет его к необходимому размеру. Если в дальнейшем вы захотите изменить значок программы, это можно сделать с помощью функции SetClassLong . Предположим, что у вас в описании ресурсов был второй значок:
anothericon ICON iconfi.l2.ico
С помощью следующей инструкции вы можете заменить этот значок значком " myicon ":
SetClassLong ( hwnd, GCL_HICON, Loadlcon(hinstance, "anothericon") );
Маленькую иконку можно заменить с помощью GCL_HICONSM.
Если вы сохранили описатель иконки, возвращенный функцией Loadlcon , то вы также можете и нарисовать значок в рабочей области вашего окна:
DrawIcon (hdc, x, у , hicon) ;
Сама Windows использует функцию DrawIcon при выводе иконки вашей программы в соответствующее место. Windows получает описатель значка из структуры класса окна. Вы можете получить описатель тем же способом:
DrawIcon (hdc, x, у, GetClassLong(hwnd, GCL_HICON) );
Использование альтернативных курсоров
Инструкции для задания курсора в файле описания ресурсов и для получения описателя курсора в вашей программе очень похожи на показанные ранее инструкции для иклнок:
Описание ресурсов: mycursor CURSOR cursflle.cur
Исходный текст программы: hCursor = LoadCursor (hinstance, "mycursor");
Другие способы, показанные для значков (использование идентификаторов и MAKEINTRESOURCE), также работают и для курсоров. В заголовочные файлы Windows включается определение typedef HCURSOR, которое вы можете использовать для хранения описателя курсора.
Вы можете использовать описатель курсора, полученный при вызове функции LoadCursor, при задании поля hCursor структуры класса окна:
wndclass.hCursor = LoadCursor (hinstance, "mycursor");
Это заставляет курсор мыши, если он оказывается в рабочей области вашего окна, превращаться в ваш пользовательский курсор.
Если вы используете дочерние окна, можно сделать так, чтобы курсор выглядел по-разному в разных окнах. Если в вашей программе определяются классы этих дочерних окон, то для каждого класса вы можете использовать свой курсор путем соответствующей установки поля hCursor в каждом классе окна. А если вы используете предопределенные дочерние элементы управления, то изменить поле hCursor класса окна можно с помощью функции:
SetClassLong(hwndChild, GCL_HCURSOR, LoadCursor(hinstance, "childcursor") ) ;
Если вы разделяете рабочую область окна вашей программы на маленькие логические области без использования дочерних окон, то для изменения курсора мыши вы можете использовать функцию SetCursor.
SetCursor (hCursor) ;
Функцию SetCursor следует вызывать при обработке сообщения WM_MOUSEMOVE. В противном случае для перерисовки курсора при его движении Windows использует курсор, ранее заданный в классе окна.
Битовые образы: картинки в пикселях
Мы уже говорили об использовании битовых образов в значках и курсорах. В Windows также включен тип ресурсов с именем BITMAP.
Битовые образы используются в двух главных целях. Первая — рисование на экране картинок. Например, файлы драйверов дисплеев в Windows содержат массу крошечных битовых образов, которые используются для рисования стрелок в полосах прокрутки, галочек в раскрывающихся меню, изображе-ний на кнопках изменения размеров окна, флажках и переключателях. Вы можете использовать битовые образы в меню и панелях инструментов приложений . В таких программах, как Paint, битовые образы используются для изображения графического меню.
Вторая цель использования битовых образов — создание кистей. Кисти, как вы уже знаете, являются шаблонами пикселей, которые Windows использует для закрашивания изображаемых на экране областей.
Для создания битовых образов и их описания используются те же средства, что и для иконок.
Для загрузки битового образа в программу используется функция LoadBitmap, которая аналогична функциям LoadIcon и LoadCusor. Ее возвращаемым значением является описатель битового образа:
HBITMAP hBitmap = LoadBitmap (hinstance, szAppName) ;
Этот описатель затем можно использовать для создания шаблонной кисти (pattern brush). Основой кисти является битовый образ:
HBRUSH hBrush = CreatePatternBrush (hBitmap) ;
Когда Windows закрашивает этой кистью область экрана, битовый образ повторяется по горизонтали и вертикали до заполнения ограничивающей области.
Главное отличие между битовыми образами и остальными ресурсами в их практической важности и может быть легко выражено так: битовые образы являются объектами GDI. Хороший стиль составления программ рекомендует, что битовые образы должны быть удалены из программы, если в них отпадает нужда, или если программа завершается.
DeleteObject((HGDIOBJ) hBrush) ;
DeleteObject ( (HGDIOBJ) hBitmap) ;
– 49 –
Символьные строки
Наличие ресурса для символьных строк может вначале показаться странным. Тем более, что не было никаких проблем при использовании привычных символьных строк, определенных в качестве переменных непосредственно в теле исходного текста нашей программы.
Ресурсы-символьные строки предназначены главным образом для облегчения перевода вашей программы на другие языки. Как будет рассказано далее, меню и окна диалога также являются частью описания ресурсов. Если вместо непосредственного использования строк в исходном тексте вашей программы, вы используете ресурсы - символьные строки, то весь текст вашей программы, окажется в одном файле — файле описания ресурсов. Если текст в файле описания ресурсов переводится, то все, что вам нужно сделать для иноязычной версии вашей программы, это перекомпоновать программу и добавить переведенные ресурсы в файл с расширением *.ЕХЕ. Этот способ намного безопасней, чем возня с исходными кодами вашей программы.
Использование ресурсов-символьных строк
Ресурсы - символьные строки определяются в описании ресурсов с помощью ключевого слова STRINGTABLE:
STRINGTABLE {
idl, "character string 1" id2, "character string 2" [определения остальных строк] }
В описании ресурсов может содержаться только одна таблица строк. Максимальный размер каждой строки — 255 символов. В строке не может быть управляющих символов языка С, за исключением \t (табуляция). Однако, символьные строки могут содержать восьмеричные константы:
Табуляция (Tab) \011
Перевод строки (Linefeed) \012
Возврат каретки (Carriage return) \015
Эти управляющие символы распознаются функциями DrawText и MessageBox.
Вы можете использовать функцию LoadString для копирования строки из ресурса в буфер в сегменте данных вашей программы:
LoadString (hinstance, id, szBuffer, i Max Length) ;
Параметр id соответствует идентификатору, который предшествует каждой строке в файле описания ресурсов; szBuffer — это указатель на символьный массив, в который заносится символьная строка; i Max Length — это максимальное число передаваемых в siBuffer символов. Идентификаторы строк, которые предшествуют каждой строке, обычно являются идентификаторами макроопределений, которые задаются в заголовочном файле. Многие программисты, программирующие под Windows, для идентификаторов строк используют префикс IDS_.
Ресурсы, определяемые пользователем
Ресурсы, определяемые пользователем (user-defined resourse) удобны для включения самых разнообразных данных в ваш файл с расширением *.ЕХЕ и получения доступа в программе к этим данным. Данные могут содержаться в любом выбранном вами формате — текстовом или бинарном. При загрузке данных в оперативную память возвращаемым значением функций Windows, которые используются для доступа к определяемым пользователем ресурсам, является указатель на данные. С этими данными вы можете делать все, что угодно. Вы вероятно решите, что этот способ хранения и
доступа к разнообразным данным удобнее, чем альтернативный, при котором данные хранятся в других файлах и доступ к ним осуществляется через функции файлового ввода.
Например, предположим, что у вас есть файл PROGHELP.TXT, в котором содержится текст "подсказок" для вашей программы. Такой файл не должен быть в чистом виде ASCII-файлом: в нем также могут содержаться бинарные данные, например, указатели, которые могли бы помочь при ссылках на различные части этого файла. Следующим образом опишите ссылку на этот файл в вашем файле описания ресурсов:
helptext TEXT proghelp.txt
Имена helptext (имя ресурса) и TEXT (тип ресурса) в этом выражении могут быть любыми. Слово TEXT написано прописными буквами просто, чтобы сделать его похожим на слова ICON, CURSOR и BITMAP. To, что мы здесь делаем, является созданием ресурса вашего собственного типа, который называется TEXT.
В процессе инициализации программы (например, при обработке сообщения WM_CREATE), можно получить описатель этого ресурса:
hResource = LoadResource (hinstance, FindResource (hinstan.ce, "TEXT", "helptext")) ;
Переменная hResource определяется как имеющая тип HGLOBAL . Несмотря на свое имя, функция LoadResource фактически не загружает сразу ресурс в оперативную память. Используемые вместе, так как это было показано, функции LoadResource и FindResource по существу эквивалентны функциям Loadlcon и LoadCursor . Фактически, функции Loadlcon и LoadCursor используют функции LoadResource и FindResource .
Вместо имен и типов ресурсов можно использовать числа. Числа могут быть преобразованы в дальние указатели при вызове функции FindResource с использованием MAKEINTRESOURCE . Числа, используемые в качестве типа ресурса, должны быть больше 255. (Числа от 1 до 9 при вызове функции FindResource используются в Windows для существующих типов ресурсов.)
Когда вам необходимо получить доступ к тексту, вызывайте функцию LockResource:
pHelpText = LockResource ( hResource ) ;
Функция LockResource загружает ресурс в память (если он еще не был загружен), и возвращает указатель на него. После окончания работы с этим ресурсом, вы можете освободить оперативную память, вызвав функцию FreeResource:
FreeResource ( hResource ) ;
Даже если вы не вызовите функцию FreeResource, после завершения работы программы оперативная память все равно будет освобождена.
Меню
Меню — это, вероятно, наиболее важная часть пользовательского интерфейса, который предлагают программы для Windows , а добавление меню к вашей программе — это относительно простая задача программирования для Windows . Вы просто определяете структуру меню в вашем описании ресурсов и присваиваете каждому пункту меню уникальный идентификатор. Вы определяете имя меню в структуре класса окна. Когда пользователь выбирает пункт меню. Windows посылает вашей программе сообщение WM _ COMMAND , содержащее этот идентификатор.
Строка меню выводится на экране непосредственно под строкой заголовка. Эта строка иногда называется главным меню (main menu) или меню верхнего уровня (top-level menu) программы. Выбор элемента главного меню обычно приводит к вызову другого меню, появляющегося под главным, и
– 51 –
которое обычно называют всплывающим меню (popup menu) или подменю (submenu). Вы также можете определить несколько уровней вложенности всплывающих меню: т. е. определенный пункт всплывающего меню может вызвать появление другого всплывающего меню. Иногда, с целью увеличе-ния информативности, вызов каких-то пунктов меню приводит к появлению окон диалога. (Об окнах диалога рассказывается в следующей главе.) В большинстве родительских окон, в левой части строки заголовка, имеется маленький значок программы. Щелчок на этом значке приводит к появлению системного меню, которое фактически является всплывающим меню другого типа.
Пункты всплывающих меню могут быть помечены ( checked ), при этом слева от текста элемента меню Windows ставится специальная метка или "галочка". Галочки позволяют пользователю узнать о том, какие опции программы выбраны из этого меню. Эти опции могут быть взаимоисключающими. Пункты главного меню помечены быть не могут.
Пункты меню в главном и всплывающих меню могут быть "разрешены" ( enabled ), "запрещены" ( disabled ) или "недоступны" ( grayed ). Слова "активно" ( active ) и "неактивно" ( inactive ) иногда используются, как синонимы слов "разрешено" и "запрещено". Пункты меню, помеченные как разрешенные или запрещенные, для пользователя выглядят одинаково, а недоступный пункт меню выводится на экран в сером цвете.
С точки зрения пользователя все пункты меню, разрешенные, запрещенные и недоступные, могут быть выбраны. (Отличие только в том, что при выборе запрещенных или недоступных пунктов меню с приложением ничего не происходит.) Пользователь может щелкнуть клавишей мыши на запрещенном пункте меню, или переместить к запрещенному пункту меню подсветку, или переключиться на пункт меню с помощью буквенной клавиши, соответствующей этому пункту. Однако, с позиции вашей программы разрешенные, запрещенные и недоступные пункты меню функционируют по-разному. Сообщения WM _ COMMAND Windows посылает в программу только для разрешенных пунктов меню. Используйте запрещенные и недоступные пункты меню только для тех опций, которые в данный момент не могут быть выбраны. Для того чтобы пользователь знал, какие опции не могут быть выполнены, делайте их недоступными.
Структура меню
Если вы создаете или изменяете меню программы, полезно разделять главное меню и все всплывающие меню. У главного меню имеется описатель меню, у каждого всплывающего меню внутри главного меню имеется собственный описатель меню, и у системного меню (тоже являющегося всплывающим меню) тоже имеется описатель меню.
Каждый пункт меню определяется тремя характеристиками. Первая характеристика определяет то, что будет отображено в меню. Это либо строка текста, либо битовый образ. Вторая характеристика определяет либо идентификатор, который Windows посылает вашей программе в сообщении WM _ COMMAND , либо всплывающее меню, которое Windows выводит на экран, когда пользователь выбирает данный пункт меню. Третья характеристика описывает атрибут пункта меню, включая то, является ли данный пункт запрещенным, недоступным или помеченным.
Шаблон меню
Меню можно создать тремя разными способами. Наиболее обычным (и самым простым) является определение меню в файле описания ресурсов, для чего можно использовать редактор ресурсов, прилагаемый к современным пакетам программирования, либо непосредственно в текстовом виде в форме шаблона меню, например:
MyMenu MENU
{ [список элементов меню]
}
MyMenu — это имя меню. Вы ссылаетесь на это имя в структуре класса окна. Обычно имя меню такое же, как имя приложения. Внутри квадратных скобок можно использовать либо инструкцию MENUITEM, либо POPUP. Инструкция MENUITEM имеет следующий формат:
MENUITEM " SText ", id [, признаки]
Формат инструкции POPUP :
POPUP " SText " [, признаки]
{
[список элементов меню]
}
Вместо фигурных скобок можно использовать ключевые слова BEGIN и END . Текст, выводимый для каждого пункта меню должен быть заключен в парные кавычки. Амперсант (&) вызывает подчеркивание следующего за ним символа при выводе на экран. Windows ищет этот же символ, когда пользователь выбирает элемент меню с использованием клавиши < Alt >. Если не включить амперсант в текст, то в тексте меню не будет подчеркнутых символов, и Windows будет использовать первую букву текста при поиске.
Признаками в операторах MENUITEM и POPUP , которые появляются в списке главного меню, являются следующие:
· GRAYED — Данный пункт меню недоступен и не генерирует сообщений WM _ COMMAND . Текст изображается недоступным (серым цветом).
· INACTIVE — Данный пункт меню неактивен и не генерирует сообщений WM _ COMMAND . Текст изображается обычным образом.
· MENUBREAK — Данный пункт меню, а также все последующие появляются на экране в новой строке меню.
· HELP — Данный пункт меню, а также все последующие появляются на экране, выровненными по правому краю.
Признаки могут комбинироваться с помощью символа поразрядной операции OR языка С (|), но опции GRAYED и INACTIVE нельзя использовать вместе. Опция MENUBREAK не используется в главном меню, поскольку Windows автоматически создает новую строку главного меню, если окно слишком узкое для размещения всех пунктов меню в одну строку.
Следующие за инструкцией POPUP в главном меню квадратные скобки (или ключевые слова BEGIN и END ) ограничивают список пунктов всплывающего меню. При определении всплывающего меню допускаются следующие инструкции:
MENUITEM " text ", id [, признаки] а также:
MENUITEM SEPARATOR
– 53 –
а также :
POPUP "text" [, признаки ]
MENUITEM SEPARATOR рисует во всплывающем меню горизонтальную черту. Эта черта часто используется для разделения групп, связанных по смыслу и назначению опций.
Для пунктов всплывающего меню в строке символов можно использовать символ табуляции \ t для разделения текста по столбцам. Текст, следующий за символом \ t располагается в новом столбце, с достаточным отступом вправо для размещения в первом столбце всплывающего меню самой длинной строки текста. Символ \а выравнивает следующий за ним текст по правому краю. Признаками в инструкциях MENUITEM , относящихся к всплывающим меню, являются следующие:
· CHECKED — Слева от текста появляется метка ("галочка").
· GRAYED — Данный пункт меню недоступен и не генерирует сообщений WM _ COMMAND . Текст изображается недоступным (серым цветом).
· INACTIVE — Данный пункт меню неактивен и не генерирует сообщений WM _ COMMAND . Текст изображается обычным образом.
· MENUBREAK — Данный пункт меню, а также все последующие появляются на экране в новом столбце.
· MENUBARBREAK — Данный пункт меню, а также все последующие появляются на экране в новом столбце. Столбцы разделяются между собой вертикальной чертой.
Опции GRAYED и INACTIVE нельзя использовать вместе. Опции MENUBREAK и MENUBARBREAK нельзя использовать вместе. Если число пунктов всплывающего меню больше, чем можно разместить в одном столбце, необходимо использовать либо MENUBREAK , либо MENUBARBREAK .
Значения идентификаторов в инструкциях MENUITEM — это числа, которые Windows посылает оконной процедуре в сообщениях меню. Значение идентификатора должно быть уникальным в рамках меню. Вместо чисел может оказаться удобнее использовать идентификаторы, определенные в заголовочном файле. По договоренности эти идентификаторы начинаются с символов IDM ( ID for a menu , идентификатор меню).
Ссылки на меню в вашей программе
Во многих приложениях Windows в описании ресурсов имеется только одно меню. Ссылка в программе на это меню имеет место в определении класса окна:
wndclass . lpszMenuName = " MyMenu " ;
Часто программисты используют строку имени программы в качестве имени меню, имени класса окна, имени значка программы. Однако, вместо имени для меню можно использовать число (или идентификатор). Тогда описание ресурса выглядело бы так:
45 MENU { [определение меню] }
В этом случае, оператор присваивания для поля IpszMenuName структуры класса окна может быть либо такой:
wndclass.lpszMenuName = MAKEINTRESOURCE (45) ;
либо такой :
wndclass.lpszMenuName = "#45" ;
Хотя задание имени меню в классе окна является наиболее обычным способом ссылки на ресурс меню, существуют альтернативные варианты. В приложении для Windows ресурс меню можно загрузить в память с помощью функции LoadMenu , которая аналогична функциям Loadlcon и LoadCursor , описанным в главе 9. Если в описании ресурса меню используете имя, то возвращаемым значением функции LoadMenu является описатель меню:
hMenu = LoadMenu ( hinstance , " MyMenu ") ;
При использовании числа функция LoadMenu принимает либо такой вид:
hMenu = LoadMenu (hinstance, MAKEINTRESOURCE (45));
либо такой :
hMenu = LoadMenu ( hinstance , "#45") ;
Затем этот описатель меню можно указать в качестве девятого параметра функции Create Window .
hwnd = CreateWindow ("MyClass", "Window Caption", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, hMenu, hinstance, NULL) ;
В этом случае меню, указанное при вызове функции CreateWindow , перекрывает любое меню, заданное в классе окна. Меню, задаваемое в классе окна, можно считать заданным по умолчанию меню для окон, созданных на основе данного класса окна, если девятый параметр функции CreateWindow установлен в NULL . Поэтому можно использовать разные меню для различных окон, созданных на основе одного и того же класса окна.
– 55 –
Можно также указать NULL для меню при регистрации класса окна и NULL для меню при вызове функции CreateWindow , а затем присоединить меню к окну следующим образом:
SetMenu ( hwnd , hMenu ) ;
Любое меню, связанное с окном, удаляется при удалении окна. Любое несвязанное с окном меню перед завершением работы программы должно быть явно удалено при помощи вызова функции DestroyMenu .
Меню и сообщения
Когда пользователь выбирает пункт меню, Windows посылает оконной процедуре несколько различных сообщений. Большинство из этих сообщений могут игнорироваться программой, и просто передаваться DefWindowProc . Одним из таких сообщений является сообщение WM _ INITMENU , которое имеет сле-дующие параметры:
wParam – описатель главного меню, lParam – 0.
Значением параметра wParam является описатель главного меню, даже если пользователь выбирает пункт системного меню. В программах для Windows сообщение WM _ INITMENU обычно игнорируется. Это сообщение существует для того, чтобы дать вам возможность изменить меню или выполнить другое действие перед тем, как будет выбран пункт меню.
Кроме того, программа получает сообщения WM _ MENUSELECT . Если пользователь перемещает курсор мыши по пунктам меню, программа может получить множество сообщений WM _ MENUSELECT . Это полезно при использовании строки состояния, содержащей полное описание опции меню. Данное сообщение имеет следующие параметры:
Младшее слово
(LOWORD) wParam
Выбранный пункт: идентификатор меню или описатель всплывающего меню
Старшее слово
(HIWORD) wParam Флаги выбора
Iparam
Описатель меню, содержащего выбранный пункт
Сообщение WM _ MENUSELECT — это сообщение для отслеживания перемещения по меню. Младшее слово параметра wParam говорит о том, какой пункт меню выбран (подсвечен) в данный момент. В старшем слове параметра wParam могут быть комбинации из следующих флагов выбора: MF _ G RAYED , MF _ DISABLED , MF _ CHECKED , MF _ BITMAP , MF _ POPUP , MF _ HELP , MF _ SYSMENU и MF _ MOUSESELECT . Сообщение WM _ MENUSELECT может понадобиться для того, чтобы изменить что-нибудь в рабочей области окна на основе информации о перемещении подсветки по пунктам меню. В большинстве программ это сообщение передается в DefWindowProc.
Когда Windows готова вывести на экран всплывающее меню, она посылает оконной процедуре сообщение WM _ INITMENUPOPUP со следующими параметрами:
wParam
Описатель всплывающего меню
Младшее слово
(LOWORD) IParam
Индекс всплывающего меню
Старшее слово (HIWORD) IParam
Для системного меню 1, в противном случае 0
Это сообщение важно, если необходимо разрешать или запрещать пункты меню перед их выводом на экран. Например, предположим, что программа с помощью команды Paste всплывающего меню может копировать текст из буфера обмена. При получении для этого всплывающего меню сообщения WM _ INITMENUPOPUP необходимо определить, имеется ли текст в буфере обмена. Если нет, то необходимо сделать этот пункт меню Paste недоступным.
Самым важным сообщением меню является WM_COMMAND. Это сообщение показывает, что пользователь выбрал разрешенный пункт меню окна. Сообщения WM_COMMAND также посылаются дочерними окнами управления. Если оказывается, что для меню и дочерних окон управления используются одни и те же идентификаторы, то различить их можно с помощью значения параметра IParam, который для пункта меню будет равен 0:
Младшее слово (LOWORD) wParam
Меню: Идентификатор меню
Старшее слово (HIWORD) IParam wParam
0 0
Элемент управления:
Идентификатор элемента управления
Код уведомления Описатель дочернего окна
Сообщение WM_SYSCOMMAND похоже на сообщение WM_COMMAND за исключением того, что сообщение WM_SYSCOMMAND сигнализирует, что пользователь выбрал разрешенный пункт системного меню:
Младшее слово (LOWORD) wParam
Старшее слово IParam (HIWORD) wParam
Системное Идентификатор меню 0 меню:
0 (Если сообщение WM_SYSCOMMAND является результатом щелчка мыши, тогда старшее и младшее слово IParam являются, соответственно, экранными координатами Х и Y курсора мыши.)
Идентификатор меню показывает, какой пункт системного меню выбран. Для предопределенных пунктов системного меню, четыре младших разряда должны быть замаскированы. Результирующая величина будет одной из следующих:
SC_SIZE, SC_MOVE, SC_MINIMIZE, SC_MAXIMIZE, SC_NEXTWINDOW, SCJPREVWINDOW, SC_CLOSE, SC_VSCROLL, SC_HSCROLL, SC_ARRANGE, SC_RESTORE и SC_TASKLIST. Кроме того, младшее слово параметра wParam может быть SC_MOUSEMENU или SC_KEYMENU.
– 57 –
Если вы добавите к системному меню новые пункты, то младшее слово параметра wParam станет идентификатором, который вы определите. Для избежания конфликта с предопределенными идентификаторами меню, используйте значения меньше чем Ох F ООО. Важно, чтобы обычные сообщения WM_SYSCOMMAND передавались в DefWindowProc. Если этого не сделать, то обычные команды системного меню будут отключены.
Последним сообщением, которое мы обсудим, является сообщение WM_MENUCHAR, которое, в действительности, не является собственно сообщением меню. Windows посылает это сообщение оконной процедуре в одном из двух случаев: если пользователь нажимает комбинацию клавиши <Alt> и символьной клавиши, несоответствующей пунктам меню, или при выводе на экран всплывающего меню, если пользователь нажимает символьную клавишу, не соответствующую пункту всплывающего меню. Параметры сообщения WM_MENUCHAR являются следующими:
Дата добавления: 2016-11-22; просмотров: 749;