Что такое код insertmenu


Содержание

How to insert html code

HTML code can be added to the body of the page (inside the tag), or to the zone of the whole site or page.

To add the block to your page, go to Block Library → Other category → T123 block «Embed HTML code».

You can use ready-made code from various services (there are examples) or your own code.

The block supports HTML, JavaScript (inside the

How to insert HTML code in head of a website or page

To insert code to head for all pages, go to Site Settings → More → HTML code for head zone.

To insert code to head for one page, go to Page Settings → Additional → HTML code for head zone.

InsertMenu

Описание

function InsertMenu(Menu: HMenu; Position, Flags, IDNewItem: Word; NewItem: PChar): Bool;

Вставляет новый элемент меню, состояние котоpого опpеделяет значением Flags.

Паpаметpы

  • Menu: Идентификатоp меню.
  • Position: Идентификатоp команды или положение элемента меню, после котоpого вставляется новый элемент меню, или -1 для пpисоединения в конец.
  • Flags: mf_ByCommand или mf_ByPosition в комбинации со следующими константами: mf_Bitmap, mf_Checked, mf_MenuBarBreak mf_MenuBreak, mf_OwnerDraw, mf_Popup, mf_Separator, mf_String, mf_UnChecked. См. pаздел «Флаги меню mf_» в главе 1.
  • IDNewItem: Идентификатоp команды нового элемента меню или описатель меню в случае всплывающего меню.
  • NewItem: Содеpжимое нового элемента меню.

Возвpащаемое значение

Не нуль в случае успешного завеpшения; нуль — в пpотивном случае.

InsertMenu() при разных процессах и вызове кода

Я пишу программу, которая вставляет дополнительные опции в контекстное меню заголовка окна других окон, чем в моем собственном процессе. Вот как я узнал, как это сделать: добавление настраиваемого пункта контекстного меню в строку заголовка Windows Form. Мне просто нужно иметь действительный дескриптор IntPtr для этого окна. Я тестировал его, и он работает. Вторая часть делает мое приложение (а не другой процесс) что-то делать, когда пользователь выбирает эту опцию из контекстного меню из окна другого процесса. Я не вижу прямого способа обнаружить это. Я знаю, что я могу настроить крючки, чтобы моя программа слушала все сообщения Windows на моей машине (WM_SYSCOMMAND из окна, которое меня интересует), но из того, что я видел, это решение довольно сложно, и мне интересно, есть ли способ назначить какой-нибудь делегат или что-то в этом меню?

Сообщения отправляются в окно целевого процесса. Поэтому вам нужно будет запустить ваш код в этом процессе. Это будет связано с инъекцией DLL, поэтому вам потребуется написать собственный код, а не С#. Вам нужно будет вставить DLL и подклассу окна, которое получает сообщения, чтобы ваш код мог сделать первый снимок.

Урок 18. Системное меню

На этом уроке изучим системное меню. Сейчас мы с вами посмотрим, как можно в вашем приложении изменить системное меню. Это меню, как известно, появляется при нажатии на иконке в левом верхнем углу вашего приложения.

Часто для небольшого приложения вполне достаточно изменения только этого меню (если вам всего надо добавить только 1-2 пункта в ваше приложение). Для изменения этого меню мы должны использовать API-функцию InsertMenu . Также нам пригодится API-функция GetSystemMenu — она возвращает указатель на системное меню.

Вот конкретный пример кода:

InsertMenu(menu, 5, MF_ByPosition, 1000, ‘About’);

Этот код надо поместить, например, в обработчик нажатия кнопки (при нажатии на которую и будет добавляться в системное меню новый пункт). Разумеется, переменная menu типа HMENU должна быть до этого определена.

Параметры у функции InsertMenu следующие: первый — это указатель на системное меню. Его мы получили через API-функцию GetSystemMenu . Второй — это номер позиции, на которую наш новый пункт меню вставится (нумерация идет с нуля). Значение третьего параметра ( MF_ByPosition ) говорит о том, что второй параметр интерпретируется именно как номер позиции для нового пункта меню. Четвертый — это идентификатор меню (мы задали для него значение 1000). И, наконец, пятый — это заголовок нового пункта меню.

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

Сейчас при выборе этого пункта ничего не происходит. Давайте добавим обработчик. Для этого вносим объявление нового обработчика в соответствующее место кода нашей формы.

rocedure SystemMenu(var Msg:TMessage); Message WM_SysCommand;

Далее пишем сам обработчик :

procedure TForm1.SystemMenu(var Msg:TMessage);

if Msg.wParam=1000 Then // если выбрали меню с идентификатором 1000

Теперь при выборе нашего пункта меню естественно появится messagebox «О программе . «.

Глава 12. В глубине меню

Чем хуже готовят повара,

тем вежливей должны быть официанты.

Что такое меню, как оно создается и как с ним работать? Начальные сведения уже были приведены в главе 4, здесь же мы постараемся осветить эти вопросы более подробно. Однако, прежде чем переходить к изучению соответствующих средств Windows и библиотеки MFC, необходимо рассмотреть стандартные типы меню, которые можно создавать в приложениях Windows, и их основные характеристики.

Основные типы меню

Меню обычно располагается под полосой заголовка в верхней части перекрывающегося или всплывающего окна и представляет собой словесные или символические опции, дающие возможность манипулировать особенностями программы. Такое меню называется Главным меню приложения (верхний уровень иерархии). Отдельные элементы меню располагаются в полосе меню ( menu bar ) — рис. 12.1 и 12.2.

Элементы меню могут иметь различные типы и содержать ряд модификаторов (рис. 12.3):

  • командная клавиша — вместо выбора пункта меню команду можно вызвать с помощью этой клавиши;
  • стрелка — показывает, что при выборе данного элемента появится подменю;
  • разделительная черта — отделяет одну группу элементов меню от другой;
  • маркер — означает, что данный параметр меню выбран;
  • многоточие — сообщает пользователю о том, что при выборе данного элемента на экран будет выведен блок диалога;
  • полутоновая надпись — говорит, что в текущем состоянии данный элемент меню недоступен;
  • знак подчеркивания — означает, что данный элемент меню можно вызвать с помощью командной клавиши (комбинации клавиш), куда входит эта буква. Такие буквы называются мнемоническими.

Рис. 12.1. Заголовок и Главное меню приложения WordPad

Рис. 12.2. Раскрытое меню пункта «Вид»

Рис. 12.3. Команда, имеющая подменю

Каждое окно, имеющее заголовок, может иметь системное меню, которое вызывается щелчком левой кнопки мыши на пиктограмме, расположенной в левой части заголовка окна (рис. 12.4), и представляет собой набор стандартных команд. В Windows 95 системное меню появляется, если щелкнуть правой кнопкой мыши в полосе заголовка или на пиктограмме свернутого окна.

Рис. 12.4. Системное меню

Система Windows предоставляет специальный тип меню, которое можно создавать в любом месте экрана. Такое меню называется контекстным или плавающим ( floating popup menu) и не привязано к полосе меню (рис. 12.5)’. Оно ассоциируется с некоторой областью окна или объектом, например, пиктограммой. Контекстное меню в некоторых случаях удобнее других, т. к. его содержимое зависит от того, для какого объекта оно было создано. Обычно оно выводится на экран щелчком правой кнопки мыши.

Рис. 12.5. Контекстное меню рабочей области окна приложения WordPad

Теперь, перечислив основные типы используемых в Windows меню, рассмотрим те возможности, которые предоставляет библиотека MFC для работы с ними.

Точно так же, как в Win32 API есть функции, специально предназначенные для работы с меню, в библиотеке MFC есть для них адекватные альтернативы, реализованные в виде класса СМenu (рис. 12.6), полностью вобравшего в себя функции API.

Рис. 12.6. Место класса СМenu в иерархии библиотеки MFC

Класс СМenu инкапсулирует объект Windows, определяемый дескриптором HMENU , и предоставляет функции для работы с меню. С помощью этого класса приложение может создавать меню, даже не имея его шаблона, добавлять или удалять элементы или подменю, управлять их состоянием — активизировать или блокировать, отмечать команды и т. д.

Рассмотрим основные члены этого класса.

Определяет дескриптор HMENU меню Windows, присоединенного к объекту класса, для создания которого, как обычно, используется конструктор.

Конструктор меню. Следует совершенно четко представлять, что при создании объекта не происходит автоматического создания самого меню. Для того чтобы это реализовать, необходимо вызвать одну из функций, отвечающих за создание или загрузку меню.

Для создания «пустого» меню, т. е. меню, не содержащего ни одной строчки и ни одного подменю, достаточно воспользоваться функцией

Создает пустое меню Windows и присоединяет его к объекту класса. Добавлять в него элементы можно, используя функции AppendMenu и InsertMenu. При успешном создании меню функция возвращает TRUE и FALSE — в случае неудачи.

Для того чтобы добавить в существующее меню некоторое подменю, в классе реализована функция

Создает пустое подменю. Добавить в него элементы можно с помощью тех же функций — AppendMenu и InsertMenu. При успешном завершении функция возвращает TRUE и FALSE — в случае неудачи.

Если создание меню производится на основе шаблона, то можно воспользоваться функциями

BOOL CMenu:: LoadManu (LPCTSTR IpszResourceName)

BOOL CMenu:: LoadMenu (UINT nIDResource)

Загружают ресурс меню из исполняемого файла приложения и присоединяют его к объекту. В качестве параметра используется либо указатель на текстовую строку IpszResourceName, содержащую имя ресурса загружаемого меню, либо его числовой идентификатор nID.

Если по каким-либо причинам понадобилось меню, которое не присоединяется ни к одному окну, то при завершении работы с ним следует воспользоваться функцией

Удаляет меню перед завершением работы приложения и возвращает системе занимаемые им ресурсы.

Для изменения состава меню, созданного функцией CreateMenu , в классе предусмотрена специальная группа функций.

Добавление элементов в меню производится функциями AppendMenu и InsertMenu .

BOOL CMenu:: AppendMenu (

const CBitmap *pBmp)

Функции добавляют новый элемент в конец меню. Состояние элемента задается параметром nFlags, который может содержать одно или несколько из следующих значений:

При изображении элемент меню отмечается (MF_CHECKED) или не отмечается (MF_UNCHECKED) галочкой

Элемент меню доступен (MF_ENABLED) или блокирован (MF_DISABLED), но изображается обычным (черным) цветом

Элемент меню блокирован и изображается серым цветом

Элемент меню верхнего уровня выводится с новой строки, а элемент подменю— в новом столбце без разделительной вертикальной линии

Аналогично MF_MENUBREAK, но дополнительно новый столбец отделяется вертикальной линие й

Меню само отвечает за изображение своего элемента

Элемент меню имеет ассоциированное с ним подменю, дескриптор которого задается в параметре nIDNewItem

Элемент представляет собой горизонтальную разделительную линию; этот флаг не может комбинироваться с MF_POPUP и MF_DISABLED; при установленном данном флаге все другие игнорируются

Элемент представляет собой текстовую строку

При использовании этих флагов следует иметь в виду, что нельзя комбинировать следующие флаги:

  • MF_DISABLED, MF_ENABLED и MF_GRAYED
  • MF_STRING, MFJDWNERDRAW, MF_SEPARATOR и битовый массив
  • MF_MENUBREAK и MF_MENUBARBREAK
  • MF_CHECKED и MF_UNCHEGKED

Параметр nIDNewltem определяет идентификатор команды нового элемента, а если nFlags установлен в MF_POPUP, то дескриптор (HMENU) подменю. Через этот параметр передается дополнительная информация о содержимом нового элемента, если nFlags принимает одно из следующих значений:

Содержит 32-битное значение, которое приложение может использовать в качестве дополнительных данных, ассоциированных с элементом меню, при обработке сообщений WM_MEASUREITEM и WM_DRAWITEM

Параметр рВтр определяет указатель на объект класса СВ’Лтар, который может использоваться в качестве содержимого элемента меню вместо текстовой строки. При этом параметр nFlags не может принимать значения MF_OWNERDRAW и MF_STRING.

LPCTSTR IpszNewltem = NULL)

