| 74 | } |
| 75 | |
| 76 | void COwnerDrawnMenuBase::AddSubMenu(CMenuHandle menu) { |
| 77 | UpdateMenu(menu); |
| 78 | auto count = menu.GetMenuItemCount(); |
| 79 | MENUITEMINFO mii = { sizeof(mii) }; |
| 80 | WCHAR text[64]; |
| 81 | for (decltype(count) i = 0; i < count; i++) { |
| 82 | mii.fMask = MIIM_TYPE | MIIM_DATA; |
| 83 | mii.fType = 0; |
| 84 | if (menu.GetMenuItemInfo(i, TRUE, &mii) && mii.fType == MFT_SEPARATOR) |
| 85 | mii.dwItemData = Separator; |
| 86 | else |
| 87 | mii.dwItemData = 0; |
| 88 | if (mii.fType & MFT_OWNERDRAW) |
| 89 | continue; |
| 90 | |
| 91 | mii.fType |= MFT_OWNERDRAW; |
| 92 | ATLVERIFY(menu.SetMenuItemInfo(i, TRUE, &mii)); |
| 93 | if (mii.dwItemData == Separator) |
| 94 | continue; |
| 95 | |
| 96 | mii.fMask = MIIM_SUBMENU | MIIM_ID; |
| 97 | if (menu.GetMenuItemInfo(i, TRUE, &mii) && mii.hSubMenu) { |
| 98 | AddSubMenu(mii.hSubMenu); |
| 99 | } |
| 100 | else { |
| 101 | if (menu.GetMenuString(i, text, _countof(text), MF_BYPOSITION)) { |
| 102 | ATLASSERT(text[0]); |
| 103 | ATLASSERT(mii.wID); |
| 104 | auto it = m_Items.find(mii.wID); |
| 105 | if (it != m_Items.end()) |
| 106 | it->second.Text = text; |
| 107 | else { |
| 108 | ItemData data; |
| 109 | data.Text = text; |
| 110 | data.Image = -1; |
| 111 | m_Items.insert({ mii.wID,data }); |
| 112 | } |
| 113 | } |
| 114 | } |
| 115 | } |
| 116 | } |
| 117 | |
| 118 | void COwnerDrawnMenuBase::SetCheckIcon(HICON hIcon) { |
| 119 | m_CheckIcon = m_Images.AddIcon(hIcon); |