1 #include "stdafx.h"
2 #include "MusicPlayer2.h"
3 #include "MenuMgr.h"
4 #include "WinVersionHelper.h"
5
6
7 class MenuMgr::MenuBase
8 {
9 public:
MenuBase(MenuMgr * pMenuMgr,MenuMgr::MenuType menu_type)10 MenuBase(MenuMgr* pMenuMgr, MenuMgr::MenuType menu_type)
11 : m_pMenuMgr(pMenuMgr), m_menu_type(menu_type) {}
~MenuBase()12 ~MenuBase() {}
13
CreateMenu(bool is_popup,bool add_accelerator)14 void CreateMenu(bool is_popup, bool add_accelerator)
15 {
16 m_add_accelerator = add_accelerator;
17 if (is_popup)
18 m_menu.CreatePopupMenu();
19 else
20 m_menu.CreateMenu();
21 }
22
AppendItem(UINT wID,const wstring & id_text,IconMgr::IconType icon_type=IconMgr::IT_NO_ICON,const wchar_t * text=nullptr)23 void AppendItem(UINT wID, const wstring& id_text, IconMgr::IconType icon_type = IconMgr::IT_NO_ICON, const wchar_t* text = nullptr)
24 {
25 wstring menu_text; // mii使用其内部数据指针,此对象需要有效到api完成
26 MENUITEMINFO mii = { sizeof(mii) };
27 mii.fMask = MIIM_ID | MIIM_STRING | MIIM_FTYPE;
28 mii.wID = wID;
29 if (id_text.empty() && text != nullptr) // 空id_text的话直接使用参数text做正文(给UpdateMenu开的后门)
30 mii.dwTypeData = const_cast<LPWSTR>(text);
31 else
32 {
33 menu_text = theApp.m_str_table.LoadMenuText(MenuMgr::GetMenuNameStr(m_menu_type), id_text);
34 if (text != nullptr) // 由参数直接指定的快捷键优先级更高
35 {
36 menu_text.append(L"\t").append(text);
37 }
38 else if (m_add_accelerator) // 如果CreateMenu时要求自动附加Accelerator快捷键描述
39 {
40 wstring shortcut = theApp.m_accelerator_res.GetShortcutDescriptionById(wID);
41 if (!shortcut.empty())
42 menu_text += L'\t' + shortcut;
43 }
44 mii.dwTypeData = const_cast<LPWSTR>(menu_text.c_str());
45 }
46 #ifndef COMPILE_IN_WIN_XP
47 if (HBITMAP hBmp = m_pMenuMgr->GetMenuBitmapHandle(icon_type))
48 {
49 mii.fMask |= MIIM_BITMAP;
50 mii.hbmpItem = hBmp;
51 }
52 #endif
53 m_menu.InsertMenuItemW(m_end_pos++, &mii, TRUE);
54 }
55
AppendSubMenu(MenuMgr::MenuType sub_menu_type,IconMgr::IconType icon_type=IconMgr::IT_NO_ICON)56 void AppendSubMenu(MenuMgr::MenuType sub_menu_type, IconMgr::IconType icon_type = IconMgr::IT_NO_ICON)
57 {
58 MENUITEMINFO mii = { sizeof(mii) };
59 mii.fMask = MIIM_STRING | MIIM_SUBMENU | MIIM_FTYPE;
60 mii.hSubMenu = m_pMenuMgr->GetSafeHmenu(sub_menu_type);
61 wstring menu_text = theApp.m_str_table.LoadMenuText(MenuMgr::GetMenuNameStr(m_menu_type), MenuMgr::GetMenuNameStr(sub_menu_type));
62 mii.dwTypeData = const_cast<LPWSTR>(menu_text.c_str());
63 #ifndef COMPILE_IN_WIN_XP
64 if (HBITMAP hBmp = m_pMenuMgr->GetMenuBitmapHandle(icon_type))
65 {
66 mii.fMask |= MIIM_BITMAP;
67 mii.hbmpItem = hBmp;
68 }
69 #endif
70 m_menu.InsertMenuItemW(m_end_pos++, &mii, TRUE);
71 }
72
AppendSeparator()73 void AppendSeparator()
74 {
75 m_menu.AppendMenuW(MF_SEPARATOR);
76 m_end_pos++;
77 }
78
SetDefaultItem()79 void SetDefaultItem()
80 {
81 ASSERT(m_end_pos > 0);
82 m_menu.SetDefaultItem(m_end_pos - 1, TRUE);
83 }
84
UpdateMenu(const vector<MenuMgr::MenuItem> & items)85 void UpdateMenu(const vector<MenuMgr::MenuItem>& items)
86 {
87 ASSERT(m_update_pos != -1);
88 static wstring empty{ L"" };
89 // 将items插入菜单中m_update_pos位置,会替换掉上次设置的内容(此方法不能为一个菜单更新两段内容)
90 int bk_org_cnt = m_end_pos; // m_end_pos为菜单初始化后的初始项目数
91 m_end_pos = m_update_pos; // 也是新项目的插入点
92 int cnt = m_menu.GetMenuItemCount() - bk_org_cnt;
93 while (cnt--) // 删除旧的外部提供菜单项
94 m_menu.DeleteMenu(m_update_pos, MF_BYPOSITION); // DeleteMenu如果用于移除子菜单项会销毁子菜单句柄
95 for (const auto& item : items) // 插入新的外部提供菜单项
96 {
97 if (item.id != NULL)
98 AppendItem(item.id, empty, item.icon_type, item.text.c_str());
99 else
100 AppendSeparator();
101 }
102 m_end_pos = bk_org_cnt; // 恢复为初始项目数
103 // 这里有一点小问题,如果不销毁重建菜单句柄那么菜单会记忆其所需过的文本宽度,也就是不会变窄(至少我不知道怎样做)
104 // 销毁重建会使得这里的共享子菜单机制不能正常工作
105 }
106
GetMenuType() const107 MenuMgr::MenuType GetMenuType() const { return m_menu_type; }
SetUpdatePos()108 void SetUpdatePos() { m_update_pos = m_end_pos; }
109
110 CMenu m_menu;
111 private:
112 MenuMgr* m_pMenuMgr;
113 MenuMgr::MenuType m_menu_type;
114 int m_end_pos{ 0 };
115 int m_update_pos{ -1 };
116 bool m_add_accelerator{ false }; // AppendItem是否自动根据命令ID附加加速键列表中的快捷键文本
117 };
118
MenuMgr()119 MenuMgr::MenuMgr()
120 {
121 }
122
~MenuMgr()123 MenuMgr::~MenuMgr()
124 {
125 }
126
127 typedef DWORD ARGB;
128
GetMenuBitmapHandle(IconMgr::IconType icon_type)129 HBITMAP MenuMgr::GetMenuBitmapHandle(IconMgr::IconType icon_type)
130 {
131 if (auto pBitmap = GetMenuBitmap(icon_type))
132 return static_cast<HBITMAP>(pBitmap->GetSafeHandle());
133 return NULL;
134 }
135
GetMenuBitmap(IconMgr::IconType icon_type)136 const CBitmap* MenuMgr::GetMenuBitmap(IconMgr::IconType icon_type)
137 {
138 if (icon_type == IconMgr::IconType::IT_NO_ICON)
139 return nullptr;
140
141 HICON hIcon = theApp.m_icon_mgr.GetHICON(icon_type, IconMgr::IS_OutlinedDark, IconMgr::IconSize::IS_DPI_16);
142 // 取得默认图标尺寸(应该与GetSystemMetrics(SM_CXSMICON/SM_CYSMICON)相同)
143 auto [width, height] = IconMgr::GetIconSize(IconMgr::IconSize::IS_DPI_16);
144
145 if (m_icon_bitmap_map[hIcon].GetSafeHandle()) // 已有bitmap时不再二次转换
146 return &m_icon_bitmap_map[hIcon];
147
148 // 创建一个带Alpha通道的DIB节
149 BITMAPINFO bmi{};
150 bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
151 bmi.bmiHeader.biWidth = width;
152 bmi.bmiHeader.biHeight = -height; // 使用负高度以保证DIB的顶向下的排列
153 bmi.bmiHeader.biPlanes = 1;
154 bmi.bmiHeader.biBitCount = 32; // 每像素32位,带Alpha通道
155 bmi.bmiHeader.biCompression = BI_RGB;
156
157 void* pvBits;
158 HBITMAP hbm = CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0);
159 HDC hdcMem = CreateCompatibleDC(NULL);
160 HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, hbm);
161 // 用透明背景填充位图
162 BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };
163 AlphaBlend(hdcMem, 0, 0, width, height, hdcMem, 0, 0, width, height, bf);
164 // 将图标绘制到位图上
165 DrawIconEx(hdcMem, 0, 0, hIcon, width, height, 0, NULL, DI_NORMAL);
166 // 清理
167 SelectObject(hdcMem, hbmOld);
168 DeleteDC(hdcMem);
169
170 m_icon_bitmap_map[hIcon].Attach(hbm);
171
172 return &m_icon_bitmap_map[hIcon];
173 }
174
UpdateMenu(MenuType menu_type,const vector<MenuItem> & items)175 void MenuMgr::UpdateMenu(MenuType menu_type, const vector<MenuItem>& items)
176 {
177 MenuBase& menu = GetMenuBase(menu_type);
178 menu.UpdateMenu(items);
179 }
180
GetSafeHmenu(MenuType menu_type)181 HMENU MenuMgr::GetSafeHmenu(MenuType menu_type)
182 {
183 return GetMenuBase(menu_type).m_menu.GetSafeHmenu();
184 }
185
GetMenu(MenuType menu_type)186 CMenu* MenuMgr::GetMenu(MenuType menu_type)
187 {
188 return &GetMenuBase(menu_type).m_menu;
189 }
190
GetMenuBase(MenuType menu_type)191 MenuMgr::MenuBase& MenuMgr::GetMenuBase(MenuType menu_type)
192 {
193 if (m_menus[menu_type] != nullptr)
194 {
195 // 此断言失败说明有代码错误销毁了它之前得到的菜单句柄,菜单句柄生命周期由MenuBase对象负责,其他位置只能使用
196 ASSERT(m_menus[menu_type]->m_menu.GetSafeHmenu());
197 return *m_menus[menu_type];
198 }
199 m_menus[menu_type] = std::make_unique<MenuBase>(this, menu_type);
200 CreateMenu(*m_menus[menu_type]); // 内部创建子菜单时会使用MenuBase构造得到的this指针调用MenuMgr::GetSafeHmenu递归
201 return *m_menus[menu_type];
202 }
203
GetMenuNameStr(MenuMgr::MenuType menu_type)204 const wchar_t* MenuMgr::GetMenuNameStr(MenuMgr::MenuType menu_type)
205 {
206 // 这里记录菜单在language.ini的键名,当需要同样翻译的不同菜单时(比如是否为其附加全局快捷键)
207 // 可以为不同的菜单枚举使用相同的键名以复用相同的翻译字符串(建议仅为子集关系的菜单这样做)
208 switch (menu_type)
209 {
210 case MenuMgr::MainPopupMenu:
211 return L"MAIN_POP";
212 case MenuMgr::MainMenu:
213 return L"MAIN";
214 case MenuMgr::MainFileMenu:
215 return L"MAIN_FILE";
216 case MenuMgr::MainPlayCtrlMenu:
217 return L"MAIN_PLAYCTRL";
218 case MenuMgr::MainPlayCtrlRepeatModeMenu:
219 return L"MAIN_PLAYCTRL_REPEAT_MODE";
220 case MenuMgr::MainPlayCtrlAbRepeatMenu:
221 return L"MAIN_PLAYCTRL_AB";
222 case MenuMgr::MainPlaylistMenu:
223 return L"MAIN_PLAYLIST";
224 case MenuMgr::MainPlaylistAddMenu:
225 return L"MAIN_PLAYLIST_ADD";
226 case MenuMgr::MainPlaylistDelMenu:
227 return L"MAIN_PLAYLIST_DEL";
228 case MenuMgr::MainPlaylistSortMenu:
229 return L"MAIN_PLAYLIST_SORT";
230 case MenuMgr::MainPlaylistDispModeMenu:
231 return L"MAIN_PLAYLIST_DISP_MODE";
232 case MenuMgr::MainLyricMenu:
233 return L"MAIN_LRC";
234 case MenuMgr::MainLrcChConvMenu:
235 return L"MAIN_LRC_CH_CONV";
236 case MenuMgr::MainLrcInnerLrcMenu:
237 return L"MAIN_LRC_INNER_LRC";
238 case MenuMgr::MainViewMenu:
239 return L"MAIN_VIEW";
240 case MenuMgr::MainViewSwitchUiMenu:
241 return L"MAIN_VIEW_SWITCH_UI";
242 case MenuMgr::MainToolMenu:
243 return L"MAIN_TOOL";
244 case MenuMgr::MainToolCreateShortcutMenu:
245 return L"MAIN_TOOL_SHORTCUT";
246 case MenuMgr::MainToolAlbumCoverMenu:
247 return L"MAIN_TOOL_ALBUM_COVER";
248 case MenuMgr::MainToolDelCurPlayingMenu:
249 return L"MAIN_TOOL_DEL_CUR_PLAYING";
250 case MenuMgr::MainHelpMenu:
251 return L"MAIN_HELP";
252 case MenuMgr::PlaylistToolBarMenu:
253 return L"PLAYLIST_TOOLBAR";
254 case MenuMgr::PlaylistToolBarListMenu:
255 return L"PLAYLIST_TOOLBAR_LIST";
256 case MenuMgr::PlaylistToolBarEditMenu:
257 return L"PLAYLIST_TOOLBAR_EDIT";
258 case MenuMgr::PlaylistToolBarFolderMenu:
259 return L"PLAYLIST_TOOLBAR_FOLDER";
260 case MenuMgr::MainAreaMenu:
261 return L"MAIN_AREA";
262 case MenuMgr::MainAreaLrcMenu:
263 return L"MAIN_LRC";
264 case MenuMgr::MainAreaPlaylistBtnMenu:
265 return L"MAIN_AREA_PLAYLIST_BTN";
266 case MenuMgr::DlrcMenu:
267 return L"DLRC";
268 case MenuMgr::DlrcDefMenu:
269 return L"DLRC_DEFAULT_STYLE";
270 case MenuMgr::RecentFolderPlaylistMenu:
271 return L"RECENT_FOLDER_PLAYLIST";
272 case MenuMgr::PlaylistMenu:
273 return L"PLAYLIST";
274 case MenuMgr::RateMenu:
275 return L"RATE";
276 case MenuMgr::AddToPlaylistMenu:
277 return L"ADD_TO_PLAYLIST";
278 case MenuMgr::MiniAreaMenu:
279 return L"MINI_AREA";
280 case MenuMgr::MiniModeSwitchUiMenu:
281 return L"MINI_SWITCH_UI";
282 case MenuMgr::NotifyMenu:
283 return L"NOTIFY";
284 case MenuMgr::LibSetPathMenu:
285 return L"LIB_SET_PATH";
286 case MenuMgr::LibPlaylistMenu:
287 return L"LIB_PLAYLIST";
288 case MenuMgr::LibLeftMenu: case MenuMgr::UiLibLeftMenu: case MenuMgr::LibFolderExploreMenu:
289 return L"LIB_LEFT";
290 case MenuMgr::LibRightMenu: case MenuMgr::UiMyFavouriteMenu: case MenuMgr::LibPlaylistRightMenu:
291 return L"LIB_RIGHT";
292 case MenuMgr::UiRecentPlayedMenu: case MenuMgr::FindListMenu:
293 return L"UI_RECENT_PLAYED";
294 case MenuMgr::LibPlaylistSortMenu:
295 return L"LIB_PLAYLIST_SORT";
296 case MenuMgr::LibFolderSortMenu:
297 return L"LIB_FOLDER_SORT";
298 case MenuMgr::LeMenu:
299 return L"LE";
300 case MenuMgr::LeFileMenu:
301 return L"LE_FILE";
302 case MenuMgr::LeEditMenu:
303 return L"LE_EDIT";
304 case MenuMgr::LeEditChConvMenu:
305 return L"LE_EDIT_CH_CONV";
306 case MenuMgr::LeEditTagDislocMenu:
307 return L"LE_EDIT_TAG_DISLOC";
308 case MenuMgr::LeEditTranslateFormatConvertMenu:
309 return L"LE_EDIT_TRANSLATE_FORMAT_CONVERT";
310 case MenuMgr::LePlayCtrlMenu:
311 return L"LE_PLAY_CTRL";
312 case MenuMgr::FcListMenu:
313 return L"FC_LIST";
314 case MenuMgr::LdListMenu:
315 return L"LD_LIST";
316 case MenuMgr::OptDlrcDefStyleMenu:
317 return L"OPT_DLRC_DEFAULT_STYLE";
318 case MenuMgr::OptDlrcModDefStyleMenu:
319 return L"OPT_DLRC_MOD_DEF_STYLE";
320 case MenuMgr::PropertyAdvMenu:
321 return L"PROPERTY_ADV";
322 case MenuMgr::PropertyCoverMenu:
323 return L"PROPERTY_COVER";
324 default:
325 return L"";
326 break;
327 }
328 }
329
330 #define EX_ID(id) id, L#id
331
CreateMenu(MenuBase & menu)332 void MenuMgr::CreateMenu(MenuBase& menu)
333 {
334 // git log 47698b win11下使用复选功能的菜单项不设置图标
335 static bool is_win11OrLater = CWinVersionHelper::IsWindows11OrLater();
336 switch (menu.GetMenuType())
337 {
338 case MenuMgr::MainPopupMenu:
339 menu.CreateMenu(true, true);
340 menu.AppendSubMenu(MainFileMenu, IconMgr::IconType::IT_Folder);
341 menu.AppendSubMenu(MainPlayCtrlMenu, IconMgr::IconType::IT_Play);
342 menu.AppendSubMenu(MainPlaylistMenu, IconMgr::IconType::IT_Playlist);
343 menu.AppendSubMenu(MainLyricMenu, IconMgr::IconType::IT_Lyric);
344 menu.AppendSubMenu(MainViewMenu, IconMgr::IconType::IT_Playlist_Dock);
345 menu.AppendSubMenu(MainToolMenu, IconMgr::IconType::IT_Setting);
346 menu.AppendSubMenu(MainHelpMenu, IconMgr::IconType::IT_Help);
347 menu.AppendSeparator();
348 menu.AppendItem(EX_ID(ID_MENU_EXIT), IconMgr::IconType::IT_Exit);
349 #ifdef _DEBUG
350 menu.AppendSeparator();
351 menu.AppendItem(EX_ID(ID_TEST));
352 menu.AppendItem(EX_ID(ID_TEST_DIALOG));
353 #endif
354 break;
355 case MenuMgr::MainMenu:
356 menu.CreateMenu(false, true);
357 menu.AppendSubMenu(MainFileMenu);
358 menu.AppendSubMenu(MainPlayCtrlMenu);
359 menu.AppendSubMenu(MainPlaylistMenu);
360 menu.AppendSubMenu(MainLyricMenu);
361 menu.AppendSubMenu(MainViewMenu);
362 menu.AppendSubMenu(MainToolMenu);
363 menu.AppendSubMenu(MainHelpMenu);
364 break;
365 case MenuMgr::MainFileMenu:
366 menu.CreateMenu(true, true);
367 menu.AppendItem(EX_ID(ID_FILE_OPEN), IconMgr::IconType::IT_Music);
368 menu.AppendItem(EX_ID(ID_FILE_OPEN_FOLDER), IconMgr::IconType::IT_Folder);
369 menu.AppendItem(EX_ID(ID_FILE_OPEN_URL), IconMgr::IconType::IT_Link);
370 menu.AppendItem(EX_ID(ID_FILE_OPEN_PLAYLIST), IconMgr::IconType::IT_Playlist);
371 menu.AppendSeparator();
372 menu.AppendItem(EX_ID(ID_MENU_EXIT), IconMgr::IconType::IT_Exit);
373 break;
374 case MenuMgr::MainPlayCtrlMenu:
375 menu.CreateMenu(true, true);
376 menu.AppendItem(EX_ID(ID_PLAY_PAUSE), IconMgr::IconType::IT_Play_Pause);
377 menu.AppendItem(EX_ID(ID_STOP), IconMgr::IconType::IT_Stop);
378 menu.AppendItem(EX_ID(ID_PREVIOUS), IconMgr::IconType::IT_Previous);
379 menu.AppendItem(EX_ID(ID_NEXT), IconMgr::IconType::IT_Next);
380 menu.AppendSeparator();
381 menu.AppendItem(EX_ID(ID_REW), IconMgr::IconType::IT_Rewind);
382 menu.AppendItem(EX_ID(ID_FF), IconMgr::IconType::IT_Fast_Forward);
383 menu.AppendSeparator();
384 menu.AppendItem(EX_ID(ID_SPEED_UP), IconMgr::IconType::IT_Speed_Up);
385 menu.AppendItem(EX_ID(ID_SLOW_DOWN), IconMgr::IconType::IT_Slow_Down);
386 menu.AppendItem(EX_ID(ID_ORIGINAL_SPEED));
387 menu.AppendSeparator();
388 menu.AppendItem(EX_ID(ID_PITCH_UP));
389 menu.AppendItem(EX_ID(ID_PITCH_DOWN));
390 menu.AppendItem(EX_ID(ID_ORIGINAL_PITCH));
391 menu.AppendSeparator();
392 menu.AppendSubMenu(MainPlayCtrlRepeatModeMenu);
393 menu.AppendSubMenu(MainPlayCtrlAbRepeatMenu);
394 break;
395 case MenuMgr::MainPlayCtrlRepeatModeMenu:
396 menu.CreateMenu(true, false);
397 menu.AppendItem(EX_ID(ID_PLAY_ORDER), IconMgr::IconType::IT_Play_Order);
398 menu.AppendItem(EX_ID(ID_PLAY_SHUFFLE), IconMgr::IconType::IT_Play_Shuffle);
399 menu.AppendItem(EX_ID(ID_PLAY_RANDOM), IconMgr::IconType::IT_Play_Random);
400 menu.AppendItem(EX_ID(ID_LOOP_PLAYLIST), IconMgr::IconType::IT_Loop_Playlist);
401 menu.AppendItem(EX_ID(ID_LOOP_TRACK), IconMgr::IconType::IT_Loop_Track);
402 menu.AppendItem(EX_ID(ID_PLAY_TRACK), IconMgr::IconType::IT_Play_Track);
403 break;
404 case MenuMgr::MainPlayCtrlAbRepeatMenu:
405 menu.CreateMenu(true, true);
406 menu.AppendItem(EX_ID(ID_AB_REPEAT));
407 menu.AppendSeparator();
408 menu.AppendItem(EX_ID(ID_SET_A_POINT));
409 menu.AppendItem(EX_ID(ID_SET_B_POINT));
410 menu.AppendItem(EX_ID(ID_NEXT_AB_REPEAT));
411 menu.AppendItem(EX_ID(ID_RESET_AB_REPEAT));
412 break;
413 case MenuMgr::MainPlaylistMenu:
414 menu.CreateMenu(true, true);
415 menu.AppendSubMenu(MainPlaylistAddMenu, IconMgr::IconType::IT_Add);
416 menu.AppendSubMenu(MainPlaylistDelMenu, IconMgr::IconType::IT_Cancel);
417 menu.AppendItem(EX_ID(ID_RELOAD_PLAYLIST), IconMgr::IconType::IT_Loop_Playlist);
418 menu.AppendSeparator();
419 menu.AppendItem(EX_ID(ID_SAVE_AS_NEW_PLAYLIST), IconMgr::IconType::IT_Save);
420 menu.AppendItem(EX_ID(ID_SAVE_CURRENT_PLAYLIST_AS), IconMgr::IconType::IT_Save_As);
421 menu.AppendSeparator();
422 menu.AppendSubMenu(MainPlaylistSortMenu, IconMgr::IconType::IT_Sort_Mode);
423 menu.AppendSubMenu(MainPlaylistDispModeMenu, IconMgr::IconType::IT_Playlist_Display_Mode);
424 menu.AppendSeparator();
425 menu.AppendItem(EX_ID(ID_LOCATE_TO_CURRENT), IconMgr::IconType::IT_Locate);
426 break;
427 case MenuMgr::MainPlaylistAddMenu:
428 menu.CreateMenu(true, true);
429 menu.AppendItem(EX_ID(ID_PLAYLIST_ADD_FILE), IconMgr::IconType::IT_Music);
430 menu.AppendItem(EX_ID(ID_PLAYLIST_ADD_FOLDER), IconMgr::IconType::IT_Folder);
431 menu.AppendItem(EX_ID(ID_PLAYLIST_ADD_URL), IconMgr::IconType::IT_Link);
432 break;
433 case MenuMgr::MainPlaylistDelMenu:
434 menu.CreateMenu(true, true);
435 menu.AppendItem(EX_ID(ID_REMOVE_FROM_PLAYLIST), IconMgr::IconType::IT_Cancel);
436 menu.AppendItem(EX_ID(ID_DELETE_FROM_DISK));
437 menu.AppendSeparator();
438 menu.AppendItem(EX_ID(ID_EMPTY_PLAYLIST));
439 menu.AppendItem(EX_ID(ID_REMOVE_SAME_SONGS));
440 menu.AppendItem(EX_ID(ID_REMOVE_INVALID_ITEMS));
441 break;
442 case MenuMgr::MainPlaylistSortMenu:
443 menu.CreateMenu(true, true);
444 menu.AppendItem(EX_ID(ID_SORT_BY_FILE));
445 menu.AppendItem(EX_ID(ID_SORT_BY_PATH));
446 menu.AppendItem(EX_ID(ID_SORT_BY_TITLE));
447 menu.AppendItem(EX_ID(ID_SORT_BY_ARTIST));
448 menu.AppendItem(EX_ID(ID_SORT_BY_ALBUM));
449 menu.AppendItem(EX_ID(ID_SORT_BY_TRACK));
450 menu.AppendItem(EX_ID(ID_SORT_BY_LISTEN_TIME));
451 menu.AppendItem(EX_ID(ID_SORT_BY_MODIFIED_TIME));
452 break;
453 case MenuMgr::MainPlaylistDispModeMenu:
454 menu.CreateMenu(true, true);
455 menu.AppendItem(EX_ID(ID_DISP_FILE_NAME));
456 menu.AppendItem(EX_ID(ID_DISP_TITLE));
457 menu.AppendItem(EX_ID(ID_DISP_ARTIST_TITLE));
458 menu.AppendItem(EX_ID(ID_DISP_TITLE_ARTIST));
459 break;
460 case MenuMgr::MainLyricMenu:
461 menu.CreateMenu(true, true);
462 menu.AppendItem(EX_ID(ID_RELOAD_LYRIC), IconMgr::IconType::IT_Loop_Playlist);
463 menu.AppendItem(EX_ID(ID_COPY_CURRENT_LYRIC), IconMgr::IconType::IT_Copy);
464 menu.AppendItem(EX_ID(ID_COPY_ALL_LYRIC));
465 menu.AppendItem(EX_ID(ID_EDIT_LYRIC), IconMgr::IconType::IT_Edit);
466 menu.AppendSubMenu(MainLrcChConvMenu);
467 menu.AppendSeparator();
468 menu.AppendItem(EX_ID(ID_SHOW_LYRIC_TRANSLATE));
469 menu.AppendItem(EX_ID(ID_SHOW_DESKTOP_LYRIC));
470 menu.AppendSeparator();
471 menu.AppendItem(EX_ID(ID_LYRIC_FORWARD), IconMgr::IconType::IT_Triangle_Left);
472 menu.AppendItem(EX_ID(ID_LYRIC_DELAY), IconMgr::IconType::IT_Triangle_Right);
473 menu.AppendItem(EX_ID(ID_SAVE_MODIFIED_LYRIC), IconMgr::IconType::IT_Save);
474 menu.AppendSeparator();
475 menu.AppendItem(EX_ID(ID_RELATE_LOCAL_LYRIC), IconMgr::IconType::IT_Lyric);
476 menu.AppendItem(EX_ID(ID_DELETE_LYRIC), IconMgr::IconType::IT_Cancel);
477 menu.AppendItem(EX_ID(ID_UNLINK_LYRIC), IconMgr::IconType::IT_Unlink);
478 menu.AppendItem(EX_ID(ID_BROWSE_LYRIC), IconMgr::IconType::IT_Folder_Explore);
479 menu.AppendSubMenu(MainLrcInnerLrcMenu, IconMgr::IconType::IT_Internal_Lyric);
480 menu.AppendSeparator();
481 menu.AppendItem(EX_ID(ID_DOWNLOAD_LYRIC), IconMgr::IconType::IT_Download);
482 menu.AppendItem(EX_ID(ID_LYRIC_BATCH_DOWNLOAD), IconMgr::IconType::IT_Download_Batch);
483 break;
484 case MenuMgr::MainLrcChConvMenu:
485 menu.CreateMenu(true, true);
486 menu.AppendItem(EX_ID(ID_TRANSLATE_TO_SIMPLIFIED_CHINESE));
487 menu.AppendItem(EX_ID(ID_TRANSLATE_TO_TRANDITIONAL_CHINESE));
488 break;
489 case MenuMgr::MainLrcInnerLrcMenu:
490 menu.CreateMenu(true, true);
491 menu.AppendItem(EX_ID(ID_EMBED_LYRIC_TO_AUDIO_FILE));
492 menu.AppendItem(EX_ID(ID_DELETE_LYRIC_FROM_AUDIO_FILE));
493 break;
494 case MenuMgr::MainViewMenu:
495 menu.CreateMenu(true, true);
496 menu.AppendItem(EX_ID(ID_SHOW_PLAYLIST), is_win11OrLater ? IconMgr::IconType::IT_NO_ICON : IconMgr::IconType::IT_Playlist_Dock);
497 menu.AppendItem(EX_ID(ID_FLOAT_PLAYLIST), is_win11OrLater ? IconMgr::IconType::IT_NO_ICON : IconMgr::IconType::IT_Playlist_Float);
498 menu.AppendItem(EX_ID(ID_USE_STANDARD_TITLE_BAR));
499 menu.AppendItem(EX_ID(ID_SHOW_MENU_BAR), is_win11OrLater ? IconMgr::IconType::IT_NO_ICON : IconMgr::IconType::IT_Menu);
500 menu.AppendItem(EX_ID(ID_ALWAYS_SHOW_STATUS_BAR));
501 menu.AppendItem(EX_ID(ID_ALWAYS_ON_TOP), is_win11OrLater ? IconMgr::IconType::IT_NO_ICON : IconMgr::IconType::IT_Pin);
502 menu.AppendSeparator();
503 menu.AppendItem(EX_ID(ID_MINI_MODE), IconMgr::IconType::IT_Mini_On);
504 menu.AppendItem(EX_ID(ID_FULL_SCREEN), IconMgr::IconType::IT_Full_Screen_On);
505 menu.AppendSeparator();
506 menu.AppendItem(EX_ID(ID_DARK_MODE), IconMgr::IconType::IT_Dark_Mode_On);
507 menu.AppendSubMenu(MainViewSwitchUiMenu, IconMgr::IconType::IT_Skin);
508 break;
509 case MenuMgr::MainViewSwitchUiMenu:
510 menu.CreateMenu(true, true);
511 menu.AppendItem(EX_ID(ID_SWITCH_UI), IconMgr::IconType::IT_Skin);
512 menu.AppendSeparator();
513 menu.SetUpdatePos(); // 设置Update插入点
514 break;
515 case MenuMgr::MainToolMenu:
516 menu.CreateMenu(true, true);
517 menu.AppendItem(EX_ID(ID_MEDIA_LIB), IconMgr::IconType::IT_Media_Lib);
518 menu.AppendItem(EX_ID(ID_FIND), IconMgr::IconType::IT_Find);
519 menu.AppendItem(EX_ID(ID_EXPLORE_PATH), IconMgr::IconType::IT_Folder_Explore);
520 menu.AppendItem(EX_ID(ID_SONG_INFO), IconMgr::IconType::IT_Info);
521 menu.AppendItem(EX_ID(ID_EQUALIZER), IconMgr::IconType::IT_Equalizer);
522 menu.AppendItem(EX_ID(ID_FORMAT_CONVERT1), IconMgr::IconType::IT_Convert);
523 menu.AppendItem(EX_ID(ID_CURRENT_EXPLORE_ONLINE), IconMgr::IconType::IT_Online);
524 menu.AppendSeparator();
525 menu.AppendItem(EX_ID(ID_RE_INI_BASS), IconMgr::IconType::IT_Refresh);
526 menu.AppendSubMenu(MainToolCreateShortcutMenu, IconMgr::IconType::IT_Shortcut);
527 menu.AppendSeparator();
528 menu.AppendSubMenu(MainToolAlbumCoverMenu, IconMgr::IconType::IT_Album_Cover);
529 menu.AppendSubMenu(MainToolDelCurPlayingMenu, IconMgr::IconType::IT_Cancel);
530 menu.AppendSeparator();
531 menu.AppendItem(EX_ID(ID_LISTEN_STATISTICS), IconMgr::IconType::IT_Statistics);
532 menu.AppendItem(EX_ID(ID_TOOL_FILE_RELATE), IconMgr::IconType::IT_File_Relate);
533 menu.AppendItem(EX_ID(ID_OPTION_SETTINGS), IconMgr::IconType::IT_Setting);
534 break;
535 case MenuMgr::MainToolCreateShortcutMenu:
536 menu.CreateMenu(true, true);
537 menu.AppendItem(EX_ID(ID_CREATE_DESKTOP_SHORTCUT));
538 menu.AppendItem(EX_ID(ID_CREATE_PLAY_SHORTCUT));
539 menu.AppendItem(EX_ID(ID_CREATE_MINI_MODE_SHORT_CUT));
540 break;
541 case MenuMgr::MainToolAlbumCoverMenu:
542 menu.CreateMenu(true, true);
543 menu.AppendItem(EX_ID(ID_DOWNLOAD_ALBUM_COVER), IconMgr::IconType::IT_Download);
544 menu.AppendItem(EX_ID(ID_ALBUM_COVER_SAVE_AS), IconMgr::IconType::IT_Save_As);
545 menu.AppendItem(EX_ID(ID_DELETE_ALBUM_COVER), IconMgr::IconType::IT_Cancel);
546 menu.AppendItem(EX_ID(ID_ALBUM_COVER_INFO), IconMgr::IconType::IT_Album_Cover);
547 break;
548 case MenuMgr::MainToolDelCurPlayingMenu:
549 menu.CreateMenu(true, true);
550 menu.AppendItem(EX_ID(ID_REMOVE_CURRENT_FROM_PLAYLIST));
551 menu.AppendItem(EX_ID(ID_DELETE_CURRENT_FROM_DISK));
552 break;
553 case MenuMgr::MainHelpMenu:
554 menu.CreateMenu(true, true);
555 menu.AppendItem(EX_ID(ID_HELP), IconMgr::IconType::IT_Help, L"F1");
556 menu.AppendItem(EX_ID(ID_ONLINE_HELP));
557 menu.AppendItem(EX_ID(ID_HELP_FAQ));
558 menu.AppendItem(EX_ID(ID_HELP_CUSTOM_UI));
559 menu.AppendItem(EX_ID(ID_HELP_UPDATE_LOG));
560 menu.AppendItem(EX_ID(ID_SUPPORTED_FORMAT));
561 menu.AppendSeparator();
562 menu.AppendItem(EX_ID(ID_APP_ABOUT), IconMgr::IconType::IT_App);
563 break;
564 case MenuMgr::PlaylistToolBarMenu:
565 menu.CreateMenu(true, true);
566 menu.AppendSubMenu(MainPlaylistAddMenu, IconMgr::IconType::IT_Add);
567 menu.AppendSubMenu(MainPlaylistDelMenu, IconMgr::IconType::IT_Cancel);
568 menu.AppendSubMenu(MainPlaylistSortMenu, IconMgr::IconType::IT_Sort_Mode);
569 menu.AppendSubMenu(PlaylistToolBarListMenu, IconMgr::IconType::IT_Playlist);
570 menu.AppendSubMenu(PlaylistToolBarEditMenu, IconMgr::IconType::IT_Edit);
571 menu.AppendSubMenu(PlaylistToolBarFolderMenu, IconMgr::IconType::IT_Folder);
572 menu.AppendSeparator();
573 menu.AppendItem(EX_ID(ID_LOCATE_TO_CURRENT), IconMgr::IconType::IT_Locate);
574 break;
575 case MenuMgr::PlaylistToolBarListMenu:
576 menu.CreateMenu(true, true);
577 menu.AppendItem(EX_ID(ID_RELOAD_PLAYLIST), IconMgr::IconType::IT_Loop_Playlist);
578 menu.AppendItem(EX_ID(ID_SAVE_AS_NEW_PLAYLIST), IconMgr::IconType::IT_Save);
579 menu.AppendItem(EX_ID(ID_SAVE_CURRENT_PLAYLIST_AS), IconMgr::IconType::IT_Save_As);
580 menu.AppendSeparator();
581 menu.AppendItem(EX_ID(ID_PLAYLIST_FIX_PATH_ERROR), IconMgr::IconType::IT_Fix);
582 menu.AppendSubMenu(MainPlaylistDispModeMenu, IconMgr::IconType::IT_Playlist_Display_Mode);
583 menu.AppendItem(EX_ID(ID_PLAYLIST_OPTIONS), IconMgr::IconType::IT_Setting);
584 break;
585 case MenuMgr::PlaylistToolBarEditMenu:
586 menu.CreateMenu(true, true);
587 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
588 menu.AppendItem(EX_ID(ID_COPY_FILE_TO));
589 menu.AppendItem(EX_ID(ID_MOVE_FILE_TO));
590 menu.AppendSeparator();
591 menu.AppendItem(EX_ID(ID_MOVE_PLAYLIST_ITEM_UP));
592 menu.AppendItem(EX_ID(ID_MOVE_PLAYLIST_ITEM_DOWN));
593 menu.AppendSeparator();
594 menu.AppendItem(EX_ID(ID_PLAYLIST_SELECT_ALL));
595 menu.AppendItem(EX_ID(ID_PLAYLIST_SELECT_NONE));
596 menu.AppendItem(EX_ID(ID_PLAYLIST_SELECT_REVERT));
597 break;
598 case MenuMgr::PlaylistToolBarFolderMenu:
599 menu.CreateMenu(true, true);
600 menu.AppendItem(EX_ID(ID_FILE_OPEN_FOLDER), IconMgr::IconType::IT_Folder);
601 menu.AppendItem(EX_ID(ID_CONTAIN_SUB_FOLDER));
602 break;
603 case MenuMgr::MainAreaMenu:
604 menu.CreateMenu(true, true);
605 menu.AppendItem(EX_ID(ID_SONG_INFO), IconMgr::IconType::IT_Info);
606 menu.AppendSubMenu(MainPlayCtrlRepeatModeMenu);
607 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
608 menu.AppendSubMenu(RateMenu, IconMgr::IconType::IT_Star);
609 menu.AppendSeparator();
610 menu.AppendItem(EX_ID(ID_MEDIA_LIB), IconMgr::IconType::IT_Media_Lib);
611 menu.AppendItem(EX_ID(ID_FIND), IconMgr::IconType::IT_Find);
612 menu.AppendItem(EX_ID(ID_EXPLORE_PATH), IconMgr::IconType::IT_Folder_Explore);
613 menu.AppendItem(EX_ID(ID_EQUALIZER), IconMgr::IconType::IT_Equalizer);
614 menu.AppendItem(EX_ID(ID_CURRENT_EXPLORE_ONLINE), IconMgr::IconType::IT_Online);
615 menu.AppendSeparator();
616 menu.AppendItem(EX_ID(ID_DOWNLOAD_ALBUM_COVER), IconMgr::IconType::IT_Download);
617 menu.AppendItem(EX_ID(ID_ALBUM_COVER_SAVE_AS), IconMgr::IconType::IT_Save_As);
618 menu.AppendItem(EX_ID(ID_DELETE_ALBUM_COVER), IconMgr::IconType::IT_Cancel);
619 menu.AppendItem(EX_ID(ID_ALWAYS_USE_EXTERNAL_ALBUM_COVER));
620 menu.AppendItem(EX_ID(ID_ALBUM_COVER_INFO), IconMgr::IconType::IT_Album_Cover);
621 menu.AppendSeparator();
622 menu.AppendItem(EX_ID(ID_VIEW_ARTIST), IconMgr::IconType::IT_Artist);
623 menu.AppendItem(EX_ID(ID_VIEW_ALBUM), IconMgr::IconType::IT_Album);
624 menu.AppendSeparator();
625 menu.AppendSubMenu(MainViewSwitchUiMenu, IconMgr::IconType::IT_Skin);
626 menu.AppendItem(EX_ID(ID_OPTION_SETTINGS), IconMgr::IconType::IT_Setting);
627 break;
628 case MenuMgr::MainAreaLrcMenu:
629 menu.CreateMenu(true, true);
630 menu.AppendItem(EX_ID(ID_RELOAD_LYRIC), IconMgr::IconType::IT_Loop_Playlist);
631 menu.AppendItem(EX_ID(ID_COPY_CURRENT_LYRIC), IconMgr::IconType::IT_Copy);
632 menu.AppendItem(EX_ID(ID_COPY_ALL_LYRIC));
633 menu.AppendItem(EX_ID(ID_EDIT_LYRIC), IconMgr::IconType::IT_Edit);
634 menu.AppendSubMenu(MainLrcChConvMenu);
635 menu.AppendSeparator();
636 menu.AppendItem(EX_ID(ID_SHOW_LYRIC_TRANSLATE));
637 menu.AppendItem(EX_ID(ID_SHOW_DESKTOP_LYRIC));
638 menu.AppendSeparator();
639 menu.AppendItem(EX_ID(ID_LYRIC_FORWARD), IconMgr::IconType::IT_Triangle_Left);
640 menu.AppendItem(EX_ID(ID_LYRIC_DELAY), IconMgr::IconType::IT_Triangle_Right);
641 menu.AppendItem(EX_ID(ID_SAVE_MODIFIED_LYRIC), IconMgr::IconType::IT_Save);
642 menu.AppendSeparator();
643 menu.AppendItem(EX_ID(ID_RELATE_LOCAL_LYRIC), IconMgr::IconType::IT_Lyric);
644 menu.AppendItem(EX_ID(ID_DELETE_LYRIC), IconMgr::IconType::IT_Cancel);
645 menu.AppendItem(EX_ID(ID_UNLINK_LYRIC), IconMgr::IconType::IT_Unlink);
646 menu.AppendItem(EX_ID(ID_BROWSE_LYRIC), IconMgr::IconType::IT_Folder_Explore);
647 menu.AppendSubMenu(MainLrcInnerLrcMenu, IconMgr::IconType::IT_Internal_Lyric);
648 menu.AppendSeparator();
649 menu.AppendItem(EX_ID(ID_DOWNLOAD_LYRIC), IconMgr::IconType::IT_Download);
650 menu.AppendItem(EX_ID(ID_LYRIC_BATCH_DOWNLOAD), IconMgr::IconType::IT_Download_Batch);
651 menu.AppendSeparator();
652 menu.AppendSubMenu(MainViewSwitchUiMenu, IconMgr::IconType::IT_Skin);
653 menu.AppendItem(EX_ID(ID_OPTION_SETTINGS), IconMgr::IconType::IT_Setting);
654 break;
655 case MenuMgr::MainAreaPlaylistBtnMenu:
656 menu.CreateMenu(true, false);
657 menu.AppendItem(EX_ID(ID_DOCKED_PLAYLIST));
658 menu.AppendItem(EX_ID(ID_FLOATED_PLAYLIST));
659 break;
660 case MenuMgr::DlrcMenu:
661 menu.CreateMenu(true, true);
662 menu.AppendItem(EX_ID(ID_PLAY_PAUSE), IconMgr::IconType::IT_Play_Pause);
663 menu.AppendItem(EX_ID(ID_STOP), IconMgr::IconType::IT_Stop);
664 menu.AppendItem(EX_ID(ID_PREVIOUS), IconMgr::IconType::IT_Previous);
665 menu.AppendItem(EX_ID(ID_NEXT), IconMgr::IconType::IT_Next);
666 menu.AppendSubMenu(MainPlayCtrlRepeatModeMenu);
667 menu.AppendSeparator();
668 menu.AppendItem(EX_ID(ID_SHOW_MAIN_WINDOW));
669 menu.AppendItem(EX_ID(ID_LYRIC_DISPLAYED_DOUBLE_LINE), IconMgr::IconType::IT_Double_Line);
670 menu.AppendItem(EX_ID(ID_LYRIC_BACKGROUND_PENETRATE), IconMgr::IconType::IT_Skin);
671 menu.AppendItem(EX_ID(ID_LOCK_DESKTOP_LRYIC), IconMgr::IconType::IT_Lock);
672 menu.AppendSubMenu(DlrcDefMenu, IconMgr::IconType::IT_Media_Lib);
673 menu.AppendItem(EX_ID(ID_OPTION_SETTINGS), IconMgr::IconType::IT_Setting);
674 menu.AppendItem(EX_ID(ID_CLOSE_DESKTOP_LYRIC), IconMgr::IconType::IT_Cancel);
675 break;
676 case MenuMgr::DlrcDefMenu:
677 menu.CreateMenu(true, true);
678 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE1));
679 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE2));
680 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE3));
681 break;
682 case MenuMgr::RecentFolderPlaylistMenu:
683 menu.CreateMenu(true, true);
684 menu.SetUpdatePos(); // 设置Update插入点
685 menu.AppendSeparator();
686 menu.AppendItem(EX_ID(ID_MORE_RECENT_ITEMS), IconMgr::IconType::IT_More);
687 menu.AppendItem(EX_ID(ID_MEDIA_LIB), IconMgr::IconType::IT_Media_Lib);
688 break;
689 case MenuMgr::PlaylistMenu:
690 menu.CreateMenu(true, true);
691 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
692 menu.SetDefaultItem();
693 menu.AppendItem(EX_ID(ID_PLAY_AS_NEXT), IconMgr::IconType::IT_Play_As_Next);
694 menu.AppendSeparator();
695 menu.AppendItem(EX_ID(ID_EXPLORE_ONLINE), IconMgr::IconType::IT_Online);
696 menu.AppendItem(EX_ID(ID_FORMAT_CONVERT), IconMgr::IconType::IT_Convert);
697 menu.AppendSubMenu(RateMenu, IconMgr::IconType::IT_Star);
698 menu.AppendSeparator();
699 menu.AppendItem(EX_ID(ID_RELOAD_PLAYLIST), IconMgr::IconType::IT_Loop_Playlist);
700 menu.AppendSeparator();
701 menu.AppendItem(EX_ID(ID_REMOVE_FROM_PLAYLIST), IconMgr::IconType::IT_Cancel);
702 menu.AppendItem(EX_ID(ID_DELETE_FROM_DISK));
703 menu.AppendSeparator();
704 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
705 menu.AppendItem(EX_ID(ID_COPY_FILE_TO));
706 menu.AppendItem(EX_ID(ID_MOVE_FILE_TO));
707 menu.AppendSeparator();
708 menu.AppendItem(EX_ID(ID_MOVE_PLAYLIST_ITEM_UP));
709 menu.AppendItem(EX_ID(ID_MOVE_PLAYLIST_ITEM_DOWN));
710 menu.AppendSeparator();
711 menu.AppendItem(EX_ID(ID_PLAYLIST_VIEW_ARTIST), IconMgr::IconType::IT_Artist);
712 menu.AppendItem(EX_ID(ID_PLAYLIST_VIEW_ALBUM), IconMgr::IconType::IT_Album);
713 menu.AppendSeparator();
714 menu.AppendItem(EX_ID(ID_RENAME), IconMgr::IconType::IT_Rename);
715 menu.AppendItem(EX_ID(ID_EXPLORE_TRACK), IconMgr::IconType::IT_Folder_Explore);
716 menu.AppendItem(EX_ID(ID_ITEM_PROPERTY), IconMgr::IconType::IT_Info);
717 break;
718 case MenuMgr::RateMenu:
719 menu.CreateMenu(true, true);
720 menu.AppendItem(EX_ID(ID_RATING_1));
721 menu.AppendItem(EX_ID(ID_RATING_2));
722 menu.AppendItem(EX_ID(ID_RATING_3));
723 menu.AppendItem(EX_ID(ID_RATING_4));
724 menu.AppendItem(EX_ID(ID_RATING_5));
725 menu.AppendSeparator();
726 menu.AppendItem(EX_ID(ID_RATING_NONE));
727 break;
728 case MenuMgr::AddToPlaylistMenu:
729 menu.CreateMenu(true, true);
730 menu.AppendItem(EX_ID(ID_ADD_TO_NEW_PLAYLIST), IconMgr::IconType::IT_Add);
731 menu.AppendSeparator();
732 menu.AppendItem(EX_ID(ID_ADD_TO_DEFAULT_PLAYLIST));
733 menu.AppendItem(EX_ID(ID_ADD_TO_MY_FAVOURITE), IconMgr::IconType::IT_Favorite_On);
734 menu.SetUpdatePos(); // 设置Update插入点
735 menu.AppendSeparator();
736 menu.AppendItem(EX_ID(ID_ADD_TO_OTHER_PLAYLIST), IconMgr::IconType::IT_Playlist);
737 break;
738 case MenuMgr::MiniAreaMenu:
739 menu.CreateMenu(true, true);
740 menu.AppendItem(EX_ID(ID_SONG_INFO), IconMgr::IconType::IT_Info);
741 menu.AppendSubMenu(MainPlayCtrlRepeatModeMenu);
742 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
743 menu.AppendSeparator();
744 menu.AppendItem(EX_ID(ID_DOWNLOAD_LYRIC), IconMgr::IconType::IT_Download);
745 menu.AppendItem(EX_ID(ID_DOWNLOAD_ALBUM_COVER), IconMgr::IconType::IT_Album_Cover);
746 menu.AppendSeparator();
747 menu.AppendItem(EX_ID(ID_ADD_REMOVE_FROM_FAVOURITE), IconMgr::IconType::IT_Favorite_On);
748 menu.AppendSeparator();
749 menu.AppendItem(EX_ID(ID_MEDIA_LIB), IconMgr::IconType::IT_Media_Lib);
750 menu.AppendItem(EX_ID(ID_FIND), IconMgr::IconType::IT_Find);
751 menu.AppendItem(EX_ID(ID_EXPLORE_PATH), IconMgr::IconType::IT_Folder_Explore);
752 menu.AppendItem(EX_ID(ID_EQUALIZER), IconMgr::IconType::IT_Equalizer);
753 menu.AppendItem(EX_ID(ID_OPTION_SETTINGS), IconMgr::IconType::IT_Setting);
754 menu.AppendSeparator();
755 menu.AppendItem(EX_ID(ID_SHOW_PLAY_LIST), is_win11OrLater ? IconMgr::IconType::IT_NO_ICON : IconMgr::IconType::IT_Playlist, L"Ctrl+L");
756 menu.AppendItem(EX_ID(ID_MINI_MODE_ALWAYS_ON_TOP), is_win11OrLater ? IconMgr::IconType::IT_NO_ICON : IconMgr::IconType::IT_Pin);
757 menu.AppendSubMenu(MiniModeSwitchUiMenu, IconMgr::IconType::IT_Skin);
758 menu.AppendSeparator();
759 menu.AppendItem(EX_ID(ID_MINI_MIDE_MINIMIZE), IconMgr::IconType::IT_Minimize);
760 menu.AppendItem(EX_ID(IDOK), IconMgr::IconType::IT_Mini_Off, L"Esc");
761 menu.AppendItem(EX_ID(ID_MINI_MODE_EXIT), IconMgr::IconType::IT_Exit, L"Ctrl+X");
762 break;
763 case MenuMgr::MiniModeSwitchUiMenu:
764 menu.CreateMenu(true, true);
765 menu.AppendItem(EX_ID(ID_MINIMODE_UI_DEFAULT));
766 menu.SetUpdatePos(); // 设置Update插入点
767 break;
768 case MenuMgr::NotifyMenu:
769 menu.CreateMenu(true, false);
770 menu.AppendItem(EX_ID(ID_PLAY_PAUSE), IconMgr::IconType::IT_Play_Pause);
771 menu.AppendItem(EX_ID(ID_PREVIOUS), IconMgr::IconType::IT_Previous);
772 menu.AppendItem(EX_ID(ID_NEXT), IconMgr::IconType::IT_Next);
773 menu.AppendSubMenu(MainPlayCtrlRepeatModeMenu);
774 menu.AppendItem(EX_ID(ID_MINIMODE_RESTORE), IconMgr::IconType::IT_Mini_Off);
775 menu.AppendItem(EX_ID(ID_SHOW_DESKTOP_LYRIC), IconMgr::IconType::IT_Lyric);
776 menu.AppendItem(EX_ID(ID_LOCK_DESKTOP_LRYIC), IconMgr::IconType::IT_Lock);
777 menu.AppendSeparator();
778 menu.AppendItem(EX_ID(ID_OPTION_SETTINGS), IconMgr::IconType::IT_Setting);
779 menu.AppendItem(EX_ID(ID_MENU_EXIT), IconMgr::IconType::IT_Exit);
780 break;
781 case MenuMgr::LibSetPathMenu:
782 menu.CreateMenu(true, false);
783 menu.AppendItem(EX_ID(ID_PLAY_PATH), IconMgr::IconType::IT_Play);
784 menu.SetDefaultItem();
785 menu.AppendItem(EX_ID(ID_DELETE_PATH), IconMgr::IconType::IT_Cancel);
786 menu.AppendItem(EX_ID(ID_BROWSE_PATH), IconMgr::IconType::IT_Folder_Explore);
787 menu.AppendItem(EX_ID(ID_CONTAIN_SUB_FOLDER));
788 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
789 menu.AppendSeparator();
790 menu.AppendItem(EX_ID(ID_CLEAR_INVALID_PATH));
791 menu.AppendItem(EX_ID(ID_FILE_OPEN_FOLDER), IconMgr::IconType::IT_NewFolder);
792 menu.AppendItem(EX_ID(ID_LIB_FOLDER_PROPERTIES), IconMgr::IconType::IT_Info);
793 break;
794 case MenuMgr::LibPlaylistMenu:
795 menu.CreateMenu(true, false);
796 menu.AppendItem(EX_ID(ID_PLAY_PLAYLIST), IconMgr::IconType::IT_Play);
797 menu.SetDefaultItem();
798 menu.AppendItem(EX_ID(ID_RENAME_PLAYLIST), IconMgr::IconType::IT_Rename);
799 menu.AppendItem(EX_ID(ID_DELETE_PLAYLIST), IconMgr::IconType::IT_Cancel);
800 menu.AppendItem(EX_ID(ID_SAVE_AS_NEW_PLAYLIST), IconMgr::IconType::IT_Save);
801 menu.AppendItem(EX_ID(ID_PLAYLIST_SAVE_AS), IconMgr::IconType::IT_Save_As);
802 menu.AppendSeparator();
803 menu.AppendItem(EX_ID(ID_PLAYLIST_BROWSE_FILE), IconMgr::IconType::IT_Folder_Explore);
804 menu.AppendItem(EX_ID(ID_PLAYLIST_FIX_PATH_ERROR), IconMgr::IconType::IT_Fix);
805 menu.AppendSeparator();
806 menu.AppendItem(EX_ID(ID_NEW_PLAYLIST), IconMgr::IconType::IT_Add);
807 menu.AppendItem(EX_ID(ID_LIB_PLAYLIST_PROPERTIES), IconMgr::IconType::IT_Info);
808 break;
809 case MenuMgr::LibLeftMenu:
810 menu.CreateMenu(true, false);
811 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
812 menu.SetDefaultItem();
813 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
814 menu.AppendItem(EX_ID(ID_ADD_TO_NEW_PLAYLIST_AND_PLAY), IconMgr::IconType::IT_Play_In_Playlist);
815 menu.AppendSeparator();
816 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
817 break;
818 case MenuMgr::LibRightMenu:
819 menu.CreateMenu(true, false);
820 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
821 menu.SetDefaultItem();
822 menu.AppendItem(EX_ID(ID_PLAY_AS_NEXT), IconMgr::IconType::IT_Play_As_Next);
823 menu.AppendItem(EX_ID(ID_PLAY_ITEM_IN_FOLDER_MODE), IconMgr::IconType::IT_Play_In_Folder);
824 menu.AppendSeparator();
825 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
826 menu.AppendItem(EX_ID(ID_ADD_TO_NEW_PLAYLIST_AND_PLAY), IconMgr::IconType::IT_Play_In_Playlist);
827 menu.AppendSubMenu(RateMenu, IconMgr::IconType::IT_Star);
828 menu.AppendSeparator();
829 menu.AppendItem(EX_ID(ID_EXPLORE_ONLINE), IconMgr::IconType::IT_Online);
830 menu.AppendItem(EX_ID(ID_FORMAT_CONVERT), IconMgr::IconType::IT_Convert);
831 menu.AppendItem(EX_ID(ID_EXPLORE_TRACK), IconMgr::IconType::IT_Folder_Explore);
832 menu.AppendItem(EX_ID(ID_DELETE_FROM_DISK), IconMgr::IconType::IT_Cancel);
833 menu.AppendItem(EX_ID(ID_ITEM_PROPERTY), IconMgr::IconType::IT_Info);
834 menu.AppendSeparator();
835 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
836 break;
837 case MenuMgr::LibPlaylistRightMenu:
838 menu.CreateMenu(true, false);
839 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
840 menu.SetDefaultItem();
841 menu.AppendItem(EX_ID(ID_PLAY_AS_NEXT), IconMgr::IconType::IT_Play_As_Next);
842 menu.AppendItem(EX_ID(ID_PLAY_ITEM_IN_FOLDER_MODE), IconMgr::IconType::IT_Play_In_Folder);
843 menu.AppendSeparator();
844 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
845 menu.AppendItem(EX_ID(ID_ADD_TO_NEW_PLAYLIST_AND_PLAY), IconMgr::IconType::IT_Play_In_Playlist);
846 menu.AppendSubMenu(RateMenu, IconMgr::IconType::IT_Star);
847 menu.AppendSeparator();
848 menu.AppendItem(EX_ID(ID_EXPLORE_ONLINE), IconMgr::IconType::IT_Online);
849 menu.AppendItem(EX_ID(ID_FORMAT_CONVERT), IconMgr::IconType::IT_Convert);
850 menu.AppendItem(EX_ID(ID_EXPLORE_TRACK), IconMgr::IconType::IT_Folder_Explore);
851 menu.AppendItem(EX_ID(ID_REMOVE_FROM_PLAYLIST), IconMgr::IconType::IT_Cancel);
852 menu.AppendItem(EX_ID(ID_DELETE_FROM_DISK));
853 menu.AppendItem(EX_ID(ID_ITEM_PROPERTY), IconMgr::IconType::IT_Info);
854 menu.AppendSeparator();
855 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
856 break;
857 case MenuMgr::LibFolderExploreMenu:
858 menu.CreateMenu(true, false);
859 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
860 menu.SetDefaultItem();
861 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
862 menu.AppendItem(EX_ID(ID_ADD_TO_NEW_PLAYLIST_AND_PLAY), IconMgr::IconType::IT_Play_In_Playlist);
863 menu.AppendSeparator();
864 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
865 menu.AppendItem(EX_ID(ID_BROWSE_PATH), IconMgr::IconType::IT_Folder_Explore);
866 break;
867 case MenuMgr::UiLibLeftMenu:
868 menu.CreateMenu(true, false);
869 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
870 menu.SetDefaultItem();
871 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
872 menu.AppendItem(EX_ID(ID_ADD_TO_NEW_PLAYLIST_AND_PLAY), IconMgr::IconType::IT_Play_In_Playlist);
873 menu.AppendSeparator();
874 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
875 menu.AppendItem(EX_ID(ID_VIEW_IN_MEDIA_LIB), IconMgr::IconType::IT_Media_Lib);
876 break;
877 case MenuMgr::UiRecentPlayedMenu:
878 menu.CreateMenu(true, false);
879 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
880 menu.SetDefaultItem();
881 menu.AppendItem(EX_ID(ID_RECENT_PLAYED_REMOVE), IconMgr::IconType::IT_Close);
882 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
883 menu.AppendSeparator();
884 menu.AppendItem(EX_ID(ID_VIEW_IN_MEDIA_LIB), IconMgr::IconType::IT_Media_Lib);
885 menu.AppendItem(EX_ID(ID_LIB_RECENT_PLAYED_ITEM_PROPERTIES), IconMgr::IconType::IT_Info);
886 break;
887 case MenuMgr::UiMyFavouriteMenu:
888 menu.CreateMenu(true, false);
889 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
890 menu.SetDefaultItem();
891 menu.AppendItem(EX_ID(ID_PLAY_AS_NEXT), IconMgr::IconType::IT_Play_As_Next);
892 menu.AppendItem(EX_ID(ID_PLAY_ITEM_IN_FOLDER_MODE), IconMgr::IconType::IT_Play_In_Folder);
893 menu.AppendSubMenu(AddToPlaylistMenu, IconMgr::IconType::IT_Add);
894 menu.AppendSubMenu(RateMenu, IconMgr::IconType::IT_Star);
895 menu.AppendSeparator();
896 menu.AppendItem(EX_ID(ID_EXPLORE_ONLINE), IconMgr::IconType::IT_Online);
897 menu.AppendItem(EX_ID(ID_FORMAT_CONVERT), IconMgr::IconType::IT_Convert);
898 menu.AppendItem(EX_ID(ID_EXPLORE_TRACK), IconMgr::IconType::IT_Folder_Explore);
899 menu.AppendItem(EX_ID(ID_REMOVE_FROM_PLAYLIST), IconMgr::IconType::IT_Cancel);
900 menu.AppendItem(EX_ID(ID_DELETE_FROM_DISK));
901 menu.AppendItem(EX_ID(ID_ITEM_PROPERTY), IconMgr::IconType::IT_Info);
902 menu.AppendSeparator();
903 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
904 break;
905 case MenuMgr::LibPlaylistSortMenu:
906 menu.CreateMenu(true, false);
907 menu.AppendItem(EX_ID(ID_LIB_PLAYLIST_SORT_RECENT_PLAYED));
908 menu.AppendItem(EX_ID(ID_LIB_PLAYLIST_SORT_RECENT_CREATED));
909 menu.AppendItem(EX_ID(ID_LIB_PLAYLIST_SORT_NAME));
910 break;
911 case MenuMgr::LibFolderSortMenu:
912 menu.CreateMenu(true, false);
913 menu.AppendItem(EX_ID(ID_LIB_FOLDER_SORT_RECENT_PLAYED));
914 menu.AppendItem(EX_ID(ID_LIB_FOLDER_SORT_RECENT_ADDED));
915 menu.AppendItem(EX_ID(ID_LIB_FOLDER_SORT_PATH));
916 break;
917 case MenuMgr::LeMenu:
918 menu.CreateMenu(false, false);
919 menu.AppendSubMenu(LeFileMenu);
920 menu.AppendSubMenu(LeEditMenu);
921 menu.AppendSubMenu(LePlayCtrlMenu);
922 break;
923 case MenuMgr::LeFileMenu:
924 menu.CreateMenu(true, false);
925 menu.AppendItem(EX_ID(ID_LYRIC_OPEN), IconMgr::IconType::IT_Music);
926 menu.AppendItem(EX_ID(ID_LYRIC_SAVE), IconMgr::IconType::IT_Save, L"Ctrl+S");
927 menu.AppendItem(EX_ID(ID_LYRIC_SAVE_AS), IconMgr::IconType::IT_Save_As);
928 menu.AppendSeparator();
929 menu.AppendItem(EX_ID(IDCANCEL), IconMgr::IconType::IT_Exit);
930 break;
931 case MenuMgr::LeEditMenu:
932 menu.CreateMenu(true, false);
933 menu.AppendItem(EX_ID(ID_LYRIC_INSERT_TAG), IconMgr::IconType::IT_Le_Tag_Insert, L"F8");
934 menu.AppendItem(EX_ID(ID_LYRIC_REPLACE_TAG), IconMgr::IconType::IT_Le_Tag_Replace, L"F9");
935 menu.AppendItem(EX_ID(ID_LYRIC_DELETE_TAG), IconMgr::IconType::IT_Le_Tag_Delete, L"F10");
936 menu.AppendSeparator();
937 menu.AppendItem(EX_ID(ID_LYRIC_FIND), IconMgr::IconType::IT_Le_Find, L"Ctrl+F");
938 menu.AppendItem(EX_ID(ID_LYRIC_REPLACE), IconMgr::IconType::IT_Le_Replace, L"Ctrl+H");
939 menu.AppendItem(EX_ID(ID_FIND_NEXT), IconMgr::IconType::IT_NO_ICON, L"F3");
940 menu.AppendSeparator();
941 menu.AppendSubMenu(LeEditChConvMenu);
942 menu.AppendSeparator();
943 menu.AppendItem(EX_ID(ID_LRYIC_MERGE_SAME_TIME_TAG));
944 menu.AppendItem(EX_ID(ID_LYRIC_SWAP_TEXT_AND_TRANSLATION));
945 menu.AppendSubMenu(LeEditTagDislocMenu);
946 menu.AppendSubMenu(LeEditTranslateFormatConvertMenu);
947 break;
948 case MenuMgr::LeEditChConvMenu:
949 menu.CreateMenu(true, false);
950 menu.AppendItem(EX_ID(ID_LE_TRANSLATE_TO_SIMPLIFIED_CHINESE));
951 menu.AppendItem(EX_ID(ID_LE_TRANSLATE_TO_TRANDITIONAL_CHINESE));
952 break;
953 case MenuMgr::LeEditTagDislocMenu:
954 menu.CreateMenu(true, false);
955 menu.AppendItem(EX_ID(ID_LYRIC_TIME_TAG_FORWARD));
956 menu.AppendItem(EX_ID(ID_LYRIC_TIME_TAG_DELAY));
957 break;
958 case MenuMgr::LeEditTranslateFormatConvertMenu:
959 menu.CreateMenu(true, false);
960 menu.AppendItem(EX_ID(ID_LYRIC_AND_TRANSLATION_IN_SAME_LINE));
961 menu.AppendItem(EX_ID(ID_LYRIC_AND_TRANSLATION_IN_DIFFERENT_LINE));
962 break;
963 case MenuMgr::LePlayCtrlMenu:
964 menu.CreateMenu(true, false);
965 menu.AppendItem(EX_ID(ID_PLAY_PAUSE), IconMgr::IconType::IT_Play_Pause, L"Ctrl+P");
966 menu.AppendItem(EX_ID(ID_REW), IconMgr::IconType::IT_Rewind, CAcceleratorRes::Key(VK_LEFT, true).ToString().c_str());
967 menu.AppendItem(EX_ID(ID_FF), IconMgr::IconType::IT_Fast_Forward, CAcceleratorRes::Key(VK_RIGHT, true).ToString().c_str());
968 menu.AppendItem(EX_ID(ID_SEEK_TO_CUR_LINE), IconMgr::IconType::IT_Locate, L"Ctrl+G");
969 break;
970 case MenuMgr::FcListMenu:
971 menu.CreateMenu(true, false);
972 menu.AppendItem(EX_ID(ID_ADD_FILE), IconMgr::IconType::IT_Add);
973 menu.AppendItem(EX_ID(ID_CLEAR_LIST));
974 menu.AppendSeparator();
975 menu.AppendItem(EX_ID(ID_EDIT_TAG_INFO), IconMgr::IconType::IT_Edit);
976 menu.AppendItem(EX_ID(ID_DELETE_SELECT), IconMgr::IconType::IT_Cancel);
977 menu.AppendSeparator();
978 menu.AppendItem(EX_ID(ID_MOVE_UP), IconMgr::IconType::IT_NO_ICON, CAcceleratorRes::Key(VK_UP, true).ToString().c_str());
979 menu.AppendItem(EX_ID(ID_MOVE_DOWN), IconMgr::IconType::IT_NO_ICON, CAcceleratorRes::Key(VK_DOWN, true).ToString().c_str());
980 break;
981 case MenuMgr::LdListMenu:
982 menu.CreateMenu(true, false);
983 menu.AppendItem(EX_ID(ID_LD_LYRIC_DOWNLOAD), IconMgr::IconType::IT_Download);
984 menu.SetDefaultItem();
985 menu.AppendItem(EX_ID(ID_LD_PREVIEW));
986 menu.AppendItem(EX_ID(ID_LD_LYRIC_SAVEAS), IconMgr::IconType::IT_Save_As);
987 menu.AppendSeparator();
988 menu.AppendItem(EX_ID(ID_LD_COPY_TITLE));
989 menu.AppendItem(EX_ID(ID_LD_COPY_ARTIST));
990 menu.AppendItem(EX_ID(ID_LD_COPY_ALBUM));
991 menu.AppendItem(EX_ID(ID_LD_COPY_ID));
992 menu.AppendSeparator();
993 menu.AppendItem(EX_ID(ID_LD_RELATE));
994 menu.AppendItem(EX_ID(ID_LD_VIEW_ONLINE), IconMgr::IconType::IT_Online);
995 break;
996 case MenuMgr::OptDlrcDefStyleMenu:
997 menu.CreateMenu(true, false);
998 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE1));
999 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE2));
1000 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE3));
1001 menu.AppendSeparator();
1002 menu.AppendSubMenu(OptDlrcModDefStyleMenu);
1003 break;
1004 case MenuMgr::OptDlrcModDefStyleMenu:
1005 menu.CreateMenu(true, false);
1006 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE1_MODIFY));
1007 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE2_MODIFY));
1008 menu.AppendItem(EX_ID(ID_LYRIC_DEFAULT_STYLE3_MODIFY));
1009 menu.AppendSeparator();
1010 menu.AppendItem(EX_ID(ID_RESTORE_DEFAULT_STYLE));
1011 break;
1012 case MenuMgr::PropertyAdvMenu:
1013 menu.CreateMenu(true, false);
1014 menu.AppendItem(EX_ID(ID_COPY_TEXT));
1015 menu.AppendItem(EX_ID(ID_COPY_ALL_TEXT));
1016 break;
1017 case MenuMgr::PropertyCoverMenu:
1018 menu.CreateMenu(true, false);
1019 menu.AppendItem(EX_ID(ID_COVER_BROWSE), IconMgr::IconType::IT_Folder_Explore);
1020 menu.AppendItem(EX_ID(ID_COVER_DELETE), IconMgr::IconType::IT_Cancel);
1021 menu.AppendItem(EX_ID(ID_COVER_SAVE_AS), IconMgr::IconType::IT_Save_As);
1022 menu.AppendItem(EX_ID(ID_COMPRESS_SIZE));
1023 break;
1024 case MenuMgr::FindListMenu:
1025 menu.CreateMenu(true, false);
1026 menu.AppendItem(EX_ID(ID_PLAY_ITEM), IconMgr::IconType::IT_Play);
1027 menu.SetDefaultItem();
1028 menu.AppendItem(EX_ID(ID_COPY_TEXT), IconMgr::IconType::IT_Copy);
1029 menu.AppendSeparator();
1030 menu.AppendItem(EX_ID(ID_VIEW_IN_MEDIA_LIB), IconMgr::IconType::IT_Media_Lib);
1031 menu.AppendItem(EX_ID(ID_LIB_RECENT_PLAYED_ITEM_PROPERTIES), IconMgr::IconType::IT_Info);
1032 break;
1033 default:
1034 ASSERT(false); // 参数错误或缺少case或缺少break
1035 menu.CreateMenu(true, true); // 创建一个空的弹出菜单占位
1036 break;
1037 }
1038 }
1039