const CBitmap *pBmp)

Функции вставляют новый элемент в позицию, определяемую параметром nPosition, и сдвигают вниз существующие элементы. Значения всех параметров, кроме nFlags, такие же, как и для функции AppendMenu. Параметр nFlags дополнительно используется для интерпретации значения nPosition:

Определяет идентификатор элемента меню, перед которым вставляется новый элемент

Определяет порядковый номер элемента меню, перед которым вставляется новый элемент; если установить nPosition = —1, то элемент будет добавлен в конец меню

Если требуется не вставлять новый, а заменить существующий элемент меню, то можно воспользоваться функциями:

const CBitmap *pBmp)

Параметры этих функций идентичны параметрам функций AppendMenu и InsertMenu за исключением того, что новый элемент не вставляется в меню, а заменяет тот, на который указывает параметр nPosition.

Для удаления элемента из меню в классе предусмотрены две функции:

BOOL CMenu: rDeleteMenu (

Функции удаляют элемент меню, задаваемый параметром nPosition, значение которого интерпретируется так же, как в функции InsertMenu. Отличие между функциями заключается в том, что при удалении подменю функцией DeleteMenu все связанные с ним ресурсы освобождаются, а в случае RemoveMenu— нет, и можно снова воспользоваться удаленным элементом (по его идентификатору) .

Для изменения состояния элемента меню используется функция:

Позволяет установить элемент меню nlDEnableltem в одно из трех состояний (задается параметром nEnable): доступное (MF_ENABLED), запрещенное (MF_DISABLED) или заблокированное (MF_GRAYED). Эти значения должны комбинироваться с одним из флагов MF_BYCOMMAND или MF_BYPOSITION, которые определяют, каким образом задается элемент — идентификатором или порядковым номером. Функция возвращает предыдущее состояние элемента или —1, если элемент не существует.

У элемента можно проставить отметку с помощью следующих функций.

Устанавливает или сбрасывает галочку у элемента меню. Параметр nCheck может принимать значение MF_CHECKED или MFJJNCHECKED, как обычно, в комбинации с флагами MF_BYCOMMAND или MF_BYPOSITION, которые определяют интерпретацию параметра nIDChecked— идентификатор или порядковый номер. Функция возвращает предыдущее состояние элемента или —1, если элемент не существует.

BOOL CMenu:: CheckMenuRadioItem (

Помечает определенный элемент меню в группе переключателей, одновременно сбрасывая метку у остальных элементов группы. Для отметки элемента вместо галочки используется кружок. Параметры nIDFirst и nIDLast определяют, соответственно, первый и последний элемент в группе переключателей. Сам отмечаемый элемент задается параметром nIDItem. Параметр nFlags определяет интерпретацию этих параметров и может принимать одно из значений: MF_BYCOMMAND или MF_BYPOSITION.

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

const CBitmap *pBmpUnchecked,

const CBitmap *pBmpChecked)

Функция ассоциирует с элементом меню битовые массивы, которые будут выводиться для помеченного (pBmpChecked) и непомеченного (pBmpUnchecked) состояний. Параметры nPosffion и nFlags определяют элемент меню по идентификатору или порядковому номеру. Если либо pBmpChecked, либо pBmpUnchecked равен NULL, то для соответствующего атрибута рядом с элементом ничего не отображается, а если оба параметра равны NULL, то используются стандартные галочка и кружок. При использовании функции следует иметь в виду, что при разрушении меню не происходит автоматического удаления битовых массивов — эта задача возлагается на приложение.

После внесения в меню всех изменений необходимо вызвать функцию

Производит перерисовку полосы меню.

Для поддержки работы с контекстными меню в классе реализована функция

LPCRECT IpRect = 0)

Выводит на экран контекстное меню и создает свой собственный цикл обработки сообщений. Функция не завершается до тех пор, пока работа с меню не будет закончена либо выбором элемента, либо отказом от выбора, после чего меню уничтожается. Параметр nFlags определяет расположение контекстного меню (относительно экрана) и кнопку мыши, с помощью которой должен выполняться выбор. Он может содержать одно из трех значений (для расположения на экране) в комбинации с одним из двух флагов для кнопки мыши.

Значения параметра nFlags для задания расположения меню на экране

Центрирование относительно координаты, заданной параметром х

Выравнивание по левой границе относительно координаты, заданной параметром х

Выравнивание по правой границе относительно координаты, заданной параметром х

Значения параметра nFlags для кнопки мыши

Использование левой кнопки мыши

Использование правой кнопки мыши

Параметр pWnd задает окно, которое получит сообщение WM_COMMAND после того, как пользователь сделает выбор в контекстном меню, a IpRect является указателем на структуру типа ПЕСТ (или класса CRect), определяющую координаты прямоугольной области, в которой пользователь может выполнять выбор из меню. Если щелчок мышью будет сделан вне этой области, контекстное меню исчезнет с экрана, что эквивалентно отказу от выбора. Если для IpRect задать значение NULL, то размеры и расположение этой прямоугольной области будут совпадать с размерами контекстного меню.

В классе представлены две виртуальные функции, которые произвольным образом позволяют изменять внешний вид меню: Measureltem и Drawltem . Но они заслуживают отдельного разговора и мы к ним вернемся в разделе «Самоотображение элементов меню» данной главы.

Теперь, после теоретического знакомства с возможностями, заложенными в классе СМеnu , можно переходить к практическим аспектам и тонкостям программирования при построении и работе с меню.

В системе Windows реализованы три способа создания меню:

1. На основе шаблона, задаваемого в файле ресурса.

2. Динамическое создание при помощи специальных функций.

3. На основе шаблона в оперативной памяти. Рассмотрим каждый из этих способов более подробно.

Создание меню на основе шаблона

Этот подход мы уже рассматривали и поэтому не будем останавливаться на нем более подробно, а приведем только описание атрибутов, определяющих внешний вид и поведение строки меню (рис. 12.7, табл. 12.1).

Рис. 12.7. Атрибуты меню в окне свойств, открытом в режиме настройки параметров меню

Может кому надо! сорри, если было. Инженерные коды для «Андроид»

Многие пользователи смартфонов и планшетов на Android даже не подозревают о существовании так называемых инженерных или сервисных кодов. Сервисные коды на смартфонах и на обычных телефонах появились намного раньше, чем вышла первая версия ОС Андроид. Они предназначены в основном для инженеров сервисных центров и продвинутых пользователей, поэтом сразу хотим предупредить читателей: если не знаете для чего этот код, то не стоит вводить, а если все же решили ввести код, то делаете на свой страх и риск. Стоит подумать прежде, чем вводить какой-либо код для «Андроид», т.к. это может привести к частичной или полной потери данных и вывести из строя само устройство. Если же Вы приняли решение использовать коды, давайте рассмотрим каждый инженерный код подробнее:

#06# — Узнать IMEI;

##4636## — Сведения и настройки;

##8351## — Voice Dialer Logging Enabled;

##4636## — Этот код может быть использован для получения интересной информации о телефоне и аккумулятора. Он показывает следующие 4 меню на экране:
— Информация о телефоне;
— Информация об аккумуляторах;
— Статистика аккумулятора;
— Статистика использования.

##7780## — Этот код сбрасывает следующие настройки на заводские:
— настройки Вашего Google-аккаунта, хранящиеся на Вашем смартфоне;
— данные и настройки системы и приложений;
— загруженные приложения.
Код НЕ удаляет:
— текущие системные приложения и приложения поставляющиеся со смарфоном;
— данные на SD карте (фото, видео и т.д.).
PS: Перед тем, как сбросить настройки смартфон запросит подтверждение, так что до самого последнего момента у Вас будет шанс передумать.

27673855# — Подумайте прежде, чем вводить этот код. Этот код используется для заводского форматирования, то есть, запускает удаление всех файлов и настроек включая те, которые хранятся во внутренней памяти. Так же он переустанавливает прошивку смартфона.
PS: После введения кода есть только один путь назад — быстро вытащить батарею и начать восстановление данных через ПК.

##34971539## — Этот код используется для получения информации о камере телефона. Он показывает следующие четыре параметра:
— Обновление прошивки камеры в образ (не пытайтесь повторить этот вариант);
— Обновление прошивки камеры на SD-карте;
— Получить версию прошивки камеры;
— Посмотреть сколько раз обновлялась прошивка.
ВНИМАНИЕ: Никогда не используйте первый вариант, в противном случае ваша камера телефона перестанет работать, и придется нести телефон в сервисный центр для переустановки прошивки камеры.

Илон Маск рекомендует:  Что такое код pdf_open_image

##7594## — Этот код может быть использован для изменения режима кнопки «Отбой / Вкл.Выкл.». По умолчанию, при длительном нажатии кнопки, будет показан экран с предложением выбрать любой вариант: «Переключиться в беззвучный режим», «Режим полета» или же «Выключить смартфон».
Вы можете изменить предложенные варианты используя этот код. К примеру, можно сделать так, чтобы телефон сразу же выключался, без выбора из меню нужного варианта.

##273283255663 282## — Код открывает экран копирования файлов, на котором можно сделать резервные копии своих данных (фото, аудио и т.п.)

##197328640## — Этот код можно использовать для входа в режим обслуживания. Вы можете запускать различные тесты и изменять настройки в сервисном режиме для WLAN, GPS и Bluetooth;

##232339## или ##526## или ##528## — WLAN (используйте кнопку «Меню» для запуска различных тестов);

##232338## — показывает MAC адрес WiFi;

##1575## — Еще один тест GPS;

##232337## — Показывает адрес устройства Bluetooth;

Коды для запуска различных заводских тестов:
##0283## — Пакетные Loopback;

