ФлеймФорумПрограммирование

win api страдания. Как меню(MENUINFO) задать MNS_NOTIFYBYPOS ?

#0
(Правка: 12:02) 11:03, 5 ноя 2025

Виндовс 10.
Я меню для окна создаю , через section '.rsrc' resource.
То есть не могу просто так получить хэндл меню.

Но зато в wndproc WM_CREATE я делаю так.

hMenu=GetMenu(hwnd); //получил хэндл меню и он не NULL.
          if (hMenu!=NULL)
          {
                  int iCount;
                  iCount=GetMenuItemCount(hMenu); //я получил число элементов меню и оно верное.
                  cout << "Menu Item - " << iCount << endl;
          } 
//но вот этот код даёт пустую структуру.
MENUINFO info;
info.cbSize=7*4;//28 bytes. правильный размер и это точно. Даже в нутри GetMenuInfo есть проверка cbSize с 28.
info.fMask = MIM_MENUDATA;
GetMenuInfo( hMenu, &info ); //почему пусто ? eax=1, типа true, значит всё ок по докам msdn.
GetLastError();//вернул ноль. Типа нет ошибок.

Мне нужна эта структура, чтобы я ей выставил dwStyle = MNS_NOTIFYBYPOS.
И сделал SetMenuInfo( hMenu, &info );

typedef struct tagMENUINFO {
  DWORD     cbSize;
  DWORD     fMask;
  DWORD     dwStyle;
  UINT      cyMax;
  HBRUSH    hbrBack;
  DWORD     dwContextHelpID;
  ULONG_PTR dwMenuData;
} MENUINFO, *LPMENUINFO;

Без MNS_NOTIFYBYPOS не работает WM_MENUCOMMAND в wndproc.

#1
11:43, 5 ноя 2025

ronniko
> info.cbSize=7*4;//28 bytes
Ты до сих пор что ли пишешь в x86 режиме?

#2
11:47, 5 ноя 2025

для данной задачи пишу приложение 32 бита.
А что это преступление ? :)

#3
11:51, 5 ноя 2025

ronniko
> Я меню для окна создаю , через section '.rsrc' resource

Так где-то там же все равно проскакивает HMENU, скажем, в аргументе CreateWindow, который ты получаешь из LoadMenu. Или у тебя окно - диалог, полностью создаваемый из ресурса?

#4
(Правка: 12:08) 11:59, 5 ноя 2025

у тебя окно - диалог

нет. обычное окно .
RegisterClassEx
       
и CreateWindowEx

GetMenuInfo
https://vk.com/video520459423_456242404?t=2m4s

#5
12:27, 5 ноя 2025

ronniko
> CreateWindowEx

Ну вот перед ним и настрой свое меню. А вообще я подозреваю, что флаг MNS_NOTIFYBYPOS можно и в ресурсах где-то указать. Сейчас правда уже не помню, как там в языке ресурсов описывается.

#6
12:30, 5 ноя 2025

А вообще я подозреваю, что флаг MNS_NOTIFYBYPOS можно и в ресурсах где-то указать.

Было бы хорошо так сделать.

#7
12:40, 5 ноя 2025

Могу в в wndproc WM_CREATE делать AppendMenu и появляются новые элементы меню в окне.

#8
12:41, 5 ноя 2025

ronniko
> Было бы хорошо так сделать.

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

Так что делай перед CreateWindow, когда вызвал LoadMenu.

ФлеймФорумПрограммирование