; #########################################################################
;                                                                         ;
; Установливает для данного меню (всех подменю), заданный стиль.          ;
;                                                                         ;
; #########################################################################

HeapMnu_popup proc h_Menu :HMENU

LOCAL nHightItemCount :DWORD
LOCAL nCount          :DWORD
LOCAL hSubMenu        :HMENU    

    invoke MenuToHeap, h_Menu 
    mov nHightItemCount, $invoke (GetMenuItemCount, h_Menu)
    
    mov nCount, 0

@@: 
    mov hSubMenu, $invoke (GetSubMenu, h_Menu, nCount)
    
    .if hSubMenu
        invoke SubMenuToHeap, hSubMenu
    .endif
    
    inc nCount  
    
    mov eax, nCount
    cmp eax, nHightItemCount    
    jb  @b
    
e_t:    
    ret
HeapMnu_popup endp

; #########################################################################
;                                                                         ;
; Рекурсивная процедура установки стиля меню, перебирает все итемы в      ;
; подменю и устанавливает стиль для всех меню (выпадающих)                ;
;                                                                         ;
; #########################################################################

SubMenuToHeap proc hSubMenu:HMENU

    LOCAL nPos        :DWORD
    LOCAL LastItemID  :UINT
    LOCAL mii         :MENUITEMINFO

    invoke MenuToHeap, hSubMenu

    mov nPos, 0
    mov mii.cbSize, sizeof (MENUITEMINFO)
    mov mii.fMask, MIIM_ID or MIIM_SUBMENU
    jmp s_t

@@: 
    m2m LastItemID, mii.wID
    inc nPos

s_t:   
    invoke GetMenuItemInfo, hSubMenu, nPos, TRUE, ADDR mii
    
    mov eax, LastItemID
    
    cmp eax, mii.wID
    je @f

    .if mii.hSubMenu
    
        invoke SubMenuToHeap, mii.hSubMenu
    
    .endif

    jmp @b  
    
@@:
    ret
SubMenuToHeap endp

; #########################################################################
;                                                                         ;
; Устанвливает стиль для данного меню.                                    ;
; Возвращает предыдущий стиль.                                            ;  
;                                                                         ;
; #########################################################################

MenuToHeap proc h_Menu :HMENU

LOCAL mi    :MENUINFO    

;    invoke GetStyleMenu, h_Menu
;    cmp eax, dwStyle
;    je  e_t
;    
;    push eax                                ; сохраним предыдущий стиль
;    mov mi.cbSize, sizeof (MENUINFO)
;    mov mi.fMask, MIM_MENUDATA
;    m2m mi.dwMenuData, dwStyle
;    invoke SetMenuInfo, h_Menu, ADDR mi
;    pop eax

e_t:    
    ret
MenuToHeap endp