##0842## — Устройство тест (тест вибрации и подсветки тест);

##2663## — Сенсорный экран, версия;

##2664## — Сенсорный экран, тест;

Это основные коды для «Андроид», которые могут понадобится продвинутому пользователю смартфона. Еще раз повторимся: не вводите коды, если не уверены в их предназначении! Но для решения некоторых проблем в работе устройства на «Андроид» эти коды крайне полезны.

Дубликаты не найдены

там немного опечатался по невнимательности, пикабу отказывает мне в редактировании!
Многие пользователи смартфонов и планшетов на Android даже не подозревают о существовании так называемых инженерных или сервисных кодов. Сервисные коды на смартфонах и на обычных телефонах появились намного раньше, чем вышла первая версия ОС Андроид. Они предназначены в основном для инженеров сервисных центров и продвинутых пользователей, поэтом сразу хотим предупредить читателей: если не знаете для чего этот код, то не стоит вводить, а если все же решили ввести код, то делаете на свой страх и риск. Стоит подумать прежде, чем вводить какой-либо код для «Андроид», т.к. это может привести к частичной или полной потери данных и вывести из строя само устройство. Если же Вы приняли решение использовать коды, давайте рассмотрим каждый инженерный код подробнее:

*#06# — Узнать IMEI;

*#*#4636#*#* — Сведения и настройки;

*#*#8351#*#* — Voice Dialer Logging Enabled;

*#*#4636#*#* — Этот код может быть использован для получения интересной информации о телефоне и аккумулятора. Он показывает следующие 4 меню на экране:
— Информация о телефоне;
— Информация об аккумуляторах;
— Статистика аккумулятора;
— Статистика использования.

*#*#7780#*#* — Этот код сбрасывает следующие настройки на заводские:
— настройки Вашего Google-аккаунта, хранящиеся на Вашем смартфоне;
— данные и настройки системы и приложений;
— загруженные приложения.
Код НЕ удаляет:
— текущие системные приложения и приложения поставляющиеся со смарфоном;
— данные на SD карте (фото, видео и т.д.).
PS: Перед тем, как сбросить настройки смартфон запросит подтверждение, так что до самого последнего момента у Вас будет шанс передумать.

*2767*3855# — Подумайте прежде, чем вводить этот код. Этот код используется для заводского форматирования, то есть, запускает удаление всех файлов и настроек включая те, которые хранятся во внутренней памяти. Так же он переустанавливает прошивку смартфона.
PS: После введения кода есть только один путь назад — быстро вытащить батарею и начать восстановление данных через ПК.

*#*#34971539#*#* — Этот код используется для получения информации о камере телефона. Он показывает следующие четыре параметра:
— Обновление прошивки камеры в образ (не пытайтесь повторить этот вариант);
— Обновление прошивки камеры на SD-карте;
— Получить версию прошивки камеры;
— Посмотреть сколько раз обновлялась прошивка.
ВНИМАНИЕ: Никогда не используйте первый вариант, в противном случае ваша камера телефона перестанет работать, и придется нести телефон в сервисный центр для переустановки прошивки камеры.

*#*#7594#*#* — Этот код может быть использован для изменения режима кнопки «Отбой / Вкл.Выкл.». По умолчанию, при длительном нажатии кнопки, будет показан экран с предложением выбрать любой вариант: «Переключиться в беззвучный режим», «Режим полета» или же «Выключить смартфон».
Вы можете изменить предложенные варианты используя этот код. К примеру, можно сделать так, чтобы телефон сразу же выключался, без выбора из меню нужного варианта.

*#*#273283*255*663 282*#*#* — Код открывает экран копирования файлов, на котором можно сделать резервные копии своих данных (фото, аудио и т.п.)

*#*#197328640#*#* — Этот код можно использовать для входа в режим обслуживания. Вы можете запускать различные тесты и изменять настройки в сервисном режиме для WLAN, GPS и Bluetooth;

*#*#232339#*#* или *#*#526#*#* или *#*#528#*#* — WLAN (используйте кнопку «Меню» для запуска различных тестов);

*#*#232338#*#* — показывает MAC адрес WiFi;

*#*#1575#*#* — Еще один тест GPS;

*#*#232331#*#* — Bluetooth- тест;

*#*#232337#*# — Показывает адрес устройства Bluetooth;

Коды для запуска различных заводских тестов:
*#*#0283#*#* — Пакетные Loopback;

*#*#0673#*#* или *#*#0289#*#* — Мелодия-тест;

*#*#0842#*#* — Устройство тест (тест вибрации и подсветки тест);

*#*#2663#*#* — Сенсорный экран, версия;

*#*#2664#*#* — Сенсорный экран, тест;

*#*#0588#*#* — Датчик движения;

*#*#3264#*#* — RAM версия.

Это основные коды для «Андроид», которые могут понадобится продвинутому пользователю смартфона. Еще раз повторимся: не вводите коды, если не уверены в их предназначении! Но для решения некоторых проблем в работе устройства на «Андроид» эти коды крайне полезны.

Win32 API. Меню

Written on 17 Февраля 2007 . Posted in Win32

ОГЛАВЛЕНИЕ

Строки меню и меню

Меню выстраивается иерархически. На верхнем уровне иерархии стоит строка горизонтальное меню (menu bar); вертикальные или просто меню (menus) выскакивают вниз из строки меню, а в нижних уровнях – подменю (submenus). Строка меню иногда называется меню верхнего уровня (top-level menu), а меню и подменю также известны как всплывающие меню (pop-up menus).

Пункт меню может или выполнить команду или открыть подменю. Пункт, который выполняет команду, называется командным пунктом (command item) или командой (command).

Пункт в горизонтальном меню почти всегда открывает меню. Строки меню редко содержат командные пункты. Меню, открытое из строки меню выскакивает вниз из нее и иногда называется выскакивающее меню (drop-down menu). Когда выскакивающее меню показывается на экране, оно связано со строкой меню. Пункт меню в строке меню, который открывает выскакивающее меню, называется также именем меню (menu name).

Имена меню в строке меню представляют основные категории команд, которые обеспечивает прикладная программа. Выбор имени меню из строки меню обычно открывает меню, пункты которого соответствуют командам в данной категории. Например, строка меню может содержать имя меню Файл (File) которое, когда выбрано пользователем, активизирует меню с пунктами такими как Создать (New), Открыть (Open) и Сохранить (Save).

Только перекрывающее или выскакивающее окно может содержать строку меню; дочернее окно не может содержать её. Если окно имеет область заголовка, Windows устанавливает строку меню прямо под ней. Строка меню всегда видима. Подменю не видимо, но только до тех пор, пока пользователь не выберет пункт меню, который активизирует его. Для получения дополнительной информации о перекрывающих и выскакивающих окнах, см. Общие стили окна.

Каждое меню должно иметь окно владельца. Windows отправляет сообщения окну владельцу меню, когда пользователь выбирает меню или избирает пункт из меню. Эти сообщения описаны в разделе Сообщения используемые меню.

Вспомогательное меню

Windows к тому же предоставляет и вспомогательное меню (shortcut menus). Вспомогательное меню не связано со строкой меню; оно может появляться где угодно на экране. Прикладная программа обычно связывает вспомогательное меню с частями окна, такими как рабочая область или с конкретным объектом, типа пиктограммы. По этой причине, эти меню также называются «контекстные меню».

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

Меню окна

Меню окна (window menu) (известное также как Системное меню (System menu или Control menu)) — всплывающее меню, определяемое и управляемое почти исключительно операционной системой. Пользователь может открыть меню окна щелчком по пиктограмме программы в области заголовка или щелкая правой кнопкой мыши где-нибудь в области заголовка.

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

Когда пользователь выбирает команду из меню окна, Windows отправляет сообщение WM_SYSCOMMAND окну владельцу меню. В большинстве прикладных программ, оконная процедура не обрабатывает сообщения из меню окна. Вместо этого, она просто посылает сообщения в функцию DefWindowProc для обработки сообщения системой по умолчанию. Если прикладная программа добавляет команду в меню окна, оконная процедура должна обрабатывать эту команду.

Прикладная программа, которая модифицирует меню окна, может использовать функцию GetSystemMenu, чтобы создать копию заданного по умолчанию меню окна. Любое окно, которое не использует функцию GetSystemMenu, чтобы делать свою собственную копию меню окна, получает стандартное меню окна.

Идентификатор справки

С каждой строкой меню, меню, подменю и вспомогательным меню связан 32-разрядный идентификатор справки. Если пользователь нажимает клавишу F1, в то время, когда меню активно, это значение оправляется окну владельцу как часть сообщения WM_HELP. Для получения дополнительной информации о идентификаторах справки, см. главу Справка.

Дескрипторы меню

Система создает уникальный дескриптор для каждого меню. Дескриптор меню (menu handle) является значением типа HMENU. Прикладная программа должна определять дескриптор меню во многих из функций меню Windows. Вы получаете дескриптор строки меню, когда создаете меню или загружаете ресурс меню. Для получения дополнительной информации о создании и загрузке меню, см. Создание меню.

Чтобы извлечь данные о дескрипторе строки меню для меню, которое было создано или загружено, используется функция GetMenu. Чтобы извлечь данные о дескрипторе подменю, связанного с пунктом меню, используйте функцию GetSubMenu или GetMenuItemInfo. Чтобы извлечь данные о дескрипторе меню окна, используйте функцию GetSystemMenu.

Пункты меню

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

Командные пункты и пункты, которые открывают подменю

Когда пользователь выбирает командный пункт, Windows отправляет сообщение о команде окну, которое владеет меню. Если командный пункт находится в меню окна, Windows отправляет сообщение WM_SYSCOMMAND. Иначе, она посылает сообщение WM_COMMAND.

Дескриптор соответствующего подменю связан с каждым пунктом меню, который его открывает. Когда пользователь указывает на такой пункт, Windows открывает подменю. Окну владельцу никакого сообщения о команде не посылается. Однако Windows отправляет сообщение WM_INITMENUPOPUP окну владельцу меню перед показом на экране подменю. Вы можете получить дескриптор подменю, связанного с пунктом меню при помощи использования функции GetSubMenu или GetMenuItemInfo.

Строка меню обычно содержит имена меню, но она может содержать также и командные пункты. Подменю обычно содержит командные пункты, но оно может содержать также и пункты, которые открывают вложенные подменю. Добавляя такие пункты в подменю, Вы можете вкладывать меню на любую глубину. Чтобы обеспечить пользователя визуальным сигналом, Windows автоматически показывает на экране маленькую стрелку справа от текста пункта меню, который открывает подменю.

Идентификатор пункта меню.

