// Инициализация экземпляра
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
// ...
HMENU hMainMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDC_MAIN_MENU));
MENUINFO menuInfo = {0};
menuInfo.cbSize = sizeof(MENUINFO);
menuInfo.fMask = MIM_STYLE | MIM_APPLYTOSUBMENUS;
menuInfo.dwStyle = MNS_DRAGDROP;
SetMenuInfo(hMainMenu, &menuInfo);
SetMenu(hMainWnd, hMainMenu);
// ...
}
// Оконная процедура
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
switch(message) {
// ...
case WM_MENUGETOBJECT:
// breakpoint - молчит, как партизан
break;
}
// ...
}
Проблема с WM_MENUGETOBJECT
Столкнулся с абсолютно глупой проблемой: не могу отловить сообщение WM_MENUGETOBJECT от drag-n-drop меню. Кто-нибудь может привести рабочий пример? Ибо я перерыл пол-Интернета с нулевым результатом.
Привожу свой код:
Код:
Кроме того, отмечу, что WM_MENUDRAG приходит совершенно правильно. Будут какие-то идеи?
Спасибо всем заранее.
Кстати, что именно сделать-то хочешь?
Цитата: Нездешний
Кстати, что именно сделать-то хочешь?
Есть TabControl, в каждой вкладке открыт некий файл. Есть меню "Окно", дублирующее список открытых файлов. Нужно реализовать "перетаскивания" пунктов меню "Окно" и, соответственно, менять порядок расположения вкладок (сама операция перетаскивания должна быть в стиле, например, перетягивания пунктов "Избранного" в IE). На данный момент готово все, кроме самого перетаскивания.
Цитата: Нездешний
Насколько я понял из обрывочных сообщений на форумах, народ вызывает DoDragDrop в обработчике WM_MENUDRAG и дальше работает через COM-интерфейсы.
Да, это я читал; вопрос в том, должно ли WM_MENUGETOBJECT приходить независимо от DoDragDrop или же оно есть следствием вызова этой функции? В документации я этого, увы, не нашел.
Я бы всё же MENUINFO после инициализации cbSize заполнял вызовом GetMenuInfo, после чего накатывал бы новые параметры.