FreeBASIC в России

   

 Главная   Исходники   Русскоязычный форум   Полезные файлы   Пользователи   Поиск

 

 FB Wiki   Уроки   Скачать FreeBASIC   Проекты   Ссылки   Загрузить   Каталог ссылок

 
 

 Замечания и предложения по работе сайта оставляйте здесь.

Сейчас на сайте:

Вы вошли как: Guest   Регистрация   

Логин:     Пароль:     

Создай бесплатно WebMoney кошелёк на своём мобильном всего за 5 минут

 

Делаем dll своими руками

Хэндл окна

Графические средства языка

Точка пересечения отрезков

Окна без рамки

Физика поведения ядра

Win32 API Введение

►Урок 1 Win32 API

►Урок 2 Win32 API

►Урок 3 Win32 API

►Урок 4 Win32 API

►Урок 5 Win32 API

►Урок 6 Win32 API

►Урок 7 Win32 API

►Урок 8 Win32 API

►Урок 9 Win32 API

►Урок 10 Win32 API

►Урок 11 Win32 API

►Урок 12 Win32 API

►Урок 13 Win32 API

►Урок 14 Win32 API

►Урок 15 Win32 API

►Урок 16 Win32 API

►Урок 17 Win32 API

►Урок 18 Win32 API

►Урок 19 Win32 API

►Урок 20 Win32 API

►Урок 21 Win32 API

►Урок 22 Win32 API

►Урок 23 Win32 API

►Урок 24 Win32 API

Ассоциация файлов

Определить OS

Выводит имя компьютера

 

 

 

Win32 API. Урок 8. Меню.

Опытом поделился и оптимизировал под FreeBASIC:   15.01.2011

 

Реклама:

чугунные банные печи для русской бани печки для бани купить печи для бани для сауны

 

В этом туториале мы научимся, как вставить в наше окно меню.

Теория:

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

Короче говоря, первые два пункта меню должны быть "File" и "Edit", а последний - "Help". Вы можете вставить ваши собственные пункты между "Edit" и "Help".
Если пункт меню вызывает диалоговое окно, вам нужно заканчивать название пункта эллипсисом (...).

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

Вы можете писать файлы ресурсов, используя любой текстовый редактор. Они состоят из набора фраз, определяющих внешний вид и другие атрибуты ресурсов, используемых в программе. Хотя вы можете писать файлы ресурсов в текстовом редакторе, это довольно тяжело. Лучшей альтернативой является использование редактора ресурсов, который позволит вам визуально создавать дизайн ваших ресурсов. редакторы ресурсов обычно входят в пакет с компиляторами, такими как Visual C++, Borland C++ и т.д.

Вы описываете ресурс меню примерно так:

MyMenu MENU
{
[menu list here]
}

Си-программисты могут заметить, что это похоже на объявление структуры. MyMenu - это имя меню, за ним следует ключевое слово MENU и список пунктов меню, заключенный в фигурные скобки. Вместо них вы можете использовать BEGIN и END. Этот вариант больше понравится программистам на Паскале.

Список меню включает в себя выражения 'MENUITEM' или 'POPUP'.

'MENUITEM' определяет пункт меню, который не является подменю. Его синтаксис следующий:

MENUITEM "&text", ID [,options]

Выражение начинается ключевым словом 'MENUITEM', за который следует текст, который будет отображаться. Обратите внимание на амперсанд. Его действие заключается в том, что следующий за ним символ будет подчеркнут. Затем идет строка в качестве ID пункта меню. ID - это номер, который будет использоваться для обозначения пункта меню в сообщении, посылаемое процедуре окно, когда этот пункт меню будет выбран. Каждое ID должно быть уникальным.

Опции опциональны. Доступны следующие опции:

• *GRAYED - пункт меню неактивен, и он не генерирует сообщение WM_COMMAND. Текст серого цвета.
• *INACTIVE - пункт меню неактивен, и он не генерирует сообщение WM_COMMAND. Текст отображается нормально.
• *MENUBREAK - этот пункт меню и последующие пункты отображаются после новой линии меню.
• *HELP - этот пункт меню и последующие пункты выравнены по правой стороне.


Вы можете использовать одну из вышеописанных опций или комбинировать их оператором "or". Учтите, что 'INACTIVE' и 'GRAYED' не могут комбинироваться вместе. Выражение 'POPUP' имеет следующий синтаксис:

POPUP "&text" [,options]
{
[menu list]
}

Выражение 'POPUP' определяет пункт меню, при выборе которого выпадает список пунктов в маленьком popup-окне. Список меню может быть выражением 'MENUITEM' или 'POPUP'. Есть специальный вид выражения 'MENUITEM' - 'MENUITEM SEPARATOR', который отрисовывает горизонтальную линию в popup-окне.