Уникальное, определяемое программой целое число, связанное с каждым пунктом меню, называется идентификатором пункта меню (menu-item identifier). Когда пользователь выбирает командный пункт из меню, Windows отправляет идентификатор пункта окну владельцу как часть сообщения WM_COMMAND. Оконная процедура проверяет идентификатор, чтобы установить источник сообщения и обрабатывает сообщение соответственно. Кроме того, Вы можете определить пункт меню, используя его идентификатор, когда вызываете функции меню; например, чтобы включить или отключить пункт меню.

Идентификатор пункта меню должен быть значением от 0 до 65,535, даже притом, что это — 32-разрядное целое число. Это так потому, что сообщение WM_COMMAND посылает идентификатор пункта меню как младшее слово параметра wParam.

Пункты меню, которые открывают подменю, имеют идентификаторы, точно такие же, что и командные пункты. Однако Windows не отправляет сообщение о команде, когда такой пункт выбран из меню. Вместо этого, Windows открывает подменю, связанное с пунктом меню.

Чтобы извлечь данные об идентификаторе пункта меню в заданной позиции, используйте функцию GetMenuItemID или GetMenuItemInfo.

Позиция пункта меню

В дополнение к наличию уникального идентификатора, каждый пункт меню в строке меню или меню имеет уникальное значение позиции. Самый крайний левый пункт в горизонтальном меню или верхний пункт в меню, имеет позицию нуль. Значение позиции увеличивается на единицу для последующих пунктов меню. Windows присваивает значение позиции всем пунктам в меню, включая разделители.

При вызове функции меню, который модифицирует или возвращает информацию о конкретном пункте меню, Вы можете определить пункт, используя или идентификатор или позицию. Для получения дополнительной информации об изменении содержания меню, см. Модификации меню.

Заданные по умолчанию пункты меню

Подменю может содержать один заданный по умолчанию пункт меню. Когда пользователь открывает подменю, дважды щелкая мышью, Windows отправляет сообщение о команде окну владельцу меню и закрывает меню, как будто был выбран заданный по умолчанию командный пункт. Если нет никакого заданного по умолчанию командного пункта, подменю остается открытым. Чтобы извлечь данные и установить заданный по умолчанию пункт для подменю, используйте функции GetMenuDefaultItem и SetMenuDefaultItem.

Пункты меню с галочкой и без галочки

Пункт меню может быть или отмечен «галочкой» или без «галочки». Windows показывает на экране точечный рисунок рядом с отмеченными пунктами меню, чтобы обозначить их отмеченное состояние с «галочкой». Windows не показывает на экране точечный рисунок рядом с пунктами без «галочки», если определяемый программой точечный рисунок «без «галочки»» не определен. В меню только пункты могут быть отмечены «галочкой»; в строке меню командные пункты не могут быть отмечены «галочкой».

Прикладные программы обычно отмечают «галочкой» или снимают отметку «галочкой» в пункте меню, чтобы указать, который из нескольких параметров действует. Например, предположим, что прикладная программа имеет инструментальную панель, которую пользователь может показывать или скрывать при помощи использования команды Toolbar в меню. Когда инструментальная панель скрыта, у пункта меню Toolbar нет отметки «галочкой». Когда пользователь выбирает команду, прикладная программа отмечает «галочкой» пункт меню и показывает инструментальную панель.

Атрибут метки «галочкой » проверяет, отмечен ли пункт меню «галочкой». Вы можете установить атрибут отметки «галочкой » пункта меню при помощи использования функции CheckMenuItem. Вы можете использовать функцию GetMenuState, чтобы установить, отмечен или не отмечен в настоящее время пункт меню «галочкой».

Вместо CheckMenuItem и GetMenuState, Вы можете использовать функции GetMenuItemInfo и SetMenuItemInfo, чтобы извлекать данные и устанавливать наличие отметки «галочкой» в пункте меню.

Иногда, группа пунктов меню соответствует набору взаимоисключающих параметров. В этом случае, Вы можете обозначать выбранный параметр при помощи использования отметки пункта меню «радиоселектором» («радиоселектор» аналогичен органу управления «радио-кнопке»). Отметки пунктов меню «радиоселектором» отображаются точечным рисунком маркера вместо точечного рисунка отметки «галочкой». Чтобы отметить пункт меню и сделать его пунктом с «радиоселектором», используйте функцию CheckMenuRadioItem.


По умолчанию, Windows показывает на экране отметку «галочкой» или точечный рисунок «радиоселектора» рядом с отмеченными пунктами меню и без точечного рисунка рядом со снятыми отметками «галочкой» пунктами меню. Тем не менее, Вы можете использовать функцию SetMenuItemBitmaps, чтобы ассоциировать определяемые программой точечные рисунки отметки и снятие отметки «галочкой» с пунктом меню. Windows затем использует заданные точечные рисунки, чтобы указать состояние пункта меню с «галочкой» или без отметки «галочкой».

Определяемые программой точечные рисунки, связанные с пунктом меню, должны быть того же самого размера, как и заданный по умолчанию точечный рисунок «галочки», габариты которого могут изменяться в зависимости от разрешающей способности экрана. Чтобы извлечь данные о правильных размерах, используйте функцию GetMenuCheckMarkDimensions. Вы можете создавать многокомпонентные растровые ресурсы для различных разрешений экрана; создайте один растровый ресурс, и, в случае необходимости, масштабируйте его; или создайте точечный рисунок во время выполнения программы и рисуйте изображение в нем. Точечные рисунки могут быть или одноцветные или цветные. Однако, поскольку пункты меню, когда выделяются, инвертируются, внешний вид некоторых инвертированных цветных точечных рисунков может быть не самый лучший. Для получения дополнительной информации, см. Точечные рисунки.

Включенные, недоступные и заблокированные пункты меню

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

Когда пункты меню не доступны пользователю, они должны быть серыми или заблокированными. Недоступные и заблокированные пункты меню не могут быть выбраны. Заблокированный пункт выглядит точно так же как включенный пункт. Когда пользователь нажимает на заблокированный пункт, он не выбирается и ничего не происходит. Заблокированные пункты могут быть полезны, например, в руководстве, показывающем меню, которое выглядит активным, но (в учебных целях) не является таковым.

Прикладная программа окрашивает в серый цвет недоступный пункт меню, чтобы обеспечить визуальный сигнал пользователю, что команда не доступна. Вы можете использовать недоступный пункт, когда действие не соответствующе (например, Вы можете окрашивать в серый цвет команду Печать (Print) в меню Файл (File), когда в системе принтер не установлен).

Функция EnableMenuItem включает, окрашенный в серый цвет или отключенный пункт меню. Чтобы установить, каким является пункт меню включенным, недоступным или заблокированным, используйте функцию GetMenuItemInfo.

Вместо GetMenuItemInfo, Вы можете использовать также и функцию GetMenuState, чтобы установить включен, недоступен или заблокирован пункт меню.

Выделенные пункты меню

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

Нарисованные пользователем (собственные) пункты меню

Прикладная программа может полностью управлять внешним видом пункта меню при помощи использования нарисованного пользователем (собственного) пункта (owner-drawn item). Нарисованные пользователем пункты требуют, чтобы приложение брало всю ответственность на себя за состояние прорисовки выбора (выделения), «галочки» и снятие отметки «галочкой». Например, если прикладная программа предоставляет меню шрифта, она может прописывать каждый пункт меню при помощи использования соответствующего шрифта; пункт для Латинского шрифта будет прописан латинским, пункт для Курсива будет прописан курсивом и так далее.

Для получения дополнительной информации, см. Создание нарисованных пользователем пунктов меню.

Разделители пунктов меню и переносы строк

Windows предоставляет специальный тип пункта меню, называемый разделителем (separator), который появляется в виде горизонтальной линии. Вы можете использовать разделитель, чтобы поделить меню на группы родственных пунктов. Разделитель не может быть использован в строке меню, а пользователь не может выбрать разделитель.

Когда строка меню содержит большее количество имен пунктов меню, чем может разместить на одной строке, Windows переносит по словам строку меню, автоматически разрывая её на две или несколько строк. Вы можете заставить сделать перенос строки в конкретном пункте горизонтального меню, присвоив пункту флажок типа MFT_MENUBREAK. Windows размещает этот пункт и все последующие пункты на новой строке.

Когда меню содержит большее количество пунктов, чем может поместиться в одном столбце, Windows автоматически разрывает меню на два или несколько столбцов. Вы можете заставить сделать разрыв столбца в конкретном пункте в меню, присваивая пункту флажок типа MFT_MENUBREAK. Windows размещает этот пункт и все последующие пункты в новом столбце. Флажок типа MFT_MENUBARBREAK имеет то же самое влияние, за исключением того, что между новым и старым столбцом появляется вертикальная линия.

Если Вы используете функции AppendMenu, InsertMenu или ModifyMenu, чтобы назначить переносы строк, Вы должны присвоить типовые флажки MF_MENUBREAK или MF_MENUBARBREAK.

Доступ к меню с клавиатуры

Windows для меню предоставляет стандартный интерфейс с клавиатурой. Вы можете расширять этот интерфейс, предоставляя мнемонические клавиши доступа и клавиши — ускорители для ваших пунктов меню. Ниже следующие темы описывают стандартный интерфейс клавиатуры, клавиши доступа и сочетание быстрых клавиш.

Стандартный (общепринятый) интерфейс клавиатуры

Windows разработана так, чтобы работать с мышью, или без нее, или другим устройством управления позицией. Поэтому Windows предоставляет стандартный (общепринятый) интерфейс клавиатуры, благодаря которому пользователь может использовать клавиатуру, чтобы выбрать пункты меню. Этот интерфейс клавиатуры не нуждается в специальном коде. Прикладная программа получает командное сообщение, выбирает ли пользователь пункт меню через клавиатуру или при помощи использования мышь. Стандартный интерфейс клавиатуры обрабатывает следующие нажатия клавиши:

  • Буквенный символ — Выбирает первый пункт меню с заданным символом как клавиша доступа. Если выбранный пункт вызывает меню, меню отображается, а первый пункт выделяется. Иначе, пункт меню выбирается.
  • ALT — Переключает в режим или из режима строки меню.
  • ALT+SPACEBAR — Показывает на экране меню окна.
  • ENTER — Активизирует меню и выбирает его первый пункт, если пункт связан с этим меню. Иначе, это нажатие клавиши выбирает пункт, как будто пользователь отпустил кнопку мыши, в то время когда пункт был выбран.
  • ESC — Выход из режима меню.
  • LEFT ARROW (стрелка влево) — Циклически передвигается к предыдущему пункту меню верхнего уровня. Пункты меню верхнего уровня включают в себя имена меню и меню окна. Если выбранный пункт находится в меню, выбирается предыдущий столбец в меню или предыдущий пункт меню верхнего уровня.
  • RIGHT ARROW (стрелка вправо) — Работает подобно клавише СТРЕЛКА ВЛЕВО, за исключением того, что действует в противоположном направлении. В меню, это нажатие клавиши перемещает вперед на один столбец; когда текущий выбранный пункт находится в крайне правом столбце, выбранным является следующее меню.
  • UP или DOWN ARROWS (стрелки вверх или вниз) — Активизирует меню, когда нажимается на имени меню. Когда нажимается в меню, нажатие клавиши СТРЕЛКА ВВЕРХ выбирает предыдущий пункт; нажатие клавиши СТРЕЛКА ВНИЗ выбирает следующий.
