Windows Mobile: Main menu

Тема в разделе "WASM.WIN32", создана пользователем _DEN_, 5 мар 2009.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Совершенно непонятная хрень творится с меню.

    Главное меню которое с двумя кнопками - это на самом деле тулбар. Создается он следующим образом:

    Код (Text):
    1. SHMENUBARINFO menubar_info = {0};
    2. menubar_info.cbSize = sizeof(menubar_info);
    3. menubar_info.hwndParent = wnd;
    4. menubar_info.dwFlags = SHCMBF_HMENU;
    5. menubar_info.nToolBarId = index;
    6. menubar_info.hInstRes = GetModuleHandle(0);
    7. SHCreateMenuBar(&menubar_info);
    Все подменю в этом "меню" это типа уже честные меню. Но вот как их получить - в упор не понимаю.
    Нагуглил кучу примеров, все они сводятся вот к чему:

    Код (Text):
    1. HWND menu_wnd = SHFindMenuBar(wnd);
    2. HMENU menu = (HMENU)SendMessage(menu_wnd, SHCMBM_GETSUBMENU, 0, IDM_MENU_ЧЕГОНИБУДЬ);
    Однако что я только не пробую туда подставить, menu у меня всегда равен нулю... И SHCMBM_GETSUBMENU, и SHCMBM_GETMENU и все идентификаторы - один хрен не вытягивает... :dntknw:
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Дико непонятная хрень.

    В примерах, идущих со студией, в файле ресурсов есть дополнительная хрень вот такого вида:

    Код (Text):
    1. IDM_MAIN_MENU SHMENUBAR DISCARDABLE
    2. BEGIN
    3.     IDM_MAIN_MENU, 2,
    4.     I_IMAGENONE, IDM_MAIN_MENUITEM2, TBSTATE_ENABLED,
    5.     TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MAIN_MENUITEM2, 0, 0,
    6.     I_IMAGENONE, IDM_MAIN_MENUITEM3, TBSTATE_ENABLED,
    7.     TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MAIN_MENUITEM3, 0, 1,
    8. END
    9.  
    10. IDM_POPUPMENU SHMENUBAR DISCARDABLE
    11. BEGIN
    12.     IDM_POPUPMENU, 1,
    13.     I_IMAGENONE, IDM_FOODUMMYPOPUP1, TBSTATE_ENABLED, TBSTYLE_DROPDOWN,
    14.     IDS_FOODUMMYPOPUP1, 0, 0,
    15. END
    Если открыть это в редакторе ресурсов студии, то мы увидим папку "RCDATA" и ее содержимое - бинарные поля! o_O

    Какое-то околотопикное обсуждение происходит тут:

    http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesnative/thread/06a43167-1e06-4864-9cc3-bd66330dafd3/

    Короче, походу хак на хаке и хаком погоняет...
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Патсаны, патсаны, это ваще жесть, патсаны...)

    Короче есть походу описание тулбара, о котором ничего не знает визуальный редактор студии, половину работы пришлось делать руками, редактируя .rc и resource.h. Жесть, микросовтовское быдло. Испытания показали, что вот как надо делать (каменты фскопках):

    Код (Text):
    1. STRINGTABLE DISCARDABLE
    2. BEGIN
    3.     IDS_MENU_EMPTY          ""
    4.     IDS_MENU_MENU           "Menu"
    5.     IDS_MENU_LOGOFF         "Log off"
    6.     IDS_MENU_PAUSE          "Pause"
    7. END
    8.  
    9. IDM_LOGIN SHMENUBAR DISCARDABLE
    10. BEGIN
    11.     IDM_LOGIN (id меню), 2 (количество кнопок),
    12.     I_IMAGENONE, IDM_MENU_BUTTONLEFT (id кнопки, нужно прописать в resource.h руками), TBSTATE_ENABLED,
    13.     TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE (стили. тут важно что это батон), IDS_MENU_EMPTY (id строки, которая будет написана на кнопке, см. выше), 0, NOMENU (это значит что кнопка дает WM_COMMAND, а не открывает popup меню),
    14.     I_IMAGENONE, IDM_MENU_BUTTONRIGHT (id кнопки, нужно прописать в resource.h руками), TBSTATE_ENABLED,
    15.     TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE (стили. тут важно что это дропдаун), IDS_MENU_MENU, 0, 1 (это значит что по кнопке открывается popup меню),
    16. END
    Вот такая жесть, патсаны. Особое веселье заключается в том, что после редактирования ресурсов руками 9-я студия при попытке их зарефрешить частенько крешится.


    После того, как это готово, при создании меню кое-чо поменяется. А именно:

    Код (Text):
    1. SHMENUBARINFO menubar_info = {0};
    2. menubar_info.cbSize = sizeof(menubar_info);
    3. menubar_info.hwndParent = wnd;
    4.  
    5. // Эта строка не нужна, dwFlags теперь не должен содержать SHCMBF_HMENU
    6. // menubar_info.dwFlags = SHCMBF_HMENU;
    7.  
    8. menubar_info.nToolBarId = index;
    9. menubar_info.hInstRes = GetModuleHandle(0);
    10. SHCreateMenuBar(&menubar_info);
    И теперь для получения HMENU той меню, которая выскакивает по кнопке, делаем:

    Код (Text):
    1. HWND menu_wnd = SHFindMenuBar(wnd);
    2. HMENU menu = (HMENU)SendMessage(menu_wnd, SHCMBM_GETSUBMENU, 0, IDM_MENU_BUTTONLEFT); // Или IDM_MENU_BUTTONRIGHT
    Вот такая вот ерунда, патсаны.