Последний шаг - это ссылка на ваш скрипт ресурса меню в программе.

Вы можете сделать это в двух разных местах.

• В члене lpszMenuName структуры WNDCLASSEX. Скажем, если у вас было меню под названием "FirstMenu", вы можете присоединить меню к вашему окну следующим образом:

wc.lpszMenuName = @"FirstMenu"

• *С помощью параметра-хэндла меню в функции CreateWindowEx:

dim shared hMenu as HMENU
...
...
hMenu = LoadMenu(hInst, "FirstMenu") ' получим хэндл меню
hwnd = CreateWindowEx _
(NULL, _ ' дополнительные стили
"SimpleWinClass", _
@AppName, _
WS_OVERLAPPEDWINDOW, _
CW_USEDEFAULT, _ ' X
CW_USEDEFAULT, _
CW_USEDEFAULT, _
CW_USEDEFAULT, _
NULL, _
hMenu, _
hInst, _ '
NULL)

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

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

Когда пользователь выберет пункт меню, процедура окна получит сообщение WM_COMMAND. Нижнее слово wParam'а содержит ID выбранного пункта меню.

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

Пример:

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

файл menu.bas

Скопировать данный код в буфер обмена

файл menu.bi

Скопировать данный код в буфер обмена

файл menu.rc

Скопировать данный код в буфер обмена


компилировать:
fbc -s gui menu.rc menu.bas

Анализ:

Давайте сначала проанализируем файл menu.bi.

#define IDM_TEST 32000
#define IDM_HELLO 32001
#define IDM_GOODBYE 32002
#define IDM_EXIT 32003

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

ну а теперь файл ресурсов menu.rc

FirstMenu MENU

Определите ваше меню ключевым словом 'MENU'.

POPUP "&PopUp"
{
MENUITEM "&Say Hello",IDM_HELLO
MENUITEM "Say &GoodBye", IDM_GOODBYE
MENUITEM SEPARATOR
MENUITEM "E&xit",IDM_EXIT
}

Определите popup-меню с четырьмя пунктами меню, третье - это сепаратор.

MENUITEM "&Test", IDM_TEST

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

Далее мы изучим исходный код.

case WM_COMMAND
select case loword(wParam) ' читаем нижнее слово из wParam
case IDM_TEST
MessageBox(NULL,"You selected Test menu item",@AppName,MB_OK)
case IDM_HELLO
MessageBox(NULL,"Hello, my friend", @AppName,MB_OK)
case IDM_GOODBYE
MessageBox(NULL,"See you again", @AppName, MB_OK)
case IDM_EXIT
DestroyWindow(hWnd)

В процедуре окна мы обрабатываем сообщение WM_COMMAND. Когда пользователь выбирает пункт меню, его ID посылается процедуре окна в нижнем слове wparam'а вместе с сообщением WM_COMMAND. мы сравниваем значение в wparam с ID пунктов меню, определенными ранее, и поступаем соответствующим образом. В первых трех случаях, когда пользователь выбирает 'Test', 'Say Hello и 'Say GoodBye', мы отображаем текстовую строку в messagebox'е.
Если пользователь выбирает пункт 'Exit', мы вызываем DestroyWindow с хэндлом нашего окна в качестве его параметра, которое закрывает наше окно.

Как вы можете видеть, указание имени меню в классе окна довольно просто и прямолинейно. Тем не менее, вы также можете использовать альтернативный метод

Файл ресурсов такой же. Есть небольшие изменения в исходнике,
которые я покажу ниже.

Скопировать данный код в буфер обмена

анализ

dim hMenu as HMENU

hMenu = LoadMenu(hInst, "FirstMenu") '
hwnd = CreateWindowEx _
(NULL, _
ClassName, _
AppName, _
WS_OVERLAPPEDWINDOW, _
CW_USEDEFAULT, _
CW_USEDEFAULT, _
CW_USEDEFAULT, _
CW_USEDEFAULT, _
NULL, _
hMenu, _
hInst, _
NULL)

определим переменную типа HMENU, чтобы сохранить хэндл нашего меню.

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

[C] Iczelion, пер. Aquila.

 

 

Прокомментировать

Ваше имя:  

Ваш e-mail:  

Сообщение:



Введите код: 

 

 

   Спасибо можно сказать, посетив любую ссылку:

 

 

© 2010-2012

DEPOzit (Попов Денис Владимирович)

WebMoney кошелёк: WMID#302963000004

ICQ:279786014 или R549103331586   Z116647355686