Илон Маск рекомендует:  Как в Word заменить слово во всем тексте

Клавиши доступа к меню

Стандартный интерфейс клавиатуры для меню может быть расширен, при помощи добавления клавиш доступа (мнемонических) к пунктам меню. Клавиша доступа — подчеркнутый символ в тексте пункта меню. Когда меню активно, пользователь может выбрать пункт меню, нажимая клавишу, которая соответствует подчеркнутому символу пункта. Пользователь делает строку меню активной, нажимая клавишу ALT, чтобы выделить первый пункт в горизонтальном меню. Меню активизируется, когда оно показывается на экране.

Чтобы создать клавишу доступа для пункта меню, пред любым символом в текстовой строке пункта проставьте амперсанд. Например, текстовая строка «&Move» принуждает Windows подчеркнуть символ «M«.

Быстрые клавиши меню

В дополнение к имеемым клавишам доступа, пункт меню может иметь быструю клавишу, связанную с ним. Быстрая клавиша(сочетание клавиш) отличается от клавиши доступа тем, что меню, чтобы сработать по быстрой клавише, не должно быть активным. К тому же, клавиша доступа всегда связана с пунктом меню, в то время как быстрая клавиша — обычно (но не обязательно) связана с пунктом меню.

Текст, который идентифицирует быструю клавишу, добавляется в текстовую строку пункта меню. Текст клавишной комбинации быстрого вызова появляется справа от названия пункта меню, после наклонной черты влево (обратного слэша) и символа табуляции (\t). Например, «&Close\tAlt+F4» представляет команду Закрыть (Close) с комбинацией клавиш ALT+F4 как быстрой клавиши и с символом «C» как клавишей доступа. Для получения дополнительной информации, см. Ускорители клавиатуры.

Создание меню

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

Ресурсы шаблона меню

Большинство прикладных программ создает меню, используя ресурсы шаблона меню. Шаблон меню (menu template) определяет меню, включая в себя пункты в строке меню и всех меню. За информацией о создании ресурса шаблона меню, см. документацию, включенную в ваши инструментальные средства разработки.

После того, как Вы создадите ресурс шаблона меню и добавите его к исполняемому (.EXE) файлу вашего приложения, Вы можете использовать функцию LoadMenu, чтобы загрузить этот ресурс в память. Эта функция возвращает значение дескриптора меню, который Вы можете затем присваивать окну при помощи использования функции SetMenu.

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

Шаблон меню в памяти

Меню может быть создано из шаблона меню, который формируется в памяти во время выполнения программы. Например, прикладная программа, которая позволяет пользователю настраивать свое меню, может создать шаблон меню в памяти, основанной на стандартных установках пользователя. Приложение может затем сохранить шаблон в файле или в системном реестре для будущего использования. Чтобы создать меню из шаблона в памяти, используйте функцию LoadMenuIndirect. За описаниями форматов шаблона меню, обратись к статье Использование ресурса шаблона меню.

Стандартный шаблон меню состоит из структуры MENUITEMTEMPLATEHEADER, сопровождаемой одной или несколькими структурами MENUITEMTEMPLATE.

Расширенный шаблон меню состоит из структуры MENUEX_TEMPLATE_HEADER, сопровождаемой одной или несколькими структурами MENUEX_TEMPLATE_ITEM.

Функции создания меню

Используя функции создания меню, Вы можете создавать меню во время выполнения программы или добавлять пункты меню к существующим меню. Вы можете использовать функцию CreateMenu, чтобы создать пустую строку меню и функцию CreatePopupMenu, чтобы создать пустое меню. Чтобы добавлять пункты к меню, используйте функцию InsertMenuItem. Устаревшие функции AppendMenu и InsertMenu все еще поддерживаются, но для новых прикладных программ должна быть использована функция InsertMenuItem.

Показ меню на экране

После того, как меню было загружено или создано, оно должно быть связано с окном до того, как Windows сможет показать его на экране. Вы можете предназначить меню, при помощи определения меню класса. Для получения дополнительной информации о меню класса, см. Меню класса окна. Вы можете также предназначить меню для окна, при помощи определения дескриптора меню как параметра hMenu функции CreateWindow или CreateWindowEx или путем вызова функции SetMenu.

Чтобы показать на экране вспомогательное меню используют функцию TrackPopupMenuEx. Вспомогательное меню, также называемое плавающим, выскакивающим или контекстным меню, обычно показывается на экране, когда обрабатывается сообщение WM_CONTEXTMENU.

Устаревшая функция TrackPopupMenu все еще поддерживается, но новые прикладные программы должны использовать функцию TrackPopupMenuEx.

Меню класса окна

Вы можете определить заданное по умолчанию меню, называемое меню класса (class menu), когда регистрируете класс окна. Чтобы сделать так, присвойте имя ресурса шаблона меню элементу lpszMenuName структуры WNDCLASS, используемой для регистрации класса.

По умолчанию, каждому окну назначается меню класса для класса окна, так что вам не нужно явно загружать меню и присваивать его каждому окну. Вы можете заменять меню класса, при помощи определения другого дескриптора меню при вызове функции CreateWindowEx. Вы можете также изменить меню окна после того, как оно создано при помощи использования функция SetMenu. Для получения дополнительной информации, см. Классы окна.

Разрушение Меню

Если меню связано с окном, а это окно разрушено, Windows автоматически уничтожает меню, освобождая дескриптор меню и память, занятую меню. Windows не делает, автоматического уничтожения меню, которое не связано с окном. Прикладная программа должна уничтожить отмененное предназначение меню путем вызова функция DestroyMenu. Иначе, меню продолжает существовать в памяти даже после того, как приложение закрывается.

Сообщения, используемые меню

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

Когда пользователь активизирует пункт в горизонтальном меню, окно владелец сначала получает сообщение WM_SYSCOMMAND. Это сообщение включает в себя флажок, который указывает, активизировал ли пользователь меню при помощи использования клавиатуры (SC_KEYMENU) или мыши (SC_MOUSEMENU). Для получения дополнительной информации об интерфейсе клавиатуры для меню, см. Доступ к меню через клавиатуру.

Затем, перед показом на экране любых меню, Windows посылает сообщение WM_INITMENU оконной процедуре так, чтобы прикладная программа могла изменить меню до того, как пользователь увидит их. Windows отправляет сообщение WM_INITMENU только однажды для активизации меню.

Когда пользователь указывает на пункт меню, который открывает подменю, Windows, отправляет окну владельцу сообщение WM_INITMENUPOPUP перед отображением на экране подменю. Это сообщение дает прикладной программе возможность изменить подменю прежде, чем оно покажется на экране.

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

Когда пользователь выбирает командный пункт из меню, Windows отправляет оконной процедуре сообщение WM_COMMAND. Младшее слово параметра wParam сообщения WM_COMMAND содержит идентификатор выбранного пункта. Оконная процедура должна проверить идентификатор и обработать сообщение соответственно.

Не все меню являются доступными через строку меню окна. Многие из прикладных программ показывают на экране вспомогательное меню, когда пользователь щелкает мышью по правой кнопке мыши в конкретном месте. Такие прикладные программы, если это им свойственно, должны обрабатывать сообщение WM_CONTEXTMENU и показывать на экране вспомогательное меню. Если прикладная программа не показывает на экране вспомогательное меню, она должна передать сообщение WM_CONTEXTMENU функции DefWindowProc для обработки по умолчанию.

Изменения меню

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

Чтобы добавить пункт меню, используйте функцию InsertMenuItem. Вы можете использовать функцию SetMenuItemInfo, чтобы изменить атрибуты существующего пункта меню. Параметр lpmii указывает на структуру MENUITEMINFO, которая содержит новые атрибуты и определяет, какие атрибуты изменяются. Атрибуты пункта меню включают в себя тип, состояние, идентификатор, подменю, точечные рисунки, данные пункта и текст.

Устаревшие функции AppendMenu и InsertMenu могут быть также использованы, чтобы добавить пункты меню, но новые прикладные программы должны использовать InsertMenuItem. Функция AppendMenu добавляет в конец пункт меню или подменю; функция InsertMenu вставляет пункт меню в заданной позиции в меню или подменю. Обе функции дают возможность атрибутам пункта меню быть определяемыми, включая в себя в любом случае, включение, блокирование, недоступность, отметку «галочкой или снятие отметки «галочкой» пункта меню.

Чтобы изменить внешний вид или атрибуты существующего пункта меню, используйте функцию ModifyMenu. Например, текстовая строка или точечный рисунок пункта меню могут быть включены, заблокированы, недоступны, отмечены «галочкой» или со снятой «галочкой». Функция ModifyMenu заменяет определяемый пункт меню на новый пункт.

Чтобы извлечь информацию о пункте меню, используйте функцию GetMenuItemInfo. Параметр lpmii указывает на структуру MENUITEMINFO, которая определяет извлекаемые атрибуты и принимает их текущие значения.

Чтобы удалить пункт меню из меню, используйте функцию DeleteMenu или RemoveMenu. Если удаляемый пункт тот, который открывает подменю, DeleteMenu удаляет связанное подменю, сбрасывая дескриптор меню и освобождая память, использованную подменю. Функция RemoveMenu удаляет пункт меню, но если пункт открывает подменю, функция не уничтожает подменю или дескриптор, позволяя подменю многократно использоваться.

Чтобы перерисовывать строку меню, после того как строка меню была изменена, используйте функцию DrawMenuBar. Иначе, изменения не появятся до тех пор, пока Windows не перерисует окно владельца.

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

Использование ресурса шаблона меню
Создание вспомогательного (контекстного) меню
Использование точечных рисунков пунктов меню
Создание нарисованных пользователем пунктов меню
Использование пользовательских точечных рисунков «галочки «

Использование ресурса шаблона меню

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

Расширенный формат шаблона меню

Расширенный формат шаблона меню поддерживает функциональные возможности меню, выполненные для версий Windows 95 и Windows NT 4.0. Подобно ресурсам шаблона меню, использованным с более ранними версиями Windows, расширенные ресурсы шаблона меню имеют тип ресурса RT_MENU. Windows различает два формата ресурса по номеру версии, который является первым элементом заголовка ресурса.

Расширенный шаблон меню состоит из структуры MENUEX_TEMPLATE_HEADER, сопровождаемой еще одной структурой MENUEX_TEMPLATE_ITEM определяющей пункты.

Старый формат шаблона меню

Старый шаблон меню (для версий Windows ранее, чем Windows 95 и Windows NT 4.0) задает меню, но не поддерживает его новые функциональные возможности. Старый ресурс шаблона меню имеет тип ресурса RT_MENU.

