- CSS меню
- Вертикальное меню
- Горизонтальное меню
- Выпадающее меню
- Создание меню на CSS – руководство для новичков
- Разновидности меню в CSS
- Как создать меню в CSS?
- Использование меню
- Использование ресурса Menu-Template
- Расширенный формат Menu-Template
- Старый формат Menu-Template
- Загрузка ресурса Menu-Template
- Создание меню класса
- Создание контекстного меню
- Обработка сообщения WM _ CONTEXTMENU
- Создание контекстного меню Font-Attributes
- Отображение контекстного меню
- Использование точечных рисунков Menu-Item
- Установка флага типа точечного рисунка
- Создание точечного рисунка
- Добавление линий и графиков в меню
- Пример Menu-Item точечных рисунков
- Создание пунктов меню Owner-Drawn
- Установка флага Owner-Drawn
- Owner-Drawn меню и _ сообщение МЕАСУРЕИТЕМ WM
- Owner-Drawn меню и _ сообщение DRAWITEM WM
- Owner-Drawn меню и _ сообщение МЕНУЧАР WM
- Установка шрифтов для Menu-Item текстовых строк
- Пример пунктов меню Owner-Drawn
- Использование пользовательских точечных рисунков
- Создание пользовательских точечных рисунков с галочками
- Связывание точечных рисунков с пунктом меню
- Установка атрибута галочки
- Имитация флажков в меню
- Пример использования пользовательских точечных рисунков с галочкой
CSS меню
Если ваш веб-сайт не ограничивается одной веб-страницей, то стоит подумать о добавлении панели навигации (меню). Меню — раздел веб-сайта, предназначенный помогать посетителю перемещаться по сайту. Любое меню представляет собой список ссылок, ведущих на внутренние страницы сайта. Самым простым способом добавить панель навигации на сайт является создание меню с помощью CSS и HTML.
Вертикальное меню
Первым шагом создания вертикального меню будет создание маркированного списка. Также нам нужно будет иметь возможность идентифицировать список, поэтому мы добавим к нему атрибут id с идентификатором «navbar». Каждый элемент нашего списка будет содержать по одной ссылке:
Наша следующая задача заключается в сбросе стилей списка, установленных по умолчанию. Нам нужно убрать внешние и внутренние отступы у самого списка и маркеры у пунктов списка. Затем зададим нужную ширину:
Теперь пришло время стилизовать сами ссылки. Мы добавим к ним фоновый цвет, изменим параметры текста: цвет, размер и насыщенность шрифта, уберем подчеркивание, добавим небольшие отступы и переопределим отображение элемента со строчного на блочный. Дополнительно были добавлены левая и нижняя рамки к пунктам списка.
Самой важной частью наших изменений является переопределение строчных элементов на блочные. Теперь наши ссылки занимают все доступное пространство пунктов списка, то есть для перехода по ссылке нам больше не нужно наводить курсор точно на текст.
Мы объединили весь код, описанный выше, в один пример, теперь, нажав на кнопку попробовать, вы можете перейти на страницу с примером и увидеть результат:
При наведении курсора мыши на пункт меню его внешний вид может изменяться, привлекая к себе внимание пользователя. Создать такой эффект можно с помощью псевдо-класса :hover.
Вернемся к рассмотренному ранее примеру вертикального меню и добавим в таблицу стилей следующее правило:
Горизонтальное меню
В предыдущем примере мы рассмотрели вертикальную панель навигации, которую чаще всего можно встретить на сайтах слева или справа от области с основным контентом. Однако меню с навигационными ссылками также часто располагается и по горизонтали в верхней части веб-страницы.
Горизонтальное меню можно создать путем стилизации обычного списка. Свойству display для элементов
нужно присвоить значение inline, чтобы пункты списка располагались друг за другом.
Для размещения пунктов меню по горизонтали, сначала создадим маркированный список с ссылками:
Напишем для нашего списка пару правил, сбрасывающих стиль используемый для списков по умолчанию, и переопределим пункты списка с блочных на строчные:
Теперь нам осталось лишь определить стилевое оформление для нашего горизонтального меню:
Выпадающее меню
Меню, которое мы будем создавать, будет иметь основные навигационные ссылки, расположенные в горизонтальной панели навигации, и подпункты, которые будут отображаться только после наведения курсора мыши на тот пункт меню, к которому эти подпункты относятся.
Сначала нам нужно создать HTML-структуру нашего меню. Основные навигационные ссылки мы поместим в маркированный список:
Подпункты мы разместим в отдельном списке, вложив его в элемент
, который содержит родительскую ссылку относительно подпунктов. Теперь мы имеем четкую структуру нашей будущей панели навигации:
Теперь приступим к написанию CSS кода. Для начала необходимо скрыть список с подпунктами с помощью объявления display: none;, чтобы они не отображались на веб-странице все время. Для отображения подпунктов нам нужно чтобы при наведении на элемент
список снова был преобразован в блочный элемент:
Убираем у обоих списков отступы и маркеры, установленные по умолчанию. Элементы списка с навигационными ссылками делаем плавающими, формируя горизонтальное меню, но для элементов списка, содержащих подпункты задаем float: none;, чтобы они отображались друг под другом.
Затем нам нужно сделать так, чтобы наше выпадающее подменю не смещало контент, расположенный под панелью навигации, вниз. Для этого мы зададим пунктам списка position: relative;, а списку, содержащему подпункты position: absolute; и добавим свойство top со значением 100%, чтобы абсолютно позиционированное подменю отображалось точно под ссылкой.
Высота для родительского списка была добавлена специально, так как браузеры не учитывают в качестве содержимого элемента плавающий контент, то без добавления высоты наш список будет проигнорирован браузером и контент, следующий за списком, будет обтекать наше меню.
Теперь нам осталось стилизовать оба наших списка и выпадающее меню будет готово:
Источник
Создание меню на CSS – руководство для новичков
Просторы всемирной сети стремительно растут, размещая огромное множество различных веб-сайтов, каждый из которых стремится привлечь внимание посетителей и заинтересовать их.
Способы покорения людских сердец выбираются разные — от применения Flash анимации, использования баннеров и смелых дизайнерских решений до различных звуковых и визуальных эффектов.
Однако не стоит забывать, что сайт — это в первую очередь источник информации, поэтому удобству представления контента на сайте веб-разработчик должен уделять особое внимание и именно поэтому навигация, понятная посетителю на интуитивном уровне, так важна.
Меню является самой распространённой системой навигации на сайте, которую можно сравнить с оглавлением в книге. Меню должно быть заметно на любой странице ресурса, позволяя пользователю мгновенно перейти на интересующий раздел.
На объёмных сайтах, содержащих более 50 страниц, невозможно разместить полное меню для доступа ко всем разделам.
В таком случае следует использовать выпадающее меню на CSS, при клике на которое появляются дополнительные ссылки на подразделы.
Разновидности меню в CSS
Существует сразу несколько видов и типов CSS меню:
- Главное меню . Это список определённых ссылок на ключевые разделы веб-сайта.
- Дополнительное меню . Такое меню имеет иерархическую структуру и бывает трёх типов:
- Выпадающее меню . Раскрывается при наведении курсора мыши на пункт;
- Всплывающее меню сайта . Раскрывается при клике на определённом пункте;
- Статическое дополнительное меню для CSS . Древовидная структура, представленная в уже раскрытом виде.
Как создать меню в CSS?
Приведём пример создания простого горизонтального и вертикального меню на CSS с пояснениями.
Код горизонтального меню прописывается следующим образом:
Источник
Использование меню
В этом разделе описаны следующие задачи.
Использование ресурса Menu-Template
Обычно меню включается в приложение путем создания ресурса шаблона меню и последующей загрузки меню во время выполнения. В этом разделе описывается формат шаблона меню и объясняется, как загрузить ресурс шаблона меню и использовать его в приложении. Сведения о создании ресурса шаблона меню см. в документации, входящей в состав средств разработки.
Расширенный формат Menu-Template
Расширенный формат шаблона меню поддерживает дополнительные функции меню. Как и в стандартном меню — ресурсы шаблона, расширенные ресурсы шаблона меню — это тип ресурса _ меню RT . Система различает два формата ресурсов по номеру версии, который является первым элементом в заголовке ресурса.
Расширенный шаблон меню состоит из структуры _ _ заголовка шаблона менуекс , за которой следуют еще одна структура определения элемента _ шаблона _ менуекс .
Старый формат Menu-Template
старый шаблон меню (Microsoft Windows NT 3,51 и более ранних версий) определяет меню, но не поддерживает новые функции меню. Старый ресурс шаблона меню имеет тип ресурса _ меню RT .
Старый шаблон меню состоит из структуры менуитемтемплатехеадер , за которой следует одна или несколько структур менуитемтемплате .
Загрузка ресурса Menu-Template
Чтобы загрузить ресурс шаблона меню, используйте функцию лоадмену , указав маркер для модуля, содержащего ресурс, и идентификатор шаблона меню. Функция лоадмену возвращает маркер меню, который можно использовать для назначения меню окну. Это окно станет окном «владелец» меню, получающим все сообщения, созданные в меню.
Чтобы создать меню из шаблона меню, который уже находится в памяти, используйте функцию лоадменуиндирект . Это полезно, если приложение создает шаблоны меню динамически.
Чтобы назначить меню окну, используйте функцию сетмену или укажите маркер меню в параметре HMENU функции CreateWindowEx при создании окна. Другой способ назначения меню окну — Указание шаблона меню при регистрации класса окна; шаблон определяет указанное меню в качестве меню класса для этого класса окна.
Чтобы система автоматически назначила определенное меню окну, укажите шаблон меню при регистрации класса окна. Шаблон определяет указанное меню в качестве меню класса для этого класса окна. Затем, когда вы создаете окно указанного класса, система автоматически назначает указанное меню окну.
Нельзя назначить меню окну, которое является дочерним окном.
Чтобы создать меню класса, включите идентификатор ресурса меню-шаблона в качестве элемента лпсзменунаме структуры вндкласс , а затем передайте указатель на структуру функции registerClass .
Создание меню класса
В следующем примере показано, как создать меню класса для приложения, создать окно, которое использует меню «класс» и команды «обработать» в процедуре окна.
Ниже приведена соответствующая часть файла заголовка приложения.
Ниже перечислены соответствующие части самого приложения.
Создание контекстного меню
Чтобы использовать контекстное меню в приложении, передайте его обработчик функции траккпопупменуекс . Приложение обычно вызывает траккпопупменуекс в оконной процедуре в ответ на генерируемое пользователем сообщение, например WM _ лбуттондовн или WM _ KeyDown.
Помимо маркера всплывающего меню, траккпопупменуекс требует указать маркер для окна владельца, позицию контекстного меню (в экранных координатах) и кнопку мыши, которую пользователь может использовать для выбора элемента.
Старая функция метод TrackPopupMenu по-прежнему поддерживается, но новые приложения должны использовать функцию траккпопупменуекс . Функция траккпопупменуекс требует те же параметры, что и метод TrackPopupMenu, но также позволяет указать часть экрана, которую меню не должно скрывать. Приложение обычно вызывает эти функции в оконной процедуре при обработке сообщения WM _ CONTEXTMENU .
Можно указать расположение контекстного меню, указав координаты x и y вместе с флагом TPM _ центералигн, TPM _ Лефталигн или _ RIGHTALIGN доверенного платформенного модуля . Флаг задает расположение контекстного меню относительно координат x и y.
Необходимо предоставить пользователю возможность выбирать элемент из контекстного меню, используя ту же кнопку мыши, которая используется для вывода меню. Для этого укажите флаг TPM _ Лефтбуттон или TPM _ ригхтбуттон , чтобы указать, какая кнопка мыши может использоваться для выбора пункта меню.
Обработка сообщения WM _ CONTEXTMENU
Сообщение WM _ CONTEXTMENU создается, когда процедура окна приложения передает сообщение WM _ рбуттонуп или WM _ нкрбуттонуп в функцию дефвиндовпрок . Приложение может обработать это сообщение, чтобы отобразить контекстное меню, соответствующее определенной части экрана. Если в приложении не отображается контекстное меню, оно должно передавать сообщение дефвиндовпрок для обработки по умолчанию.
Ниже приведен пример обработки сообщений WM _ CONTEXTMENU , как это может появиться в процедуре окна приложения. Слова с низким и высоким порядком параметров lParam определяют экранные координаты мыши при отпускании правой кнопки мыши (Обратите внимание, что эти координаты могут принимать отрицательные значения в системах с несколькими мониторами). Определяемая приложением функция oncontextmenu возвращает значение true , если она отображает контекстное меню, или значение false в противном случае.
Следующая определяемая приложением функция oncontextmenu отображает контекстное меню, если указанная позицией мыши находится в клиентской области окна. Более сложная функция может отображать одно из нескольких различных меню в зависимости от того, какая часть клиентской области задана. Для фактического вывода контекстного меню в этом примере вызывается определяемая приложением функция с именем Дисплайконтекстмену. Описание этой функции см. в разделе Отображение контекстного меню.
Создание контекстного меню Font-Attributes
Пример в этом разделе содержит фрагменты кода из приложения, которое создает и отображает контекстное меню, позволяющее пользователю устанавливать шрифты и атрибуты шрифта. Приложение отображает меню в клиентской области его главного окна каждый раз, когда пользователь нажимает левую кнопку мыши.
Ниже приведен шаблон меню для контекстного меню, предоставленного в файле определения ресурсов приложения.
В следующем примере приводится процедура окна и вспомогательные функции, используемые для создания и вывода контекстного меню.
Отображение контекстного меню
Функция, показанная в следующем примере, выводит контекстное меню.
Приложение включает ресурс меню, определяемый строкой «Шорткутексампле». Строка меню просто содержит имя меню. Приложение использует функцию метод TrackPopupMenu для вывода меню, связанного с этим пунктом меню. (Сама строка меню не отображается, так как для метод TrackPopupMenu требуется маркер меню, подменю или контекстное меню.)
Использование точечных рисунков Menu-Item
Для вывода пункта меню система может использовать точечный рисунок вместо текстовой строки. Чтобы использовать точечный рисунок, необходимо задать флаг _ точечного рисунка миим для пункта меню и указать маркер для точечного рисунка, который должен отображаться системой для элемента меню в элементе хбмпитем структуры объектами menuiteminfo . В этом разделе описывается использование точечных рисунков для пунктов меню.
Установка флага типа точечного рисунка
Флаг _ растрового _ изображения миим или MF указывает, что система использует точечный рисунок, а не текстовую строку для вывода пункта меню. Во время выполнения необходимо задать _ растровое изображение миим или флаг MF _ Bitmap . его нельзя задать в файле определения ресурса.
Для новых приложений можно использовать функцию сетменуитеминфо или инсертменуитем , чтобы установить флаг типа _ точечного рисунка миим . Чтобы изменить пункт меню из текстового элемента на элемент точечного рисунка, используйте сетменуитеминфо. Чтобы добавить новый элемент Bitmap в меню, используйте функцию инсертменуитем .
Приложения, написанные для более ранних версий системы, могут продолжать использовать функции модифимену, инсертменуили аппендмену для установки флага _ битовой карты MF . Чтобы изменить пункт меню из элемента текстовой строки на растровый элемент, используйте модифимену. Чтобы добавить новый элемент Bitmap в меню, используйте флаг MF _ Bitmap с функцией инсертмену или аппендмену .
Создание точечного рисунка
При задании флага _ растрового изображения Миим или MF _ для пункта меню необходимо также указать маркер для точечного рисунка, который система должна отображать для пункта меню. Можно указать точечный рисунок как ресурс точечного рисунка или создать точечный рисунок во время выполнения. При использовании ресурса точечного рисунка можно использовать функцию лоадбитмап для загрузки точечного рисунка и получения его маркера.
чтобы создать точечный рисунок во время выполнения, используйте функции Windows интерфейс графических устройств (GDI). GDI предоставляет несколько способов создания точечного рисунка во время выполнения, но разработчики обычно используют следующий метод:
- Используйте функцию креатекомпатибледк , чтобы создать контекст устройства, совместимый с контекстом устройства, используемым главным окном приложения.
- Используйте функцию креатекомпатиблебитмап для создания точечного рисунка, совместимого с главным окном приложения, или используйте функцию креатебитмап для создания монохромного точечного рисунка.
- Используйте функцию SelectObject , чтобы выбрать точечный рисунок в совместимом контексте устройства.
- Для рисования изображения в растровом изображении используются функции рисования GDI, такие как Ellipse и lineTo.
Дополнительные сведения см. в разделе точечные рисунки.
Добавление линий и графиков в меню
В следующем примере кода показано, как создать меню, содержащее растровые изображения элементов меню. Он создает два меню. Первое — меню диаграммы, содержащее три точечных рисунка элемента меню: круговую диаграмму, график и линейчатую диаграмму. В примере показано, как загрузить эти растровые изображения из файла ресурсов приложения, а затем использовать функции креатепопупмену и аппендмену для создания меню и пунктов меню.
Второе меню — это меню «строки». Он содержит точечные рисунки, отображающие стили линий, предоставляемые стандартным пером в системе. Растровые изображения в стиле строки создаются во время выполнения с помощью функций GDI.
Ниже приведены определения ресурсов точечных рисунков в файле определения ресурсов приложения.
Ниже приведены соответствующие части файла заголовка приложения.
В следующем примере показано, как в приложении создаются растровые изображения меню и элементов меню.
Пример Menu-Item точечных рисунков
Пример в этом разделе создает два меню, каждое из которых содержит несколько пунктов точечного меню. Для каждого меню приложение добавляет соответствующее имя меню в строку меню главного окна.
Первое меню содержит пункты меню, отображающие три типа диаграмм: круговые, линии и линейчатые. Точечные рисунки для этих пунктов меню определяются как ресурсы и загружаются с помощью функции лоадбитмап . Связанное с этим меню представляет собой имя меню «Диаграмма» в строке меню.
Второе меню содержит пункты меню, показывающие каждый из пяти стилей линий, используемых с функцией креатепен : PS _ сплошной, PS _ тире, PS _ Dot, PS _ дашдот и PS _ дашдотдот. Приложение создает точечные рисунки для этих пунктов меню во время выполнения с помощью функций рисования GDI. Это меню связано с названием меню строки в строке меню.
Определение в процедуре окна приложения — это два статических массива дескрипторов битовой карты. Один массив содержит дескрипторы трех растровых изображений, используемых для меню диаграммы . Другой содержит маркеры из пяти растровых изображений, используемых в меню « строки ». При обработке сообщения , _ созданного обработчиком WM, процедура Window загружает точечные рисунки диаграммы, создает точечные рисунки линий, а затем добавляет соответствующие пункты меню. При обработке сообщения WM _ destroy процедура Window удаляет все точечные рисунки.
Ниже приведены соответствующие части файла заголовка приложения.
Ниже приведены соответствующие части процедуры окна. Процедура Window выполняет большую часть своей инициализации, вызывая определяемые приложением функции Лоадчартбитмапс, Креателинебитмапс и Аддбитмапмену, описанные далее в этом разделе.
Определяемая приложением функция Лоадчартбитмапс загружает ресурсы точечного рисунка для меню диаграммы путем вызова функции лоадбитмап , как показано ниже.
Определяемая приложением функция Креателинебитмапс создает точечные рисунки для меню «линии» с помощью функций рисования GDI. Функция создает контекст устройства памяти (DC) с теми же свойствами, что и контроллер домена рабочего стола. Для каждого стиля линии функция создает точечный рисунок, выделяет его в памяти контроллера домена и рисует в нем.
Определяемая приложением функция Аддбитмапмену создает меню и добавляет в нее указанное число пунктов точечного меню. Затем он добавляет соответствующее имя меню в строку меню указанного окна.
Создание пунктов меню Owner-Drawn
Если вам нужен полный контроль над видом элемента меню, можно использовать элемент меню, рисуемый владельцем приложения. В этом разделе описываются шаги, связанные с созданием и использованием элемента меню, рисуемого владельцем.
Установка флага Owner-Drawn
Нельзя определить элемент меню, рисуемый владельцем, в файле определения ресурса приложения. Вместо этого необходимо создать новый пункт меню или изменить существующий с помощью флага меню MFT _ овнердрав .
Для указания элемента меню, рисуемого владельцем, можно использовать функцию инсертменуитем или сетменуитеминфо . Используйте инсертменуитем для вставки нового пункта меню в указанную позицию в строке меню или меню. Используйте сетменуитеминфо для изменения содержимого меню.
При вызове этих двух функций необходимо указать указатель на структуру объектами menuiteminfo , указывающую свойства нового пункта меню или свойства, которые необходимо изменить для существующего элемента меню. Чтобы сделать элемент элементом, рисуемым владельцем, укажите значение миим _ ftype для элемента Фмаск и значение _ овнердрав MFT для члена ftype .
Устанавливая соответствующие элементы структуры объектами menuiteminfo , можно связать определяемое приложением значение, которое называется данными элемента, с каждым пунктом меню. Для этого укажите значение _ данных миим для элемента фмаск и значение, определяемое приложением для элемента двитемдата .
Данные элемента можно использовать с любым типом пункта меню, но это особенно удобно для элементов, рисуемых владельцем. Например, предположим, что структура содержит сведения, используемые для рисования пункта меню. Приложение может использовать данные элемента для элемента меню для сохранения указателя на структуру. Данные элемента отправляются в окно владельца меню с сообщениями WM _ Меасуреитем и WM _ DRAWITEM . Чтобы получить данные элемента для меню в любое время, используйте функцию жетменуитеминфо .
Приложения, написанные для более ранних версий системы, могут по-прежнему вызывать аппендмену, инсертменуили Модифимену для назначения флага MF _ овнердрав элементу меню, рисуемому владельцем.
При вызове любой из этих трех функций можно передать значение в качестве параметра лпневитем . Это значение может представлять любую информацию, значимую для приложения, и будет доступна приложению при отображении элемента. Например, значение может содержать указатель на структуру; структура, в свою очередь, может содержать текстовую строку и маркер для логического шрифта, который приложение будет использовать для рисования строки.
Owner-Drawn меню и _ сообщение МЕАСУРЕИТЕМ WM
Прежде чем система выведет на экран элемент меню, рисуемый владельцем впервые, он отправляет сообщение WM _ меасуреитем в оконную процедуру окна, которому принадлежит меню элемента. Это сообщение содержит указатель на структуру меасуреитемструкт , которая идентифицирует элемент и содержит данные элемента, которые могли быть назначены приложению. Процедура окна должна заполнить члены структуры итемвидс и итемхеигхт перед возвратом из обработки сообщения. Система использует информацию этих членов при создании ограничивающего прямоугольника, в котором приложение рисует пункт меню. Он также использует информацию для определения того, когда пользователь выбирает элемент.
Owner-Drawn меню и _ сообщение DRAWITEM WM
Каждый раз, когда элемент должен быть нарисован (например, когда он впервые отображается или когда пользователь выбирает его), система отправляет сообщение WM _ DRAWITEM в оконную процедуру окна «владелец» меню. Это сообщение содержит указатель на структуру дравитемструкт , которая содержит сведения об элементе, включая данные элемента, которые могли быть назначены приложению. Кроме того, дравитемструкт содержит флаги, указывающие состояние элемента (например, является ли он серым или выделенным), а также ограничивающий прямоугольник и контекст устройства, используемый приложением для рисования элемента.
При обработке сообщения WM _ DRAWITEM приложение должно выполнить следующие действия:
- Определите необходимый тип рисунка. Для этого проверьте элемент итемактион структуры дравитемструкт .
- Нарисуйте элемент меню соответствующим образом, используя ограничивающий прямоугольник и контекст устройства, полученные из структуры дравитемструкт . Приложение должно рисовать только в ограничивающем прямоугольнике. Из соображений производительности система не обрезает фрагменты изображения, рисуемые за пределами прямоугольника.
- Восстановите все объекты GDI, выбранные для контекста устройства этого пункта меню.
Если пользователь выбирает пункт меню, система устанавливает для элемента итемактион структуры дравитемструкт значение Ода _ SELECT Value и устанавливает _ выбранное значение ODS в элементе ItemState . Это подсказка приложения для перерисовки пункта меню, чтобы показать, что он выбран.
Owner-Drawn меню и _ сообщение МЕНУЧАР WM
В меню, отличном от рисуемых владельцем меню, можно указать клавишу меню, вставив знак подчеркивания рядом с символом в строке меню. Это позволяет пользователю выбрать меню, нажав клавишу ALT и нажимая клавишу «Menu». Однако в меню, рисуемых владельцем, при этом нельзя указать назначенную ему команду меню. Вместо этого приложение должно обработать сообщение WM _ менучар , чтобы предоставить меню, рисуемое владельцем, с помощью мнемоник меню.
Сообщение WM _ менучар отправляется, когда пользователь вводит назначенную клавишу меню, не совпадающую ни с одной из стандартных мнемоник текущего меню. Значение, содержащееся в параметре wParam , указывает символ ASCII, соответствующий ключу, который пользователь нажал с помощью клавиши ALT. Слово wParam с низким приоритетом определяет тип выбранного меню и может принимать одно из следующих значений:
- MF _ Всплывающее окно , если текущее меню является подменю.
- MF _ СИСМЕНУ , если меню является системным меню.
Слово « wParam » высокого порядка содержит маркер меню для текущего меню. Окно с меню, рисуемым владельцем, может обрабатывать WM _ менучар следующим образом:
Два в слове с высоким порядком возвращаемого значения уведомляют систему о том, что младшее слово возвращаемого значения содержит Отсчитываемый от нуля индекс выбираемого элемента меню.
Следующие константы соответствуют возможным возвращаемым значениям из сообщения _ менучар WM .
Константа | Значение | Значение |
---|---|---|
МНК _ игнорировать | 0 | Система должна отказаться от нажатого пользователем символа и создать короткий звуковой сигнал на системном докладчике. |
МНК _ Закрыть | 1 | Система должна закрыть активное меню. |
_выполнение МНК | 2 | Система должна выбрать элемент, указанный в младшем слове возвращаемого значения. Окно-владелец получает сообщение _ командной строки WM . |
МНК _ SELECT | 3 | Система должна выбрать элемент, указанный в младшем слове возвращаемого значения. |
Установка шрифтов для Menu-Item текстовых строк
В этом разделе содержится пример из приложения, в котором используются элементы меню, рисуемые владельцем. Меню содержит элементы, устанавливающие атрибуты текущего шрифта, и элементы отображаются с помощью соответствующего атрибута Font.
Вот как это меню определено в файле определения ресурса. Обратите внимание, что строки для элементов меню обычный, полужирный, курсив и подчеркивание присваиваются во время выполнения, поэтому их строки в файле определения ресурсов пусты.
Окно приложения обрабатывает сообщения, участвующие в использовании элементов меню, рисуемых владельцем. Приложение использует сообщение о _ создании WM для следующих задач:
- Установите флаг MF _ овнердрав для пунктов меню.
- Задайте текстовые строки для пунктов меню.
- Получение дескрипторов шрифтов, используемых для рисования элементов.
- Получение значений цвета текста и фона для выбранных пунктов меню.
Текстовые строки и дескрипторы шрифтов хранятся в массиве определяемых приложением структур МИТЕМ. Определяемая приложением функция Жетафонт создает шрифт, соответствующий указанному атрибуту Font, и возвращает маркер для шрифта. Дескрипторы уничтожаются во время обработки сообщения WM _ destroy .
Во время обработки сообщения WM _ меасуреитем в примере получается ширина и высота строки элемента меню, и эти значения копируются в структуру меасуреитемструкт . Система использует значения Width и Height для вычисления размера меню.
Во время обработки сообщения WM _ DRAWITEM строка элемента меню рисуется с помощью комнаты слева рядом со строкой для точечного рисунка галочки. Если пользователь выбирает элемент, для рисования элемента используются выделенные цвета текста и фона.
Пример пунктов меню Owner-Drawn
В примере в этом разделе в меню используются элементы меню, рисуемые владельцем. Пункты меню выбирают конкретные атрибуты шрифта, и приложение отображает каждый элемент меню, используя шрифт с соответствующим атрибутом. Например, элемент меню курсив отображается курсивом. Откроется меню с символами в строке меню.
Строка меню и раскрывающееся меню определяются с помощью расширенного ресурса шаблона меню. Поскольку шаблон меню не может указывать элементы, рисуемые владельцем, меню изначально содержит четыре пункта текстового меню со следующими строками: «обычный», «полужирный», «Курсив» и «подчеркнутый». Процедура окна приложения изменяет их на рисуемые владельцем элементы при обработке сообщения о _ создании WM . При получении сообщения о _ создании WM процедура Window вызывает функцию, определяемую приложением, которая выполняет следующие действия для каждого пункта меню:
- Выделяет определенную приложением структуру МИТЕМ.
- Возвращает текст пункта меню и сохраняет его в определяемой приложением структуре МИТЕМ.
- Создает шрифт, используемый для вывода пункта меню, и сохраняет его маркер в определяемой приложением структуре МИТЕМ.
- Изменяет тип элемента меню на MFT _ овнердрав и сохраняет указатель на определенную приложением структуру митем в виде данных элемента.
Поскольку указатель на каждую определенную приложением структуру МИТЕМ сохраняется как данные элемента, он передается в процедуру окна вместе с сообщениями WM _ Меасуреитем и WM _ DRAWITEM для соответствующего пункта меню. Указатель содержится в элементе итемдата в структурах меасуреитемструкт и дравитемструкт .
Сообщение WM _ меасуреитем отправляется для каждого элемента меню, рисуемого владельцем, при первом его отображении. Приложение обрабатывает это сообщение, выбирая шрифт для пункта меню в контексте устройства, а затем определяя пространство, необходимое для вывода текста пункта меню в этом шрифте. Текст шрифта и пункта меню определяется MYITEM структурой пункта меню (структурой, определенной приложением). Приложение определяет размер текста с помощью функции GetTextExtentPoint32 .
Процедура окна обрабатывает сообщение WM _ DRAWITEM , отображая текст пункта меню соответствующим шрифтом. Текст шрифта и пункта меню задаются MYITEM структурой пункта меню. Приложение выбирает цвета текста и фона, соответствующие состоянию пункта меню.
Процедура Window обрабатывает сообщение WM _ destroy для уничтожения шрифтов и освобождения памяти. Приложение удаляет шрифт и освобождает структуру МИТЕМ, определяемую приложением, для каждого пункта меню.
Ниже приведены соответствующие части файла заголовка приложения.
Ниже приведены соответствующие части процедуры окна приложения и связанные с ней функции.
Использование пользовательских точечных рисунков
Система предоставляет растровое изображение галочки по умолчанию для отображения рядом с выбранным пунктом меню. Можно настроить отдельный элемент меню, предоставив пару точечных рисунков, чтобы заменить точечный рисунок галочки по умолчанию. Система отображает одно растровое изображение, когда элемент выбран и другой при его очистке. В этом разделе описываются шаги, связанные с созданием и использованием пользовательских точечных рисунков с галочкой.
Создание пользовательских точечных рисунков с галочками
Пользовательское растровое изображение галочки должно иметь тот же размер, что и точечный рисунок галочки по умолчанию. Вы можете получить размер отметки по умолчанию для точечного рисунка, вызвав функцию жетсистемметрикс . Слово с низким приоритетом возвращаемого значения этой функции указывает ширину; слово в высоком порядке указывает высоту.
Вы можете использовать ресурсы точечного рисунка для предоставления точечных рисунков галочки. Однако, поскольку требуемый размер растрового изображения зависит от типа дисплея, может потребоваться изменить размер растрового изображения во время выполнения с помощью функции стретчблт . В зависимости от точечного рисунка искажение, вызванное изменением размера, может привести к неприемлемым результатам.
Вместо использования ресурса точечного рисунка можно создать точечный рисунок во время выполнения с помощью функций GDI.
Создание точечного рисунка во время выполнения
Используйте функцию креатекомпатибледк , чтобы создать контекст устройства, совместимый с тем, который используется главным окном приложения.
В параметре HDC функции можно указать значение null или возврат из функции. Креатекомпатибледк возвращает маркер для совместимого контекста устройства.
Используйте функцию креатекомпатиблебитмап , чтобы создать точечный рисунок, совместимый с главным окном приложения.
Параметры нвидс и нхеигхт этой функции устанавливают размер растрового изображения. они должны указывать сведения о ширине и высоте, возвращаемые функцией жетсистемметрикс .
Для создания монохромного точечного рисунка можно также использовать функцию креатебитмап .
Используйте функцию SelectObject , чтобы выбрать точечный рисунок в совместимом контексте устройства.
Используйте функции рисования GDI, такие как Ellipse и lineTo, для рисования изображения в растровом изображении или для копирования изображения в растровое изображение с помощью таких функций, как BitBlt и стретчблт .
Дополнительные сведения см. в разделе точечные рисунки.
Связывание точечных рисунков с пунктом меню
Пара битов точечных рисунков связывается с пунктом меню путем передачи дескрипторов растровых изображений в функцию сетменуитембитмапс . Параметр хбитмапунчеккед Определяет битовую карту, а параметр хбитмапчеккед определяет выбранный точечный рисунок. Если вы хотите удалить один или оба флажка из пункта меню, можно задать для параметра хбитмапунчеккед или хбитмапчеккед значение null.
Установка атрибута галочки
Функция чеккменуитем задает для выбранного или сброшенного атрибута элемента меню флажок. Можно указать значение, установленное в параметре MF _ , чтобы присвоить атрибуту галочки значение выбрано, а _ непроверенное — MF — очистить.
Вы также можете задать состояние проверки пункта меню с помощью функции сетменуитеминфо .
Иногда группа элементов меню представляет набор взаимоисключающих параметров. С помощью функции чеккменурадиоитем можно проверить один пункт меню и одновременно снять флажок рядом с другими элементами меню в группе.
Имитация флажков в меню
В этом разделе содержится пример, демонстрирующий имитацию флажков в меню. Этот пример содержит меню символов, элементы которого позволяют пользователю задать атрибуты полужирного начертания, курсива и подчеркивания текущего шрифта. Если атрибут Font действует, флажок рядом с соответствующим пунктом меню отображается галочкой. в противном случае рядом с элементом отображается пустой флажок.
В примере точечный рисунок галочки по умолчанию заменен двумя точечными рисунками: точечный рисунок с выбранным флажком и точечный рисунок с пустым полем. Выделенное битовое изображение флажка отображается рядом с пунктом меню полужирный, курсив или подчеркнутый, если для атрибута элемента установлен флажок установить значение MF _. Если атрибут галочки установлен в значение MF _ снят, отображается битовое изображение флажка очистить или пусто.
Система предоставляет предопределенный точечный рисунок, который содержит изображения, используемые для флажков и переключателей. В этом примере изолируются флажки «выбранные» и «пустые», они копируются в два отдельных точечных рисунка, а затем используются в качестве выделенных и очищенных растровых изображений для элементов в меню » символ «.
Чтобы получить маркер для точечного рисунка с флажком, в примере вызывается функция лоадбитмап с указанием значения NULL в качестве параметра HINSTANCE и ОБМ _ CheckBox в качестве параметра лпбитмапнаме . Поскольку изображения в точечном рисунке имеют одинаковый размер, в примере их можно изолировать, разделив ширину и высоту растрового изображения на количество изображений в их строках и столбцах.
В следующей части файла определения ресурсов показано, как определяются элементы меню в меню « символ ». Обратите внимание, что атрибуты шрифта изначально не действуют, поэтому атрибуту галочки для обычного элемента присваивается значение выбрано и по умолчанию атрибуту галочки оставшихся элементов присваивается значение Clear.
Ниже приведено соответствующее содержимое файла заголовка приложения.
В следующем примере показаны части процедуры окна, которые создают точечные рисунки с галочкой. Задайте атрибут галочки для пунктов меню полужирный, курсив и Подчеркивание . и уничтожать растровые изображения галочки.
Пример использования пользовательских точечных рисунков с галочкой
В примере, приведенном в этом разделе, к пунктам меню в двух меню присваиваются точечные рисунки с пользовательскими галочками. Пункты меню в первом меню указывают атрибуты символов: полужирный, курсив и подчеркнутый. Каждый пункт меню может быть выбран или снят. Для этих пунктов меню в примере используются точечные рисунки с галочками, которые похожи на выбранные и сброшенные состояния элемента управления «флажок».
Пункты меню во втором меню задают параметры выравнивания абзаца: слева, по центру и справа. В любое время выбирается только один из этих пунктов меню. Для этих пунктов меню в примере используются точечные рисунки с галочками, которые похожи на выбранные и четкие состояния элемента управления «переключатель».
Процедура окна обрабатывает сообщение о _ создании WM , вызывая функцию, определяемую приложением. OnCreate создает четыре точечных рисунка галочки и затем назначает их соответствующим пунктам меню с помощью функции сетменуитембитмапс .
Для создания каждого точечного рисунка OnCreate вызывает определяемую приложением функцию Креатеменубитмапс, указывая указатель на функцию рисования, относящуюся к точечному рисунку. Креатеменубитмапс создает монохромное растровое изображение требуемого размера, выбирает его в контексте устройства памяти и стирает фон. Затем вызывается указанная функция рисования для заполнения переднего плана.
Четыре определяемые приложением функции рисования: Дравчекк, Дравунчекк, драврадиочекк и драврадиаунчекк. Они нарисуют прямоугольник с символом X, пустым прямоугольником, эллипсом, содержащим меньший эллипс, и пустой эллипс соответственно.
Процедура Window обрабатывает сообщение WM _ destroy , удаляя точечные рисунки галочки. Он извлекает каждый растровый маркер с помощью функции жетменуитеминфо , а затем передает в функцию маркер.
Когда пользователь выбирает пункт меню, в окно владельца отправляется _ командное сообщение WM . Для пунктов меню в меню » символ » процедура Window вызывает определяемую приложением функцию чеккчарактеритем. Для элементов в меню « абзац » процедура Window вызывает определяемую приложением функцию чеккпараграфитем.
Каждый элемент в меню « символ » можно выбирать и очищать независимо друг от друга. Таким образом, Чеккчарактеритем просто переключается на состояние проверки указанного элемента меню. Сначала функция вызывает функцию жетменуитеминфо для получения текущего состояния элемента меню. Затем он переключает флаг состояния _ checked MFA и устанавливает новое состояние, вызывая функцию сетменуитеминфо .
В отличие от атрибутов символов, одновременно можно выбрать только одно выравнивание абзаца. Таким образом, Чеккпараграфитем проверяет указанный пункт меню и снимает флажки для всех остальных элементов меню. Для этого вызывается функция чеккменурадиоитем .
Ниже приведены соответствующие части файла заголовка приложения.
Ниже приведены соответствующие части процедуры окна приложения и связанные функции.
Источник