kvv's home

Форма входа

Категории раздела

Лекции [14]
Разное [4]
Статьи на тему WM, не попавшие в лекции по разным причинам.

Поиск

Каталог статей

Главная » Статьи » Программирование под Windows Mobile » Лекции

Часть 4. продолжение. Работа с меню.

Работа с меню.


Меню в Windows Mobile состоит из двух частей. Toolbar и выпадающие меню. Это похоже на меню win32 приложений, только поставленное с ног на голову.

Toolbar представляет собой меню верхнего уровня, а выпадающие меню – систему меню нижнего уровня.


Для WM5 и WM6 в Toolbar-е должно быть два пункта меню, тогда они автоматически связываются с двумя аппаратными кнопками устройства. Для WM2003 пунктов в toolbar может быть больше, но все-же стоит придерживаться правила двух кнопок.


У кнопок также могут быть картинки, но для WM5 и выше, в тулбаре должны быть только текстовые кнопки.


Как было скзано выше, меню создается с помощью функции SHCreateMenuBar на основе файла описания меню.



Рассмотрим описание toolbar-а в файле ресурсов:


IDR_MENU SHMENUBAR DISCARDABLE

BEGIN

IDR_MENU,

2,


I_IMAGENONE, IDM_OK, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE,
IDS_OK, 0, NOMENU,


I_IMAGENONE, IDM_MENU, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE,
IDS_MENU, 0, 0,

END


Первая строка – ID меню, вторая – количество кнопок тулбара.

Далее идут описания кнопок. Первый параметр – ID картинки кнопки, второй – ID команды кнопки, третий – состояние кнопки (активно/запрещено), четвертый – стиль кнопки (кнопка или подменю), пятый – ID текста кнопки, далее неиспользуемый параметр и последний – порядковый номер подменю для кнопки или NOMENU, если меню нет.


Подменю описывается следующим стандартным образом:


IDR_MENU MENU DISCARDABLE

BEGIN

POPUP "Menu"
BEGIN
MENUITEM "Run Dialog", IDM_MENU_DIALOG
END

END



Константы IDR_MENU, IDM_OK, IDM_MENU, IDM_MENU_DIALOG представляют собой числовые константы и описываются в файле resources.h.
Константы IDS_OK, IDS_MENU представляют собой текстовые строки и описываются в rc файле:

STRINGTABLE 
BEGIN
 IDS_OK "Оk"
 IDS_MENU "Меню"
END

Мы видим, что описание меню ничем не отличается от описания меню для Win32 приложений. Так же видно, что меню имеет тот же ID, что и тулбар. Так осуществляется связь между тулбаром и меню.

В реальном прилложении это выглядить так:



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

switch (message)

{

case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)

{

case IDM_MENU_DIALOG:
DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
break;

...


Динамическое добавление пунктов меню.

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

Делается это следующим кодом:


// получим хендл подменю для второй кнопки тулбара

HMENU g_hSubMenu = (HMENU)::SendMessage(

g_hWndMenuBar,
SHCMBM_GETSUBMENU,
(WPARAM)0,
(LPARAM)IDM_MENU);

// вставим пункт меню после пункта с командой IDM_MENU_DIALOG

::InsertMenu(g_hSubMenu,
IDM_MENU_DIALOG,
MF_BYCOMMAND,
IDM_MENU_ITEM1,
L"MenuItem1");


Вот что получается в результате:




Изменение текста кнопки Toolbar-a


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

Кнопка тулбара описывается следующей структурой:

typedef struct {

UINT cbSize; - размер структуры
DWORD dwMask; - маска
int idCommand; - Id команды меню
int iImage; - Номер изображения из ImageList
BYTE fsState; - маска состояний
BYTE fsStyle; - маска стиля
WORD cx; - смещение текста от начала кнопки
DWORD lParam; - параметр идентификации кнопки (команда кнопки)
LPTSTR pszText; - указатель текст кнопки
int cchText; - длина текста
} TBBUTTONINFOA

Модифицируя эти поля можно менять параметры кнопок.


Следующий код меняет текст первой кнопки:

TCHAR szText[100];

lstrcpy(szText,L"Text");


TBBUTTONINFO tbi;

ZeroMemory(&tbi,sizeof(tbi));
tbi.cbSize = sizeof(tbi);

tbi.pszText = szText;

tbi.cchText = lstrlen(szText)*sizeof(TCHAR);

tbi.dwMask = TBIF_TEXT | TBIF_BYINDEX;


::SendMessage(g_hWndMenuBar, TB_SETBUTTONINFO, (WPARAM)0, (LPARAM)&tbi);


Результат:




Кстати, этот код не будет собираться под PPC2003 SDK, в нем не определен флаг TBIF_BYINDEX.
В этом случае к кнопке можно обращаться не по индексу а по ID, передав его в качестве параметра WPARAM в SendMessage.

Категория: Лекции | Добавил: kvv (19.09.2007) | Автор: Владимр Кошелев E W
Просмотров: 3568 | Комментарии: 6 | Рейтинг: 5.0/2
Всего комментариев: 6
6 CaussyCax  
0
Наш сайт создан для Вашего удовольствия, здесь Вы можете расслабиться, отдохнуть не только душой, но и телом, все самые мыслимые и не мыслимые удовольствия исполнят наши элитные индивидуалки,
Заходим сюда, звоним http://tinyurl.com/6aoezad
Наслаждаемся ))))
Вас ждет масса незабываемых впечатлений и ощущений )))

Вебмастера, кто желает хорошо зарабатывать, участвуем в партнерской программе,
до 60 центов за 1 клик http://tinyurl.com/5r2vr3w

5 CaussyCax  
0
Наш сайт создан для Вашего удовольствия, здесь Вы можете расслабиться, отдохнуть не только душой, но и телом, все самые мыслимые и не мыслимые удовольствия исполнят наши элитные индивидуалки,
Заходим сюда, звоним http://tinyurl.com/6aoezad
Наслаждаемся ))))
Вас ждет масса незабываемых впечатлений и ощущений )))

Вебмастера, кто желает хорошо зарабатывать, участвуем в партнерской программе,
до 60 центов за 1 клик http://tinyurl.com/5r2vr3w

4 Kalmar  
0
Спасибо за пояснение, как менять текст меню в тулбаре! Теперь избавлюсь от перезапуска программы при смене языка!

3 YouROK  
0
Кто нибудь пробывал сделать то что написанно в пустом проекте, у меня не получилось,
знаний работы с меню у меня нет, попробывал сделать через ресурсы как написанно, ошибка, откуда берется IDM_Menu(OK).
Опиши работу с меню на чистом проекте, тогда было бы все понятно.

2 kvv  
0
Почему-то работа с меню под PPC вызывает трудности у многих, особенно у тех, кто начал писать под WM недавно.
На форумах один из топовых вопросов - как создать/добавить мое меню. =) Хотя на самом деле, эта штука довольно проста, просто не совсем качественно описана в документации.

1 Студент с ноутбуком  
0
все доступно и понятно...автору большое спасибо

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Друзья сайта

  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Облако тэгов