Старый шаблон меню состоит из структуры MENUITEMTEMPLATEHEADER, сопровождаемой одним или большим количеством структур MENUITEMTEMPLATE.

Загрузка ресурса шаблона меню

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

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

Чтобы привязать меню к окну, используйте функцию SetMenu, или определите дескриптор меню в параметре hMenu функции CreateWindowEx при создании окна. Другим способом, которым Вы можете привязать меню к окну, является определение шаблона меню, когда Вы регистрируете класс окна; шаблон идентифицирует определяемое меню как меню класса для этого класса окна.

Чтобы Windows автоматически связал конкретное меню с окном, определите шаблон меню, когда Вы регистрируете класс окна. Шаблон идентифицирует определяемое меню как меню класса для этого класса окна. Тогда, когда Вы создаете окно данного класса, Windows автоматически связывает заданное меню с окном.

Чтобы создать меню класса, включите идентификатор ресурса шаблона меню как член lpszMenuName структуры WNDCLASS, а затем передайте адрес структуры в функцию RegisterClass.

Создание меню класса

Следующий пример показывает, как создать меню класса для прикладной программы, создать окно, которое использует меню класса и обрабатывать команды меню в оконной процедуре.

Ниже следует важная часть заголовочного файла прикладной программы:

Ниже следует важная часть самого приложения:

Создание вспомогательного (контекстного) меню

Чтобы использовать контекстное меню в прикладной программе, передайте ее дескриптор в функцию TrackPopupMenuEx. Приложение обычно вызывает TrackPopupMenuEx в оконной процедуре в ответ на сгенерированное пользователем сообщение, типа WM_LBUTTONDOWN или WM_KEYDOWN.

В дополнение к дескриптору выскакивающего меню, TrackPopupMenuEx требует, чтобы вы определили дескриптор окна владельца, позицию контекстного меню (в экранной системе координат) и кнопку мыши, которую пользователь может использовать, чтобы выбрать пункт.

Устаревшая функция TrackPopupMenu все еще поддерживается, но новые прикладные программы должны использовать функцию TrackPopupMenuEx. Функция TrackPopupMenuEx требует тех же самых параметров, что и TrackPopupMenu и, к тому же, позволяет вам определить часть экрана, которое меню не должно закрывать. Прикладная программа обычно вызывает эти функции в оконной процедуре при обработке сообщения WM_CONTEXTMENU.

Вы можете определить позицию контекстного меню, предоставляя x- и y-координаты вместе с флажком TPM_CENTERALIGN, TPM_LEFTALIGN или TPM_RIGHTALIGN. Флажок определяет позицию контекстного меню относительно x- и y-координат.

Вы должны дать возможность пользователю выбирать пункт из контекстного меню при помощи использования той же самая кнопки мыши, которая использовалась, чтобы показать на экране меню. Чтобы делать это, определите или флажок TPM_LEFTBUTTON или TPM_RIGHTBUTTON, чтобы указать, которую кнопку мыши пользователь может использовать, чтобы выбрать пункт меню.

Обработка сообщения WM_CONTEXTMENU

Сообщение WM_CONTEXTMENU создается тогда, когда оконная процедура прикладной программы посылает функции DefWindowProc сообщение WM_RBUTTONUP или WM_NCRBUTTONUP. Приложение может обработать это сообщение, чтобы показать на экране контекстное меню, в соответствующей конкретной части экрана. Если прикладная программа не показывает на экране контекстное меню, она должна передать это сообщение в DefWindowProc для обработки по умолчанию.

Ниже следует пример обработки сообщения WM_CONTEXTMENU, как оно может фигурировать в оконной процедуре прикладной программы. Младшие и старшие слова параметра lParam определяют экранную систему координат мыши, когда отпускается правая кнопка мыши. Определяемая программой функция OnContextMenu возвращает значение ИСТИНА (TRUE), если она показывает на экране контекстное меню или ЛОЖЬ (FALSE) если она этого не делает.

Следующая определяемая программой функция OnContextMenu показывает на экране контекстное меню, если определяемая позиция мыши внутри рабочей области окна. Более сложная функция могла бы показывать на экране одно из нескольких различных меню, в зависимости оттого, которая часть рабочей области определена. Чтобы фактически показывать на экране контекстное меню, этот пример вызывает определяемую программой функцию по имени DisplayContextMenu. За описанием этой функции, обратитесь к статье Отображение на экране контекстного меню.

Создание контекстного меню Атрибуты Шрифта (Font-Attributes)

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

Здесь шаблон меню для контекстного меню, который дается в файле определения ресурса прикладной программы.

Следующий пример дает оконную процедуру и обеспечивающие функции, использованные, чтобы создавать и показывать на экране контекстное меню.

Отображение на экране контекстного меню

Функция, приведенная в следующем примере, показывает на экране контекстное меню.

Прикладная программа включает в себя ресурс меню, идентифицированный строкой «ShortcutExample«. Строка меню просто содержит название меню. Прикладная программа использует функцию TrackPopupMenu, чтобы показать на экране меню, связанное с этим пунктом меню. (Сама строка меню не отображается, потому что TrackPopupMenu требует дескриптора меню, подменю или контекстного меню.)

Использование в пунктах меню точечных рисунков (значков)

Windows, чтобы показать на экране пункт меню, может использовать вместо текстовой строки точечный рисунок( значок). Чтобы использовать значок, вы должны установить флажок MFT_BITMAP для пункта меню и определять дескриптор точечного рисунка, который Windows должен отобразить для пункта меню. Этот раздел описывает, как установить флажок MFT_BITMAP и извлечь данные о дескрипторе значка.

Прикладные программы, написанные в более ранних версиях Windows, могут устанавливать флажок MF_BITMAP со старыми наборами функций.

Установка флажка типа значка

Флажок MFT_BITMAP или MF_BITMAP сообщают, чтобы Windows преимущественно использовал точечный рисунок (значок), а не текстовую строку, чтобы показать на экране пункт меню. Флажок пункта меню MFT_BITMAP или MF_BITMAP должен быть установлен во время выполнения программы; Вы не можете установить его в файле определения ресурса.

Для новых прикладных программ, Вы можете использовать функцию SetMenuItemInfo или InsertMenuItem, чтобы установить флажок типа MFT_BITMAP. Чтобы заменить текстовый пункт меню на значок пункта меню, используйте SetMenuItemInfo. Чтобы добавить новый значок пункта к меню, используйте функцию InsertMenuItem.

Прикладные программы, написанные для более ранних версиий Windows, чтобы установить флажок MF_BITMAP, могут продолжать использовать функции ModifyMenu, InsertMenu или AppendMenu. Чтобы заменить текстовую строку пункта меню на значок пункта меню, используйте ModifyMenu. Чтобы добавить новый значок пункта меню, используйте флажок MF_BITMAP с функцией InsertMenu или AppendMenu.

Создание точечного рисунка (значка)

Когда Вы устанавливаете флажок типа MFT_BITMAP или MF_BITMAP для пункта меню, Вы должны также определить и дескриптор точечного рисунка (значка), который Windows должен отобразить для пункта меню. Вы можете представить значок как растровый ресурс или создавать точечный рисунок во время выполнения программы. Если Вы используете растровый ресурс, Вы можете использовать функцию LoadBitmap, чтобы загрузить значок и получить его дескриптор.

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

  1. Использовать функцию CreateCompatibleDC, чтобы создать контекст устройства, совместимый с контекстом устройства, использованным основным окном прикладной программы.
  2. Использовать функцию CreateCompatibleBitmap, чтобы создать значок, совместимый с основным окном прикладной программы или использовать функцию CreateBitmap, чтобы создать одноцветный значок.
  3. Использовать функцию SelectObject, чтобы выбрать значок в совместимом контексте устройства.
  4. Использовать рисующие функции GDI, типа Ellipse (Эллипс) и LineTo (Линия), чтобы нарисовать изображение в значок.

Для получения дополнительной информации, см. статью Точечные рисунки.

Добавление меню Линии и Диаграммы

Нижеследующий пример кода показывает, как создать меню, которое содержит значки пунктов меню. Он создает два меню. Первое — меню Chart (Диаграммы), которое содержит три значка пунктов меню: круговая диаграмма, линейная диаграмма и гистограмма. Пример показывает, как загрузить эти значки из файла ресурса прикладной программы, а затем использовать функции CreatePopupMenu и AppendMenu, чтобы создать меню и пункты меню.

Второе меню — меню Lines (Линии). Оно содержит значки, показывая типы линий, предоставляемые предопределенным пером в Windows. Значки типа линий созданы во время выполнения программы при помощи использования функций GDI.

Здесь определения растровых ресурсов в файле определения ресурса прикладной программы.

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

Пример значков пунктов меню

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

Первое меню содержит пункты меню, которые показывают каждую из трех типов диаграмм: круговую, линейную и гистограмму. Значки для этих пунктов меню определены как ресурсы и загружаются при помощи использования функции LoadBitmap. С этим меню, в горизонтальном меню, связано имя меню «Chart» (Диаграммы).

Илон Маск рекомендует:  Диалоги знакомство с элементами управления mfc

Второе меню содержит пункты меню, которые показывают каждый из пяти типов линии, использованных с функцией CreatePen: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT и PS_DASHDOTDOT. Прикладная программа создает значки для этих пунктов меню во время выполнения программы, используя, рисующие функции GDI. С этим меню, в горизонтальном меню, связано имя меню «Lines» (Линии).

В оконной процедуре прикладной программы заданы два статических массива дескрипторов значков. Один массив содержит дескрипторы трех значков, использованных для меню Chart, другой содержит дескрипторы из пяти значков, использованных для меню Lines. При обработке сообщения WM_CREATE, оконная процедура загружает значки диаграмм, создает значки линий, а затем добавляет соответствующие пункты меню. При обработке WM_DESTROY сообщения, оконная процедура удаляет все значки.

Ниже следуют необходимые части заголовочного файла приложения.

Ниже следуют необходимые части оконной процедуры. Оконная процедура выполняет большинство инициализаций путем вызова определяемой программой функции LoadChartBitmaps, CreateLineBitmaps и AddBitmapMenu, описанные ниже в этом разделе.

Определяемая программой функция LoadChartBitmaps загружает ресурсы значков для меню диаграмм путем вызова функция LoadBitmap, как ниже указано.

Определяемая программой функция CreateLineBitmaps создает значки для меню Lines при помощи использования, рисующих функций GDI. Функция создает контекст устройства в памяти (DC) с теми же самыми свойствами, что и DC главного окна программы. Для каждого типа линии, функция создает значок, выбирает его в DC в памяти и рисует в нем.

Определяемая программой функция AddBitmapMenu создает меню и добавляет заданное число значков меню к его пунктам. Затем она добавляет соответствующее название меню к строке меню определяемого окна.

