3 вопроса по иконкам в меню (вообще там битмапы, просто я их так обзываю): 1) Если я устанавливаю окну иконку 32х32 или 64х64, она уменьшается (масштабируется). А если то же самое попробовать айтему меню, картинка обрезается до 14х14. Вопрос: можно ли вставить иконку большего размера (видел такие) и как? 2) Возможно ли прицепить иконки к "корневым" айтемам меню (типа File,Edit и т.д.)? По-моему, низззя, но всё же... 3) Можно ли в качестве источника иконок для айтемов меню использовать ImageList? Вроде у них отдельных хэндлов нету... З.Ы.: Поиск в нете и МСДН не предлагать (нета нет и маленький винт ).
1. Делаем меню со стилем owner-drawn. В ответ на сообщение WM_MEASUREITEM задаём произвольную высоту итема. В ответ на WM_DRAWITEM рисуем содержимое итема: иконка + текст или всё, что угодно. 2. Стандартное меню не обладает такими возможностями, но никто не запрещает сделать своё окно menu-bar. 3. В MSDN всё-таки нужно искать хотя бы ответы на самые стандартные вопросы, вроде этого. А проще всего узнавать размер стандартного итама меню (у Вас это 14, вроде) и делать StretchBlt всем иконкам, чтобы не происходило потом обрезания. Высоту стандартной иконки можно узнать через API GetMenuCheckMarkDimensions.
ОГ за ответ. Тока уточню: 1. Эт значит, сабклассировать меню? 2. Понял . 3. Нету МСДН ... (30 Мб свободно на винте и и-нет по 5 мин в неделю у друга). Можно всё-таки пояснить? Я пытался в модулях Делфи ответ найти (я если что, все константы и имена процедур оттуда копаю), но ни черта не нашёл...
Нет, просто установить стиль MFT_OWNERDRAW нужному итему. Таким образом, меню может содержать обычные итемы и персонализированные в перемешку. Если меню создаётся по шаблону в ресурсах, этот стиль, если я правильно помню, в шаблоне указывать нельзя - его нужно будет задать потом через SetMenuItemInfo или просто "вставить" новый итем через InsertMenuItem, а в этой функции уже можно указать стиль MFT_OWNERDRAW. Короче, вот: http://windowssdk.msdn.microsoft.com/en-us/library/ms647558.aspx#_win32_Creating_Owner_Drawn_Menu_Items Тамже: http://windowssdk.msdn.microsoft.com/en-us/library/ms647558.aspx#_win32_Using_Menu_Item_Bitmaps
ОГ, всем кто ответил. Нашёл у себя сорцы XXControls. Проанализировав, набил следующее: Код (Text): ...тут создание ImageList-а... push RES_IMGLIST_MENU push Handle call LoadBitmapA push 0 push eax push dword ptr hImageList_Menu call ImageList_Add push dword ptr ILD_NORMAL push ImageNumber push hImageList_Menu call ImageList_GetIcon push eax push eax push MF_BYCOMMAND push ItemNumber push hMenu call SetMenuItemBitmaps НЕ РАБОТАЕТ ((( Кажется, в ImageList битмап всё-таки не загрузился, ибо отлаживал в таком коде: ВАРИАНТ 1: ...тут загрузка битмапа в ImageList... push ILD_NORMAL push 5 push hImageList_Menu call ImageList_GetIcon push eax call CreatePatternBrush push eax push hWnd call GetDC push eax mov ebx,eax call SelectObject push dword ptr Rect.bottom push dword ptr Rect.right push dword ptr Rect.top push dword ptr Rect.left push ebx call Rectangle push 0 push offset Rect push hWnd call InvalidateRect На форме появляется белый квадрат! ВАРИАНТ 2: тоже что и 1, но вместо Код (Text): push ILD_NORMAL push 5 push hImageList_Menu call ImageList_GetIcon стоит Код (Text): push RES_IMGLIST_MENU push Handle call LoadBitmapA и картинка, заданная в RES_IMGLIST_MENU отлично прорисовывается на форме в нескольких экземплярах. Чаво я не так сделал?