Совершенно непонятная хрень творится с меню. Главное меню которое с двумя кнопками - это на самом деле тулбар. Создается он следующим образом: Код (Text): SHMENUBARINFO menubar_info = {0}; menubar_info.cbSize = sizeof(menubar_info); menubar_info.hwndParent = wnd; menubar_info.dwFlags = SHCMBF_HMENU; menubar_info.nToolBarId = index; menubar_info.hInstRes = GetModuleHandle(0); SHCreateMenuBar(&menubar_info); Все подменю в этом "меню" это типа уже честные меню. Но вот как их получить - в упор не понимаю. Нагуглил кучу примеров, все они сводятся вот к чему: Код (Text): HWND menu_wnd = SHFindMenuBar(wnd); HMENU menu = (HMENU)SendMessage(menu_wnd, SHCMBM_GETSUBMENU, 0, IDM_MENU_ЧЕГОНИБУДЬ); Однако что я только не пробую туда подставить, menu у меня всегда равен нулю... И SHCMBM_GETSUBMENU, и SHCMBM_GETMENU и все идентификаторы - один хрен не вытягивает...
Дико непонятная хрень. В примерах, идущих со студией, в файле ресурсов есть дополнительная хрень вот такого вида: Код (Text): IDM_MAIN_MENU SHMENUBAR DISCARDABLE BEGIN IDM_MAIN_MENU, 2, I_IMAGENONE, IDM_MAIN_MENUITEM2, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MAIN_MENUITEM2, 0, 0, I_IMAGENONE, IDM_MAIN_MENUITEM3, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MAIN_MENUITEM3, 0, 1, END IDM_POPUPMENU SHMENUBAR DISCARDABLE BEGIN IDM_POPUPMENU, 1, I_IMAGENONE, IDM_FOODUMMYPOPUP1, TBSTATE_ENABLED, TBSTYLE_DROPDOWN, IDS_FOODUMMYPOPUP1, 0, 0, END Если открыть это в редакторе ресурсов студии, то мы увидим папку "RCDATA" и ее содержимое - бинарные поля! o_O Какое-то околотопикное обсуждение происходит тут: http://social.msdn.microsoft.com/Forums/en-US/vssmartdevicesnative/thread/06a43167-1e06-4864-9cc3-bd66330dafd3/ Короче, походу хак на хаке и хаком погоняет...
Патсаны, патсаны, это ваще жесть, патсаны...) Короче есть походу описание тулбара, о котором ничего не знает визуальный редактор студии, половину работы пришлось делать руками, редактируя .rc и resource.h. Жесть, микросовтовское быдло. Испытания показали, что вот как надо делать (каменты фскопках): Код (Text): STRINGTABLE DISCARDABLE BEGIN IDS_MENU_EMPTY "" IDS_MENU_MENU "Menu" IDS_MENU_LOGOFF "Log off" IDS_MENU_PAUSE "Pause" END IDM_LOGIN SHMENUBAR DISCARDABLE BEGIN IDM_LOGIN (id меню), 2 (количество кнопок), I_IMAGENONE, IDM_MENU_BUTTONLEFT (id кнопки, нужно прописать в resource.h руками), TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE (стили. тут важно что это батон), IDS_MENU_EMPTY (id строки, которая будет написана на кнопке, см. выше), 0, NOMENU (это значит что кнопка дает WM_COMMAND, а не открывает popup меню), I_IMAGENONE, IDM_MENU_BUTTONRIGHT (id кнопки, нужно прописать в resource.h руками), TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE (стили. тут важно что это дропдаун), IDS_MENU_MENU, 0, 1 (это значит что по кнопке открывается popup меню), END Вот такая жесть, патсаны. Особое веселье заключается в том, что после редактирования ресурсов руками 9-я студия при попытке их зарефрешить частенько крешится. После того, как это готово, при создании меню кое-чо поменяется. А именно: Код (Text): SHMENUBARINFO menubar_info = {0}; menubar_info.cbSize = sizeof(menubar_info); menubar_info.hwndParent = wnd; // Эта строка не нужна, dwFlags теперь не должен содержать SHCMBF_HMENU // menubar_info.dwFlags = SHCMBF_HMENU; menubar_info.nToolBarId = index; menubar_info.hInstRes = GetModuleHandle(0); SHCreateMenuBar(&menubar_info); И теперь для получения HMENU той меню, которая выскакивает по кнопке, делаем: Код (Text): HWND menu_wnd = SHFindMenuBar(wnd); HMENU menu = (HMENU)SendMessage(menu_wnd, SHCMBM_GETSUBMENU, 0, IDM_MENU_BUTTONLEFT); // Или IDM_MENU_BUTTONRIGHT Вот такая вот ерунда, патсаны.