Иконки в меню

Тема в разделе "WASM.BEGINNERS", создана пользователем LordBublicXIII, 12 июл 2006.

  1. LordBublicXIII

    LordBublicXIII Андрей

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    10
    3 вопроса по иконкам в меню (вообще там битмапы, просто я их так обзываю):

    1) Если я устанавливаю окну иконку 32х32 или 64х64, она уменьшается (масштабируется). А если то же самое попробовать айтему меню, картинка обрезается до 14х14. Вопрос: можно ли вставить иконку большего размера (видел такие) и как?

    2) Возможно ли прицепить иконки к "корневым" айтемам меню (типа File,Edit и т.д.)? По-моему, низззя, но всё же...

    3) Можно ли в качестве источника иконок для айтемов меню использовать ImageList? Вроде у них отдельных хэндлов нету...

    З.Ы.: Поиск в нете и МСДН не предлагать (нета нет и маленький винт:dntknw: ).
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    1. Делаем меню со стилем owner-drawn.
    В ответ на сообщение WM_MEASUREITEM задаём произвольную высоту итема.
    В ответ на WM_DRAWITEM рисуем содержимое итема: иконка + текст или всё, что угодно.

    2. Стандартное меню не обладает такими возможностями, но никто не запрещает сделать своё окно menu-bar.

    3. В MSDN всё-таки нужно искать хотя бы ответы на самые стандартные вопросы, вроде этого.

    А проще всего узнавать размер стандартного итама меню (у Вас это 14, вроде) и делать StretchBlt всем иконкам, чтобы не происходило потом обрезания. Высоту стандартной иконки можно узнать через API GetMenuCheckMarkDimensions.
     
  3. LordBublicXIII

    LordBublicXIII Андрей

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    10
    ОГ за ответ. Тока уточню:

    1. Эт значит, сабклассировать меню?

    2. Понял :).

    3. Нету МСДН :dntknw:... (30 Мб свободно на винте и и-нет по 5 мин в неделю у друга). Можно всё-таки пояснить? Я пытался в модулях Делфи ответ найти (я если что, все константы и имена процедур оттуда копаю), но ни черта не нашёл...
     
  4. BooM_ua

    BooM_ua New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    6
    Адрес:
    Ukraine
    можна с помощю XXControls
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Нет, просто установить стиль 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
     
  6. LordBublicXIII

    LordBublicXIII Андрей

    Публикаций:
    0
    Регистрация:
    12 июл 2006
    Сообщения:
    10
    ОГ, всем кто ответил. Нашёл у себя сорцы XXControls. Проанализировав, набил следующее:
    Код (Text):
    1.         ...тут создание ImageList-а...
    2.  
    3.     push RES_IMGLIST_MENU
    4.     push Handle
    5.     call LoadBitmapA
    6.  
    7.     push 0         
    8.     push eax           
    9.     push dword ptr hImageList_Menu 
    10.     call ImageList_Add     
    11.    
    12.     push dword ptr ILD_NORMAL  
    13.     push ImageNumber
    14.     push hImageList_Menu
    15.     call ImageList_GetIcon
    16.  
    17.     push eax
    18.     push eax
    19.     push MF_BYCOMMAND
    20.     push ItemNumber
    21.     push hMenu
    22.     call SetMenuItemBitmaps
    НЕ РАБОТАЕТ :dntknw:(((

    Кажется, в 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):
    1.     push ILD_NORMAL
    2.     push 5
    3.     push hImageList_Menu
    4.     call ImageList_GetIcon
    стоит
    Код (Text):
    1.     push RES_IMGLIST_MENU
    2.     push Handle
    3.     call LoadBitmapA
    и картинка, заданная в RES_IMGLIST_MENU отлично прорисовывается на форме в нескольких экземплярах. Чаво я не так сделал?