Icon в контекстном меню

Тема в разделе "WASM.BEGINNERS", создана пользователем E.N.D., 17 май 2023.

  1. E.N.D.

    E.N.D. New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2020
    Сообщения:
    23
    Помогите разобраться, не могу добавить Icon к пункту меню "Proba 2"
    Код (ASM):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4.  
    5. include C:\masm32\include\windows.inc
    6. include C:\masm32\include\user32.inc
    7. include C:\masm32\include\kernel32.inc
    8. includelib C:\masm32\lib\user32.lib
    9. includelib C:\masm32\lib\kernel32.lib
    10. IDC_ICON1    = 500
    11. IDC_ICON2    = 501
    12.  
    13. WndProc proto :DWORD,:DWORD,:DWORD,:DWORD
    14. ;include        data.inc
    15.  
    16. .data
    17. MenuName     db 'M',0
    18. szMenuTest1    db "Proba 1",0
    19. szMenuTest2    db "Proba 2",0
    20.  
    21. .data?
    22. hMe     dd ?
    23.  
    24.  
    25. MenuII    MENUITEMINFO <>
    26. MenuII2    MENUITEMINFO <>
    27.  
    28. .code
    29. start:
    30.  
    31.     invoke  GetModuleHandle, NULL
    32.     invoke  DialogBoxParam, eax, 50, NULL, offset WndProc, NULL
    33. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    34.     LOCAL   t_Po:POINT
    35.     .if uMsg==WM_CLOSE
    36. ex:     invoke ExitProcess, NULL
    37.     .elseif uMsg==WM_COMMAND
    38.         .if wParam==71
    39.             invoke MessageBox, hWnd, 0, 0, 0
    40.  
    41.         .elseif wParam==72
    42.             invoke MessageBeep, 0
    43.  
    44.     .elseif wParam==80
    45.             .if MenuII.fState==MFS_UNCHECKED      
    46.         mov    MenuII.fState, MFS_CHECKED
    47.         invoke     SetMenuItemInfo, hMe, 80, 0, addr MenuII
    48.         invoke     DrawMenuBar, hMe
    49.         .else
    50.         mov    MenuII.fState, MFS_UNCHECKED
    51.         invoke     SetMenuItemInfo, hMe, 80,  0, addr MenuII
    52.         invoke     DrawMenuBar, hMe
    53.         .endif
    54.  
    55.         .elseif wParam==73
    56.             jmp   ex
    57.         .endif
    58.  
    59.     .elseif uMsg==WM_INITDIALOG
    60.         invoke GetModuleHandle, NULL
    61.         invoke LoadMenu, eax, addr MenuName
    62.         mov    hMe, eax
    63.  
    64. mov    MenuII.cbSize, sizeof MENUITEMINFO
    65. mov    MenuII.fMask, MIIM_STRING OR MIIM_FTYPE OR MIIM_STATE OR MIIM_ID
    66. mov    MenuII.fType, MFT_STRING
    67. mov    MenuII.fState, MFS_UNCHECKED                ; OR MFS_DISABLED
    68. mov    MenuII.wID, 80
    69. mov    MenuII.hSubMenu, 0
    70. mov    MenuII.hbmpChecked, 0
    71. mov    MenuII.hbmpUnchecked, 0
    72. mov    MenuII.dwItemData, 0
    73. mov    MenuII.dwTypeData, offset szMenuTest1
    74. mov    MenuII.cch, 7
    75. invoke    InsertMenuItem, hMe, 72, 0, addr MenuII
    76.  
    77. invoke  GetModuleHandle,0
    78. ;invoke LoadIcon, eax, IDC_ICON1
    79. ;mov     hIcon1, eax
    80.  
    81. invoke LoadImage, eax, IDC_ICON2, IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR
    82.  
    83. mov    MenuII2.cbSize, sizeof MENUITEMINFO
    84. mov    MenuII2.fMask, MIIM_STRING + MIIM_FTYPE + MIIM_STATE + MIIM_ID ;+ MIIM_TYPE ;+ MIIM_BITMAP ;+ MIIM_CHECKMARKS
    85. mov    MenuII2.fType, MFT_STRING                 ;+ MFT_RADIOCHECK
    86. mov    MenuII2.fState, MFS_ENABLED ;or MFS_CHECKED        ; OR MFS_DISABLED MFS_UNCHECKED
    87. mov    MenuII2.wID, 81
    88. mov    MenuII2.hSubMenu, 0
    89.  
    90. mov    MenuII2.hbmpChecked, 0;eax
    91. mov    MenuII2.hbmpUnchecked, 0;eax
    92. mov    MenuII2.dwItemData, 0
    93. mov    MenuII2.dwTypeData, offset szMenuTest2
    94. mov    MenuII2.cch, 7
    95. ;mov    MenuII2.hbmpItem, eax
    96.  
    97. invoke    InsertMenuItem, hMe, 72, 0, addr MenuII2
    98.  
    99.  
    100.     .elseif uMsg==WM_RBUTTONDOWN
    101.         invoke GetCursorPos, addr t_Po
    102.         invoke GetSubMenu, hMe, NULL
    103.      
    104.     invoke TrackPopupMenu, eax, TPM_LEFTALIGN, t_Po.x, t_Po.y, NULL, hWnd, NULL
    105.  
    106.     .elseif
    107.         mov    eax, FALSE
    108.         ret
    109.     .endif
    110.         mov    eax, TRUE
    111.         ret
    112. WndProc endp
    113. end start
    114.  
    Код (Text):
    1.  
    2. #define IDD_DLG1 50
    3. #define M1 71
    4. #define M2 72
    5. #define M3 73
    6. #include "C:/masm32/include/RESOURCE.H"
    7.  
    8. #define IDC_ICON1    500
    9. #define IDC_ICON2    501
    10.  
    11. IDC_ICON1 ICON "icon1.ico"
    12. IDC_ICON2 ICON "icon2.ico"
    13.  
    14.  
    15. IDD_DLG1 DIALOGEX 6,6,244,134
    16. CAPTION "IDD_DLG"
    17. FONT 8,"MS Sans Serif",0,0,0
    18. STYLE WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|DS_CENTER
    19. BEGIN
    20. END
    21. M MENU
    22. BEGIN
    23.   POPUP "A"
    24.   BEGIN
    25.     MENUITEM "MessageBox",M1
    26.     MENUITEM "MessageBeep",M2
    27.     MENUITEM SEPARATOR
    28.     MENUITEM "Exit",M3
    29.   END
    30. END
     

    Вложения:

    • res.rar
      Размер файла:
      1 КБ
      Просмотров:
      120
    Последнее редактирование: 17 май 2023
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    В винапишном меню нет такого функционала, как иконки в пунктах меню. Office-like менюшки надо рисовать самому.
     
  3. E.N.D.

    E.N.D. New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2020
    Сообщения:
    23
    Ок, понятно спасибо!
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Нет. Вызывается SetMenuItemInfo в последнем параметре передается указатель на структуру MENUITEMINFO, поле hbmpItem задает иконку пункта меню (при установленном флаге MIIM_BITMAP).
     
  5. E.N.D.

    E.N.D. New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2020
    Сообщения:
    23
    хочу уточнить мы об одном и том же говорим? Должно получиться так
    Я добавляю новый пункт в меню с помощью InsertMenuItem, где в аргументах также имеется структура MENUITEMINFO, разницы с SetMenuItemInfo думаю быть не должно? Или же есть нюансы?
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    E.N.D., картинка не грузится. Я не вижу в коде установку флага MIIM_BITMAP и заполнение поля hbmpItem хендлом битмапа.

    UPD: Да я об этом же говорю (картинку глянул через HTML код страницы)
     
    E.N.D. нравится это.
  7. E.N.D.

    E.N.D. New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2020
    Сообщения:
    23
    Победил это меню )) Формат ICO воспринимать не хочет, а с BMP работает норм, спасибо за совет! :dance2:
     
  8. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Там вроде 32 битные с альфаканалом будут работать (не проверял).
     
  9. E.N.D.

    E.N.D. New Member

    Публикаций:
    0
    Регистрация:
    17 июн 2020
    Сообщения:
    23
    Ещё дополню тему, параметрами hbmpChecked и hbmpUnchecked структуры MENUITEMINFO, можно управлять иконками пунктов меню, к примеру как установить или убрать галочку. Установив параметры MIIM_CHECKMARKS + MIIM_STATE и убрав MIIM_BITMAP и hbmpItem. Может кому пригодится