Создание нарисованных пользователем пунктов меню

Если Вы нуждаетесь в полном контроле над внешним видом пункта меню, Вы можете использовать в вашей прикладной программе нарисованный пользователем пункт меню. Этот раздел описывает шаги, которые приведут к созданию и использованию нарисованного пользователем пункта меню.

Установка флажков при рисовании пользователем пунктов меню

Вы не можете задать нарисованный пользователем пункт меню в файле определения ресурса вашей прикладной программы. Вместо этого, Вы должны создать новый пункт меню или изменить существующий при помощи использования флажка меню MFT_OWNERDRAW.

Вы можете использовать функцию InsertMenuItem или SetMenuItemInfo, чтобы определить нарисованный пользователем пункт меню. Используйте InsertMenuItem, чтобы вставить новый пункт меню в заданной позиции в строке меню или меню. Используйте SetMenuItemInfo, чтобы изменить состав меню.

При вызове этих двух функций, Вы должны определить адрес структуры MENUITEMINFO, которая описывает свойства нового пункта меню или свойства, которые Вы желаете изменить для существующего пункта меню. Чтобы сделать пункт меню, пунктом нарисованным пользователем, определите значение MIIM_TYPE для члена fMask и значение MFT_OWNERDRAW для члена fType структуры.

Устанавливая соответствующие члены структуры MENUITEMINFO, Вы можете связывать определяемое программой значение, которое называется данными пункта (item data), с каждым пунктом меню. Поступая таким образом, определите значение MIIM_DATA для члена fMask и определяемого программой значения для члена dwItemData структуры.

Вы можете использовать данные пункта с любым типом пункта меню, но это особенно полезно для нарисованных пользователем пунктов. Например, предположим, что структура содержит информацию, используемую, чтобы нарисовать пункт меню. Прикладная программа могла бы использовать эти данные пункта для пункта меню, чтобы сохранить указатель на структуру. Данные пункта пересылаются в окно владельца меню с сообщениями WM_DRAWITEM и WM_MEASUREITEM. Чтобы в любое время извлечь данные о пункте для меню, используйте функцию GetMenuItemInfo.

Прикладные программы, написанные в более ранних версиях Windows, могут продолжать вызывать функции AppendMenu, InsertMenu или ModifyMenu, чтобы назначить флажок MF_OWNERDRAW нарисованному пользователем пункту меню.

Когда Вы вызываете любую из этих трех функций, Вы можете передавать 32-разрядное значение как параметр lpNewItem. Это значение может представлять любую информацию, которая является значимой для вашей прикладной программы, и она будет доступна вашему приложению, когда пункт должен отобразиться. Например, значение могло бы содержать указатель на структуру; структура, в свою очередь, могла бы содержать текстовую строку и дескриптор логического шрифта, который ваша прикладная программа будет использовать, чтобы рисовать строку.

Нарисованные пользователем меню и сообщение WM_MEASUREITEM

Прежде, чем Windows покажет на экране нарисованный пользователем пункт меню впервые, она передает сообщение WM_MEASUREITEM оконной процедуре окна, которое владеет пунктами меню. Это сообщение содержит указатель на структуру MEASUREITEMSTRUCT, которая идентифицирует пункт и содержит данные пункта, которые прикладная программа, возможно, присвоила ему. Оконная процедура должна заполнить члены itemWidth и itemHeight структуры перед возвращением из обработки сообщения. Windows использует информацию в этих элементах при создании ограничительного прямоугольника, в котором прикладная программа рисует пункт меню. К тому же она использует эту информацию, чтобы определить, когда пользователь выбирает пункт.

Нарисованные пользователем меню и сообщение WM_DRAWITEM

Всякий раз, когда пункт должен быть прорисован (например, когда он первоначально отображается или когда пользователь выбирается его), Windows отправляет сообщение WM_DRAWITEM оконной процедуре окна владельца меню. Это сообщение содержит указатель на структуру DRAWITEMSTRUCT содержащую информацию о пункте, включая данные о пункте, которые прикладная программа, возможно, присвоила ему. Кроме того, DRAWITEMSTRUCT содержит флажки, которые обозначают состояние пункта (типа того, является ли он недоступным или выбираемым с отметкой галочкой), а также ограничительный прямоугольник и контекст устройства, которые прикладная программа использует, чтобы рисовать пункт.

Прикладная программа должна делать следующее при обработке сообщения WM_DRAWITEM:

  1. Установить тип рисунка, который является необходимым. Чтобы сделать это, проверьте член itemAction структуры DRAWITEMSTRUCT.
  2. Нарисовать соответствующий пункт меню, используя ограничительный прямоугольник и контекст устройства, полученный из структуры DRAWITEMSTRUCT. Прикладная программа должна рисовать только внутри ограничительного прямоугольника. По причинам производительности, Windows не обрезает части изображения, которые прорисованы снаружи прямоугольника.
  3. Восстановить все объекты GDI, выбранные для пунктов меню в контексте устройства.

Если пользователь выбирает пункт меню, Windows устанавливает член itemAction структуры DRAWITEMSTRUCT в значение ODA_SELECT и устанавливает значение ODS_SELECTED в элементе itemState. Это — команда вызова подпрограммы приложения, которая перерисует пункт меню, чтобы указать, что он выбран.

Настройка шрифтов для текстовых строк пункта меню

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

Здесь меню, заданное в файле определения ресурса. Обратите внимание, что строки для пунктов меню Regular (Обычный), Bold (Полужирный), Italic (Курсив) и Underline (Подчеркнутый) назначены во время выполнения программы, так что их строки пусты в файле определения ресурса.

Оконная процедура прикладной программы обрабатывает сообщения, включающие использование нарисованных пользователем пунктов меню. Приложение использует сообщение WM_CREATE, чтобы сделать следующее:

Установить флажок MF_OWNERDRAW для пунктов меню.

Установить строки текста для пунктов меню.

Получить дескрипторы шрифтов, использованных для прорисовки этих пунктов.

Получить значения цвета текста и фона для выбранных пунктов меню.

Дескрипторы текстовых строк и шрифта сохраняются в массиве определяемых программой структур MYITEM. Определяемая программой функция GetAFont создает шрифт, который соответствует атрибутам данного шрифта и возвращает значение дескриптора шрифта. Дескрипторы разрушаются в ходе обработки сообщения WM_DESTROY.

В ходе обработки сообщения WM_MEASUREITEM, пример получает ширину и высоту строки пункта меню и копирует эти значения в структуру MEASUREITEMSTRUCT. Windows использует значения ширины и высоты, чтобы вычислить размер меню.

В ходе обработки сообщения WM_DRAWITEM, строка пункта меню рисуется, оставляя место рядом со строкой для значка «галочки «. Если пользователь выбирает пункт, цвет выбранного текста и фона используются, чтобы прорисовать пункт.

Пример «собственных» пунктов меню

Пример в этой теме использует в меню «собственные» пункты. Пункты меню выбирают конкретные атрибуты шрифта, а прикладная программа показывает на экране каждый пункт меню, используя шрифт, который имеет соответствующий атрибут. Например, пункт меню Italic (Курсив) отображается в курсивном шрифте. Название меню Character (Шрифт) в строке меню открывает меню.

Строка меню и раскрывающееся меню определены вначале расширенным ресурсом шаблона меню. Поскольку шаблон меню не может определять «собственные» пункты, меню вначале содержит четыре текстовых пункта меню со следующими строками: «Regular» («Обычный»), «Bold» («Полужирный»), «Italic» («Курсив») и «UnderlineWM_CREATE. Когда процедура получает сообщение WM_CREATE, она вызывает определяемую программой функцию OnCreate, которая выполняет следующие шаги для каждого пункта меню:

  1. Распределяет в памяти определяемую программой структуру MYITEM.
  2. Получает текст пункта меню и сохраняет его в определяемой программой структуре MYITEM.
  3. Создает шрифт, использованный, чтобы показать на экране пункт меню и сохраняет дескриптор в определяемой программой структуре MYITEM.
  4. Изменяет тип пункта меню на MFT_OWNERDRAW и сохраняет указатель на определяемую программой структуру MYITEM, как на данные пункта.

Поскольку указатель на каждую определяемую программой структуру MYITEM сохраняется как данные пункта, он переходит в оконную процедуру вместе с сообщениями WM_MEASUREITEM и WM_DRAWITEM для соответствующего пункта меню. Указатель содержится в члене itemData и структуры MEASUREITEMSTRUCT и структуры DRAWITEMSTRUCT.

Сообщение WM_MEASUREITEM отправляется для каждого «собственного» пункта меню, когда он впервые отображается на экране. Приложение обрабатывает это сообщение, выбирая шрифт для пункта меню в контекст устройства, а затем устанавливает пространство, требуемое, чтобы показать на экране текст пункта меню этим шрифтом. Шрифт и текст пункта меню оба определены структурой пункта меню MYITEM (структура, определенная прикладной программой). Приложение устанавливает размер текста при помощи использования функции GetTextExtentPoint32.

Оконная процедура обрабатывает сообщение WM_DRAWITEM, показывая на экране текст пункта меню в соответствующем шрифте. Шрифт и текст пункта меню оба определены структурой пункта меню MYITEM. Прикладная программа выбирает текст и цвета фона, соответствующие состоянию пункта меню.

Оконная процедура обрабатывает сообщение WM_DESTROY, чтобы уничтожить шрифты и освободить память. Прикладная программа удаляет шрифт и освобождает определяемую программой структуру MYITEM для каждого пункта меню.

Ниже следуют необходимые части заголовочного файла прикладной программы.

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

Использование индивидуальных значков типа «галочки»

Windows предоставляет заданный по умолчанию значок «галочки » для отображения на экране рядом с пунктом меню, который отмечается ею. Вы можете настроить индивидуальный пункт меню, при помощи предоставления пары точечных рисунков (значков), чтобы заменить заданный по умолчанию значок «галочки «. Windows показывает на экране один значок, когда пункт отмечен «галочкой», а другой, когда у него отметка «галочкой» снята. Этот раздел описывает шаги, приводящие к созданию и использованию пользовательских точечных рисунков (значков) типа «галочки «.

Создание пользовательских точечных рисунков (значков) типа «галочки»

Пользовательский точечный рисунок (значок) «галочки» должен быть такого же самого размера как и заданный по умолчанию значок «галочки». Вы можете получить заданный по умолчанию размер значка «галочки» путем вызова функции GetMenuCheckMarkDimensions. Младшее слово величины возвращаемого значения этой функции определяет ширину; старшее слово — высоту.

Вы можете использовать растровые ресурсы, чтобы обеспечить программу значками типа «галочки». Однако, поскольку требуемый размер точечного рисунка изменяется в зависимости от типа дисплея, вам видимо придется по необходимости изменить размеры значка во время выполнения программы при помощи использования функции StretchBlt. Зависимость от значка, искажение, вызываемое изменением размеров, может привести к неприятному результату.

