Как работать с GetMenuItemInfo?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.220] |
|
|
MSDN Library
FAQ раздела
Поиск по разделу
Как правильно задавать вопросы
Как работать с GetMenuItemInfo?
|
|
|
|
|
Пробовал так:
![]() ![]() function GetMenuIDName(itemID:integer):boolean; var Buffer: array[0..50] of Char; begin MII.cbSize := SizeOf(MENUITEMINFO); MII.fMask := MIIM_STRING or MIIM_TYPE; MII.fType := MFT_STRING or MFT_OWNERDRAW; MII.dwTypeData := buffer; MII.cch := 1023; result:=false; If GetMenuItemInfo(Menu,itemID,true,MII) then begin result:=true; ItemName:=MII.dwTypeData; end; end; Но вроде не работает. Где ошибка? Заранее спасибо. |
|
Сообщ.
#2
,
|
|
|
|
Цитата Nikfel @ Но вроде не работает вроде или не работает? откуда ты Menu берешь? оно точно создано? что возвращает эта функция? если false, то что говорит GetLastError? |
|
Сообщ.
#3
,
|
|
|
|
А что именно не работает ?
|
|
Сообщ.
#4
,
|
|
|
|
GetMenuItemInfo всегда возвращает False и это значит что данные функция не получает. Состояние переменной Menu<>0. Я считаю что я просто не правильно записал.
Вот из C++: ![]() ![]() mii.fMask = MIIM_SUBMENU; // информация, которую получаем GetMenuItemInfo(hmenuBar, IDM_CHARACTER, FALSE, &mii); Я вот никак не пойму что за символ & в C++? На Delphi пробовал задать через символ @, но не сработало. В чем же моя ошибка не пойму ни как? Мне надо просто получить информацию о пункте меню, т.е. есть ли выпадающее меню и текст в пункте меню. |
|
Сообщ.
#5
,
|
|
|
|
Цитата Nikfel @ MII.fMask := MIIM_STRING or MIIM_TYPE; Это неверное сочетание флагов, нужно юзать либо просто MIIM_TYPE (для совместимости с Win95), либо MIIM_STRING or MIIM_FTYPE Цитата Nikfel @ If GetMenuItemInfo(Menu,itemID,true,MII) then begin Если itemID - идентификатор пункта меню (TMenuItem.Command), то 3-й параметр д.б. false, а если это порядковый номер (индекс TMenuItem.MenuIndex) пункта в выпадающем меню, то true Цитата Nikfel @ На Delphi пробовал задать через символ @, но не сработало В дельфи последний параметр определен как var, поэтому никаких @ задавать не нужно Добавлено PS: Цитата Nikfel @ MII.fType := MFT_STRING or MFT_OWNERDRAW; fType в GetMenuItemInfo является вых.параметром, поэтому задавать его самому бесполезно Цитата Nikfel @ var Buffer: array[0..50] of Char; ... MII.cch := 1023; Обманывать не хорошо Нужно задавать cch = реальному размеру буфера SizeOf(buffer) |
|
Сообщ.
#6
,
|
|
|
|
Спасибо. Теперь вроде заработало, но только почему-то не получает текст пункта меню?
|
|
Сообщ.
#7
,
|
|
|
|
Цитата Nikfel @ Теперь вроде заработало, но только почему-то не получает текст пункта меню? Смотри возвращаемый тип fType - текст возвращается только для типа MII.fType = MFT_STRING, а для MFT_SEPARATOR или MFT_OWNERDRAW - нет |
|
Сообщ.
#8
,
|
|
|
|
Спасибо. Теперь все понятно. Значит для типа MFT_OWNERDRAW никак нельзя получить текст пункта меню.
|
|
Сообщ.
#9
,
|
|
|
|
Цитата Nikfel @ Значит для типа MFT_OWNERDRAW никак нельзя получить текст пункта меню Да, т.к. при MFT_OWNERDRAW текст меню отрисовывается самим приложением и в ItemInfo не хранится |
|
Сообщ.
#10
,
|
|
|
|
А вот как получить текст пункта меню, если не MFT_OWNERDRAW? Пробовал так, но не вышло:
![]() ![]() var ItemName:pchar; function GetMenuIDName(Menu_:HMenu; INDEX:integer):boolean; var Buffer: array[0..50] of Char; begin MII.cbSize := SizeOf(MENUITEMINFO); MII.fMask := MIIM_FTYPE or miim_submenu or miim_string; MII.dwTypeData := buffer; MII.cch := sizeof(buffer); result:=false; If GetMenuItemInfo(Menu_,INDEX,true,MII) then begin result:=true; ItemName:=MII.dwTypeData; end; end; |
|
Сообщ.
#11
,
|
|
|
|
Цитата Nikfel @ var ItemName:pchar; ... ItemName:=MII.dwTypeData; Так делать нельзя, т.к. ItemName:pChar указывает на локальную переменную buffer, которая становится невалидной после выхода из функции (затирается другими данными при операциях со стеком). Нужно использовать ItemName:string ![]() ![]() function GetMenuItemName(Menu_:HMenu; INDEX:integer):string; var Buffer: array[0..63] of Char; MII:MENUITEMINFO; begin MII.cbSize := SizeOf(MENUITEMINFO); MII.fMask := MIIM_FTYPE or MIIM_STRING; MII.dwTypeData := Buffer; MII.cch := sizeof(Buffer); If GetMenuItemInfo(Menu_,INDEX,true,MII) and (MII.fType and MFT_STRING <> 0) then Result:=MII.dwTypeData else Result:=''; end; |
|
Сообщ.
#12
,
|
|
|
|
Большое спасибо. Теперь всё ясно.
|