Рассылка закрыта
При закрытии подписчики были переданы в рассылку "Ваш интернет-бизнес" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
ExCode.ru - программирование на высоком уровне - выпуск 4
Информационный Канал Subscribe.Ru |
ExCode.ru - программирование на высоком уровне | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Выпуск №4 ( 2005.08.20 )
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Здравствуйте, уважаемые подписчики!Сегодня в выпуске самые интересные новости за последнюю неделю, любопытная статья по Delphi, список новых статей и файлов на сайте ExCode.ru и новая порция анекдотов о компьютерщиках. Приятного вам чтения! Мы ждем Вас в гости к нам на сайт www.ExCode.ru
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Новости копьютерного мира:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Статья номера:
Создание главного меню средствами Win APIИсточник: http://decoding.narod.ru/api/menu/menu.html
Сегодня мы добавим в наше минимальное приложение главное меню. Но прежде рассмотрим некоторые API функции для работы с ним. CreateMenu function CreateMenu: HMENU; В случае успешного выполнения, функция возвращает дескриптор созданного меню, иначе возвращает 0. CreatePopupMenu function CreatePopupMenu: HMENU; Как и в случае с CreateMenu, после успешного выполнения, функция возвращает дескриптор созданного меню, иначе возвращает 0. AppendMenu function AppendMenu( hMenu: HMENU; uFlags, uIDNewItem: UINT; lpNewItem: PChar ): BOOL; Функция AppendMenu добавляет новый элемент (пункт) к концу указанной строки меню, раскрывающегося меню или подменю. Эту функцию можно использовать, чтобы определить содержание, появление, и поведение пункта меню. hMenu Идентификатор строки меню, раскрывающееся меню или подменю, которое будет изменено. uFlags Определяет флажки, управляющие появлением и поведением нового пункта меню. Этот параметр может быть комбинация значений. uIDNewItem Определяет или идентификатор нового пункта меню или, если uFlags параметр установлен в MF_POPUP, дескриптор раскрывающегося меню или подменю. lpNewItem Определяет содержание нового пункта меню. InsertMenu function AppendMenu( hMenu: HMENU; uPosition, uFlags, uIDNewItem: UINT; lpNewItem: PChar ): BOOL; Функция InsertMenu вставляет новый пункт в меню, перемещая другие элементы меню вниз. Параметры этой функции те же, что и у AppendMenu, за одним исключением. uPosition Определяет место, в которое должен быть вставлен новый пункт меню. SetMenu function SetMenu( hWnd: HWND; hMenu: HMENU ): BOOL; Функция SetMenu связываем новое меню с окном. hWnd Идентификатор окна, которому должно быть назначено новое меню. hMenu Идентификатор меню, которое должно быть назначено окну. Если этот параметр нулевой, текущее меню окна удаляется. DrawMenuBar function DrawMenuBar( hWnd: HWND ): BOOL; Функция DrawMenuBar перерисовывает строку меню указанного окна. hWnd Идентификатор окна, чья строка меню нуждается в изменении. EnableMenuItem function EnableMenuItem( hMenu: HMENU; uIDEnableItem, uEnable: UINT ): BOOL; Функция EnableMenuItem включает/отключает указанный пункт меню. hMenu Идентификатор меню. uIDEnableItem Определяет пункт меню, состояние которого нужно изменить. uEnable Определяет флажки, управляющие состоянием пункта меню. CheckMenuItem function CheckMenuItem( hMenu: HMENU; uIDEnableItem, uEnable: UINT ): BOOL; Функция CheckMenuItem помечает пункт меню или снимает пометку (пометка в виде галочки). hMenu Идентификатор меню. uIDCheckItem Определяет пункт меню, чей атрибут пометки должен быть установлен в соответствии со значением параметра uCheck. uCheck Определяет флажки, управляющие состоянием пункта меню. Более полную и подробную информацию смотрите в хэлпе. Делая эту программу, я нашел пару способов создать меню (они не очень сильно отличаются друг от друга, но оба имеют право на существование). На первом способе я остановлюсь поподробнее, а, говоря о втором, просто скажу, чем он отличается от первого. Главное меню программы, это строка, которая располагается в верхней части формы. Она состоит из пунктов, нажатие на любой из них приведет к раскрытию подменю, принадлежащего данному пункту. Это всплывающее меню в Windows называется PopupMenu. Обратите внимание, понятие PopupMenu в Delphi и Windows различаются. В Windows PopupMenu - это подменю, принадлежащее другому пункту меню (который отмечается треугольником справа от текста пункта) или одному из пунктов главного меню. В Delphi PopupMenu — это меню, которое может "всплывать" в любой точке формы. Осознав вышесказанное, приступаем к работе. Откроем шаблон, написанный в прошлый раз, и дополним список констант и переменных
Сначала разберемся с константами. Каждый пункт меню должен иметь свой уникальный идентификационный номер. Так как именно по этим номерам мы и будем работать с меню, удобнее всего оформить их как константы. Идея следующая. В главном меню будет 3 пункта: Menu, Edit и Check. Константы для него начинаются с буквы m и имеют номера 100, 200 и 300 соответственно. Каждому из этих пунктов будет сопоставлено свое подменю. Константы для них начинаются с буквы s и номеруются следующим образом: те, которые относятся к первому пункту, начинаются со 100+1, те, которые относятся ко второму пункту, начинаются с 200+1, ну и по аналогии, те, которые относятся к третьему пункту, начинаются с 300+1. В третьем пункте будет подменю второго уровня, константа для него равна 300+10+1. Отдельное значение имеет константа SEPARATOR, это просто разделитель между пунктами подменю. Переходим к разделу var. Здесь появилось 5 переменных типа HMENU, они содержат Hendle соответствующего меню (какого, понятно из их названия). Переменная Check показывает, установлен или сброшен пункт меню (читайте дальше, и все поймете). При добавлении нового пункта приходится выполнить ряд действий, в том числе инициализацию структуры MENUITEMINFO. Так как эти действия нужно производить при добавлении каждого пункта, чтобы избавиться от избыточности кода, оформим эти действия в виде отдельной процедуры.
Поясню входные параметры функции. hMenu - меню, в которое добавляется новый пункт; SubMenu - связанное с этим пунктом подменю (если оно есть); Cap - заголовок нового пункта; _uID - всегда 0 (этот параметр используется в функции InsertMenuItem); _wID - идентификатор, связанный с данным пунктом; Sep - признак, является ли новый пункт разделителем или нет. Наше приложение должно реагировать на выбор того или иного пункта меню. Дополним оконную процедуру следующим образом:
При выборе пункта Exit (константа sExit) программа будет закрыта. Выбор пунктов Copy, Cut, Paste (константы sCopy, sCut и sPaste соответственно) приведет к появлению сообщения, соответствующего выбранному пункту. Пункт Select (константа sSelect) работает аналогично TCheckBox, то есть может быть установлен или сброшен. При выборе пункта Beep (константа sSecondLevel) мы услышим звуковой сигнал. Теперь для создания меню все готово. Приступаем.
Разбираемся. Первым делом создаем главное меню. Указатель на него присваиваем полю lpszMenuName структуры Wc (раньше оно было равно nil). После регистрации класса в системе создаем подменю. При создании окна, параметр hMenu функции CreateWindowEx равен MainMenu (Handle созданного меню, а не 0, как было в шаблоне). После создания всех пунктов, перерисовываем меню при помощи функции DrawMenuBar. Теперь второй способ создания меню. Здесь я приведу его в сокращении, и поясню произведенные изменения (полный текст программы имеется в архиве с примерами в конце статьи).
Поле lpszMenuName структуры Wc остается равным nil. Главное меню создаем после регистрации класса в системе. При создании окна, параметр hMenu функции CreateWindowEx можно оставить равным 0, т.к. здесь мы не перерисовываем меню, а назначаем его форме, используя функцию SetMenu. Все. Теперь у нашей формы есть меню. Это оказалось совсем не сложно. До новых встреч, удачи в программировании. Новые статьи на сайте ExCode.ru: |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Новые файлы на сайте ExCode.ru:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Анекдоты о программистах:
Если "Microsoft" начнет выпускать автомобили - то:
1. Когда на дорогу нанесут новую разметку, вам придется покупать новую машину. 3. "Macintosh" тоже начнет выпускать автомобили, они будут заряжаться от солнца, будут в два раза быстрее, ими будет легче управлять, но ездить они будут только по 5% дорог. 4. Индикаторы топлива, температуры двигателя и масла будут объединены в один "главный машинный индикатор". 7. Во время аварии подушки безопасности, прежде чем сработают, спросят: "Are you sure?" "Bugs" - фильм ужасов для программистов-отладчиков. Погода выполнила недопустимую операцию и завалила Африку снегом... - Алло, техотдел? Я пароль набираю - а меня не пускают. - Значит, правильно набирать надо. - Я правильно набираю! Пять звездочек! Пришёл программер как-то раз в ресторан, заказал себе отбивную. Берётся, значит, за дело, бац, а вилка с ножиком, аж соскальзывают с отбивной: - Read only... - подумал программер. Программисты не пишут нелогичных программ, бывают нелогичные пользователи. Забрали интернетчика в армию. На границе служить. Стоит он на посту. Вдруг - шаги. - Пароль!!! ...тишина - Пароль!!!! ...тишина Программер снимает с плеча автомат... короткая очередь... - User Anonymous Access Denied. Вопрос: - Почему в UNIX процедура входа называется "login", а в Winodows - "logon"? Ответ: - Ну, знаете ли, это от позы зависит. Письмо в компьютерный сервисный центр: - Этанутипауменяпробелполомалсячеделатьто? Ответ: - Настоящие_программисты_не_пользуются_пробелами. У молодого хакера спрашивают: - Максим, ну что тебе нравится, кроме женщин и компьютеров? - Как что? Девушки и калькуляторы. Антивирус. Ты кто? Вирус. Область данных! Антивирус. А не вирус? Вирус. Hи боже мой! Антивирус. А зачем прерывания перехватываешь? Вирус. Я?! Антивирус. Вот же подпрограмма. Вирус. Это не подпрограмма. Это цитата из Лао-цзы на языке оригинала в альтернативной кодировке. Антивирус. А зачем EXE-файлы ищешь? Вирус. А вдруг хозяин спросит: "А где мои ЕХЕ-файлы?" А я ему - вот они! Антивирус. Сдается мне, что ты все-таки вирус. Вирус. Hу ладно, только тебе признаюсь, только ты никому не говори! Hа самом деле я... антивирусная вакцина! Антивирус. А зачем нужна антивирусная вакцина, если есть я? Вирус. Откуда я знаю? У хозяина спроси. Антивирус. А если я тебя на всякий случай все-таки грохну? Вирус. А если я тебя? Антивирус. Hе получится. У меня управление. Вирус. А ты свою контрольную сумму давно пересчитывал? Антивирус. А причем тут моя контрольная... ой!!! Вирус. То-то же. Приходит один программист к другому: - Слышь, Петя, мне генератор случайных чисел нужен. - Четырнадцать! В дополнение к высказываниям "настоящие" программисты считают, что в 1 км - 1024 м, в сутках 3 байта... Два программиста: - Ко мне вчера чувак приходил, сервак сломал. - Он что хакер? - Нет, мудак! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Послесловие:
Предлагаем обменяться ссылками с сайтами компьютерной тематики. Разместите нашу ссылку у себя на сайте и пришлите письмо с адресом страницы на которой размещена наша ссылка и кодом своей ссылки. После проверки модератором мы добавим Ваш код на свой сайт. Код нашей ссылки: <a href="http://www.excode.ru" >ExCode.ru - программирование на высоком уровне: программы, статьи, исходники, компоненты</a> Код нашего банера (88x31): <a href=http://www.excode.ru/><img src=http://www.excode.ru/excode.gif width=88 height=31 border=0 alt="ExCode.ru - программирование на высоком уровне: программы, статьи, исходники, компоненты"></a> Спасибо за внимание! |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Subscribe.Ru
Поддержка подписчиков Другие рассылки этой тематики Другие рассылки этого автора |
Подписан адрес:
Код этой рассылки: comp.soft.prog.excode |
Отписаться
Вспомнить пароль |
В избранное | ||