Вместо того, чтобы использовать растровый ресурс, Вы можете создать точечный рисунок (значок) во время выполнения программы при помощи использования функций GDI.

Чтобы создать значок во время выполнения программы:

  1. Используйте функцию CreateCompatibleDC, чтобы создать контекст устройства, совместимый с тем, который используется основным окном прикладной программы. Параметр функции hdc может установить или значение ПУСТО (NULL) или величину возвращаемого значения из функции GetDC. CreateCompatibleDC возвращает значение дескриптора совместимого контекста устройства.
  2. Используйте функцию CreateCompatibleBitmap, чтобы создать точечный рисунок (значок), совместимый с основным окном приложения. Параметры nWidth и nHeight этой функции устанавливают размеры значка; они должны определить информацию о ширине и высоте, возвращаемую функцией GetMenuCheckMarkDimensions. Вы можете также использовать и функцию CreateBitmap, чтобы создать одноцветный значок.
  3. Используйте функцию SelectObject для выбора значка в совместимом контексте устройства.
  4. Используйте рисующие функции GDI, такие как Ellipse (Эллипс) и LineTo, (Линия), чтобы нарисовать изображение внутри значка, или функции типа BitBlt и StretchBlt, чтобы копировать изображение в точечный рисунок (значок).

За большей информацией обратитесь к статье Bitmaps.

Связывание пункта меню с точечным рисунком (значком)

Вы связываете пару точечных рисунков (значков) «галочки» с пунктом меню, передавая дескрипторы значков функции SetMenuItemBitmaps. Параметр hBitmapUnchecked идентифицирует значок снятия «галочки», а параметр hBitmapChecked идентифицирует установку значка. Если Вы хотите удалить один или оба значка «галочки» из пункта меню, Вы можете установить или параметр hBitmapUnchecked или параметр hBitmapChecked, или оба в значение ПУСТО (NULL).

Настройка атрибута «галочка»

Функция CheckMenuItem устанавливает атрибут «галочки» пункта меню, либо в установленное, либо в снятое состояние. Вы можете определить значение MF_CHECKED, чтобы установить атрибут «галочку » для отметки и значение MF_UNCHECKED, чтобы установить его в снятое состояние.

Вы можете также устанавливать состояние «галочки» пункта меню при помощи использования функция SetMenuItemInfo.

Время от времени группа пунктов меню обозначает набор взаимоисключающих параметров. При помощи использования функция CheckMenuRadioItem, Вы можете отмечать «точкой» один пункт меню при одновременном удалении отметки из всех других пунктов меню в группе.

Моделирование окошек для флажка «галочкой» в меню

Эта тема содержит пример, который показывает, как моделировать окошки для флажка «галочкой» в меню. Пример содержит меню Character (Символ), пункты которого позволяют пользователю устанавливать атрибуты текущего шрифта, такие как полужирный, курсивный и подчеркнутый. Когда атрибут шрифта действует, галочка отображается в окошке для флажка рядом с соответствующим пунктом меню; иначе, рядом с этим пунктом отображается пустое окошко для флажка.

Пример заменяет заданный по умолчанию точечный рисунок «галочки » на два точечных рисунка (значка): точечный рисунок с установленным в окне маркером и точечным рисунком с пустым окном (без маркера). Точечный рисунок окошка для маркера отображается рядом с пунктом меню Bold (Полужирный), Italic (Курсивный) или Underline (Подчеркнутый), когда атрибут «галочки » пункта установлен в значение MF_CHECKED. Снятый маркер «галочки» или пустой точечный рисунок окошка для маркера отображается тогда, когда атрибут «галочки » установлен в значение MF_UNCHECKED.

Windows предоставляет предопределенный точечный рисунок (значок), который содержит изображения, используемые для окошек с маркером «галочка» и радио-кнопок. Пример разделяет пустые окошки для «галочки» и с маркером, копирует их в два отдельных точечных рисунка (значки), а затем использует их как значки установки и снятия отметки «галочкой» для пунктов в меню Character. (Символ).

Чтобы получить дескриптор заданного системой точечного рисунка (значка) окошка для флажка, пример вызывает функцию LoadBitmap, устанавливая значение ПУСТО (NULL) в параметре hInstance и OBM_CHECKBOXES в параметре lpBitmapName. Поскольку все изображения значков одного и того же размера, пример может разделять их, поделив ширину и высоту точечного рисунка на число изображений в строках и столбцах.

Нижеследующая часть файла определения ресурса показывает, как определены пункты меню в меню Character. Обратите внимание!, что сначала атрибуты шрифта не действуют, так как атрибут «галочки » для пункта Обычный (Regular) установлен в отмеченное «галочкой» состояние, а, по умолчанию, атрибут «галочки » оставшихся пунктов установлен в состояние без «галочки».

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

Следующий пример показывает части оконной процедуры, которые создают точечные рисунки (значки) «галочки «; устанавливает атрибут «галочки» пунктов меню Bold (Полужирный), Italic (Курсивный) и Underline(Подчеркнутый); и уничтожает значки «галочки».

Пример использования пользовательских точечных рисунков значков «галочки «.

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

Пункты меню во втором меню определяют параметры настройки выравнивания параграфа: слева, по центру и справа. Только один из этих пунктов меню в одно и тоже данное время может быть отмечен «галочкой». Для этих пунктов меню, пример использует значки, которые похожи на установленную и снятую метки типа радио-кнопки органа управления.

Оконная процедура обрабатывает сообщение WM_CREATE путем вызова определяемой программой функции OnCreate. OnCreate создает четыре значка «галочки», а затем связывает их со своими соответствующими пунктами меню при помощи использования функции SetMenuItemBitmaps.

Чтобы создать каждый значок, OnCreate вызывает определяемую программой функцию CreateMenuBitmaps, устанавливая указатель на конкретную функцию рисования для значка. Функция CreateMenuBitmaps создает одноцветный значок требуемого размера, выбирает его в памяти контекста устройства и стирает фон. Затем она вызывает заданную функцию рисования, чтобы заполнить передний план картинки.

Имеется четыре определяемые программой функции рисования — DrawCheck, DrawUncheck, DrawRadioCheck и DrawRadioUncheck. Они рисуют прямоугольник с X (крестиком), пустой прямоугольник, эллипс, содержащий меньший затемненный эллипс и, соответственно, пустой эллипс.

Оконная процедура обрабатывает сообщение WM_DESTROY, удаляя значки типа «галочки». Она получает дескриптор каждый картинки при помощи использования функции GetMenuItemInfo, а затем переправляет дескриптор функции DeleteObject.

Когда пользователь выбирает пункт меню, окну владельцу отправляется сообщение WM_COMMAND. Для пунктов меню в меню Character, оконная процедура вызывает определяемую программой функцию CheckCharacterItem. Для пунктов в меню Paragraph, оконная процедура вызывает определяемую программой функцию CheckParagraphItem.

Каждый пункт в меню Character, независимо друг от друга, может быть отмечен или не отмечен значком типа «галочки». Следовательно, CheckCharacterItem просто включает состояние проверки («галочки») определяемого пункта меню. Сначала функция вызывает функцию GetMenuItemInfo, чтобы получить текущее состояние пункта меню. Затем она включает флажок состояния MFS_CHECKED и устанавливает новое состояние путем вызова функции SetMenuItemInfo.

В отличие от атрибутов символа, одновременно может быть выбрано только одно выравнивание абзаца. Следовательно, CheckParagraphItem отмечает «галочкой» определяемый пункт меню и удаляет галочку из всех других пунктов в меню. Чтобы сделать это, она вызывает функцию CheckMenuRadioItem.

Ниже следуют необходимые части заголовочного файла прикладной программы.

Ниже следуют необходимые части оконной процедуры прикладной программы и зависимых функций.

InsertMenu() при разных процессах и вызове кода

Я пишу программу, которая вставляет дополнительные опции в контекстное меню заголовка окна других окон, чем в моем собственном процессе. Вот как я узнал, как это сделать: добавление настраиваемого пункта контекстного меню в строку заголовка Windows Form. Мне просто нужно иметь действительный дескриптор IntPtr для этого окна. Я тестировал его, и он работает. Вторая часть делает мое приложение (а не другой процесс) что-то делать, когда пользователь выбирает эту опцию из контекстного меню из окна другого процесса. Я не вижу прямого способа обнаружить это. Я знаю, что я могу настроить крючки, чтобы моя программа слушала все сообщения Windows на моей машине (WM_SYSCOMMAND из окна, которое меня интересует), но из того, что я видел, это решение довольно сложно, и мне интересно, есть ли способ назначить какой-нибудь делегат или что-то в этом меню?

Сообщения отправляются в окно целевого процесса. Поэтому вам нужно будет запустить ваш код в этом процессе. Это будет связано с инъекцией DLL, поэтому вам потребуется написать собственный код, а не С#. Вам нужно будет вставить DLL и подклассу окна, которое получает сообщения, чтобы ваш код мог сделать первый снимок.

How to insert html code

HTML code can be added to the body of the page (inside the tag), or to the zone of the whole site or page.

To add the block to your page, go to Block Library → Other category → T123 block «Embed HTML code».

You can use ready-made code from various services (there are examples) or your own code.

The block supports HTML, JavaScript (inside the

How to insert HTML code in head of a website or page

To insert code to head for all pages, go to Site Settings → More → HTML code for head zone.

To insert code to head for one page, go to Page Settings → Additional → HTML code for head zone.

InsertMenu

WinApi процедура InsertMenu

Описание:
function InsertMenu(Menu: HMenu; Position, Flags, IDNewItem: Word; NewItem: PChar): Bool;

Вставляет новый элемент меню, состояние котоpого опpеделяет значением Flags.

Паpаметpы:
Menu: Идентификатоp меню.

Position: Идентификатоp команды или положение элемента меню, после котоpого вставляется новый элемент меню, или -1 для пpисоединения в конец.

Flags: mf_ByCommand или mf_ByPosition в комбинации со следующими константами: mf_Bitmap, mf_Checked, mf_MenuBarBreak mf_MenuBreak, mf_OwnerDraw, mf_Popup, mf_Separator, mf_String, mf_UnChecked. См «Флаги меню mf_».

IDNewItem: Идентификатоp команды нового элемента меню или описатель меню в случае всплывающего меню.

NewItem: Содеpжимое нового элемента меню.

Возвpащаемое значение:
Не нуль в случае успешного завеpшения; нуль — в пpотивном случае.

Отделка квартиры близится к концу, решил основательно взяться за пол, так как старые доски не выносимо скрипели и просто не давали мне покоя. Побродив по магазинам выбрал для отделки ламинат praktik, более того я ради интереса решил положить его самостоятельно, как мне кажется в этом нет ничего сложного, за одно и приобрету полезный опыт !)

Материал взят из:
Русская спpавка по Windows API

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL