xref: /MusicPlayer2/MusicPlayer2/MiniModeDlg.cpp (revision 6b7ddf6c92480f106e66eb7258565483c0ab41c0)
1 // MiniModeDlg.cpp : 实现文件
2 //
3 
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "MiniModeDlg.h"
7 #include "MusicPlayerDlg.h"
8 #include "MiniModeUserUi.h"
9 #include "SongInfoHelper.h"
10 #include "WinVersionHelper.h"
11 
12 // CMiniModeDlg 对话框
13 
IMPLEMENT_DYNAMIC(CMiniModeDlg,CDialogEx)14 IMPLEMENT_DYNAMIC(CMiniModeDlg, CDialogEx)
15 
16 CMiniModeDlg::CMiniModeDlg(int& item_selected, vector<int>& items_selected, CWnd* pParent /*=NULL*/)
17     : CDialogEx(IDD_MINI_DIALOG, pParent), m_item_selected{ item_selected }, m_items_selected{ items_selected }
18 {
19     //更改窗口的类名
20     WNDCLASS wc;
21     ::GetClassInfo(AfxGetInstanceHandle(), _T("#32770"), &wc);
22     wc.lpszClassName = _T("MiniDlg_ByH87M");
23     AfxRegisterClass(&wc);
24 
25     //初始化界面类
26     m_ui_list.push_back(std::make_shared<CMiniModeUserUi>(this, IDR_MINI_UI0)); // 默认界面
27     std::vector<std::wstring> skin_files;
28     CCommon::GetFiles(theApp.m_local_dir + L"skins\\miniMode\\*.xml", skin_files);
29     for (const auto& file_name : skin_files)
30     {
31         m_ui_list.push_back(std::make_shared<CMiniModeUserUi>(this, theApp.m_local_dir + L"skins\\miniMode\\" + file_name));
32     }
33 
34 }
35 
~CMiniModeDlg()36 CMiniModeDlg::~CMiniModeDlg()
37 {
38 }
39 
DoDataExchange(CDataExchange * pDX)40 void CMiniModeDlg::DoDataExchange(CDataExchange* pDX)
41 {
42     CDialogEx::DoDataExchange(pDX);
43     DDX_Control(pDX, IDC_LIST2, m_playlist_ctrl);
44 }
45 
SaveConfig() const46 void CMiniModeDlg::SaveConfig() const
47 {
48     CIniHelper ini(theApp.m_config_path);
49     ini.WriteInt(L"mini_mode", L"position_x", m_position_x);
50     ini.WriteInt(L"mini_mode", L"position_y", m_position_y);
51     ini.WriteBool(L"mini_mode", L"always_on_top", m_always_on_top);
52     ini.WriteInt(L"mini_mode", L"ui_index", m_ui_index);
53     ini.WriteBool(L"mini_mode", L"use_ui_playlist", m_use_ui_playlist);
54     ini.Save();
55 }
56 
LoadConfig()57 void CMiniModeDlg::LoadConfig()
58 {
59     CIniHelper ini(theApp.m_config_path);
60     m_position_x = ini.GetInt(L"mini_mode", L"position_x", -1);
61     m_position_y = ini.GetInt(_T("mini_mode"), _T("position_y"), -1);
62     m_always_on_top = ini.GetBool(_T("mini_mode"), _T("always_on_top"), true);
63     m_ui_index = ini.GetInt(L"mini_mode", L"ui_index", 1);
64     if (m_ui_index < 0 || m_ui_index >= static_cast<int>(m_ui_list.size()))
65         m_ui_index = 0;
66     m_use_ui_playlist = ini.GetBool(L"mini_mode", L"use_ui_playlist", CWinVersionHelper::IsWindows10OrLater()); //仅Win10以上系统使用自绘播放列表,Win7下有播放列表鼠标滚轮无法响应的问题
67 }
68 
GetCurUi()69 CPlayerUIBase* CMiniModeDlg::GetCurUi()
70 {
71     if (m_ui_index >= 0 && m_ui_index < static_cast<int>(m_ui_list.size()))
72         return m_ui_list[m_ui_index].get();
73     return nullptr;
74 }
75 
SetTitle()76 void CMiniModeDlg::SetTitle()
77 {
78     CString title;
79     title = CSongInfoHelper::GetDisplayStr(CPlayer::GetInstance().GetCurrentSongInfo(), theApp.m_media_lib_setting_data.display_format).c_str();
80     if (!title.IsEmpty())
81         title += _T(" - ");
82     title += APP_NAME;
83     SetWindowText(title);
84 }
85 
86 
SetAlwaysOnTop()87 void CMiniModeDlg::SetAlwaysOnTop()
88 {
89     if (m_always_on_top)
90         SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);			//设置置顶
91     else
92         SetWindowPos(&wndNoTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);		//取消置顶
93 }
94 
AdjustWindowSize()95 void CMiniModeDlg::AdjustWindowSize()
96 {
97     //获取窗口大小
98     int width{}, height{}, height_with_playlist{};
99     CalculateWindowSize(width, height, height_with_playlist);
100     m_ui_width = width;
101     m_ui_height = height;
102     if (width != 0 && height != 0)
103     {
104         SetWindowPos(nullptr, 0, 0, width, (m_show_playlist ? height_with_playlist : height), SWP_NOMOVE | SWP_NOZORDER);
105     }
106 
107     MoveWindowPos();
108     SetAlwaysOnTop();
109 
110     Invalidate();
111 
112     //初始化播放列表控件的位置
113     CRect playlist_rect;
114     int margin = 0;
115     playlist_rect.left = margin;
116     playlist_rect.right = width - margin;
117     playlist_rect.top = height + margin;
118     playlist_rect.bottom = height_with_playlist - margin;
119     m_playlist_ctrl.MoveWindow(playlist_rect);
120     m_playlist_ctrl.AdjustColumnWidth();
121 
122 }
123 
CalculateWindowSize(int & width,int & height,int & height_with_playlist)124 bool CMiniModeDlg::CalculateWindowSize(int& width, int& height, int& height_with_playlist)
125 {
126     CPlayerUIBase* cur_ui{ GetCurUi() };
127     if (cur_ui == nullptr)
128         return false;
129     CMiniModeUserUi* user_ui = dynamic_cast<CMiniModeUserUi*>(cur_ui);
130     if (user_ui != nullptr)
131     {
132         user_ui->GetUiSize(width, height, height_with_playlist);
133     }
134     return true;
135 }
136 
BEGIN_MESSAGE_MAP(CMiniModeDlg,CDialogEx)137 BEGIN_MESSAGE_MAP(CMiniModeDlg, CDialogEx)
138     ON_WM_LBUTTONDOWN()
139     ON_WM_TIMER()
140     ON_WM_DESTROY()
141     //ON_WM_MOVE()
142     ON_WM_RBUTTONUP()
143     ON_COMMAND(ID_MINI_MODE_EXIT, &CMiniModeDlg::OnMiniModeExit)
144     ON_WM_INITMENU()
145     ON_WM_LBUTTONDBLCLK()
146     ON_NOTIFY(NM_DBLCLK, IDC_LIST2, &CMiniModeDlg::OnNMDblclkList2)
147     ON_NOTIFY(NM_RCLICK, IDC_LIST2, &CMiniModeDlg::OnNMRClickList2)
148     ON_WM_PAINT()
149     ON_WM_MOUSEMOVE()
150     ON_WM_LBUTTONUP()
151     ON_COMMAND(ID_SHOW_PLAY_LIST, &CMiniModeDlg::OnShowPlayList)
152     ON_WM_MOUSELEAVE()
153     ON_WM_SETCURSOR()
154     ON_COMMAND(ID_MINI_MIDE_MINIMIZE, &CMiniModeDlg::OnMiniMideMinimize)
155     ON_MESSAGE(WM_LIST_ITEM_DRAGGED, &CMiniModeDlg::OnListItemDragged)
156     ON_COMMAND(ID_MINI_MODE_ALWAYS_ON_TOP, &CMiniModeDlg::OnMiniModeAlwaysOnTop)
157     //ON_MESSAGE(WM_TIMER_INTERVAL_CHANGED, &CMiniModeDlg::OnTimerIntervalChanged)
158     ON_WM_EXITSIZEMOVE()
159     ON_MESSAGE(WM_TABLET_QUERYSYSTEMGESTURESTATUS, &CMiniModeDlg::OnTabletQuerysystemgesturestatus)
160     ON_WM_MOUSEWHEEL()
161     ON_WM_RBUTTONDOWN()
162 END_MESSAGE_MAP()
163 
164 
165 // CMiniModeDlg 消息处理程序
166 
167 
168 void CMiniModeDlg::Init()
169 {
170     //载入配置
171     LoadConfig();
172 
173     // 初始化“mini模式切换界面”菜单
174     vector<MenuMgr::MenuItem> menu_list;
175     menu_list.emplace_back(MenuMgr::MenuItem{});        // 插入一个分隔符
176     for (size_t i = 1; i < m_ui_list.size(); ++i)       // 跳过第一个默认界面
177     {
178         // 转换到派生类以调用SetIndex/GetUIName
179         if (auto ui_mini = std::dynamic_pointer_cast<CMiniModeUserUi>(m_ui_list[i]))
180         {
181             ui_mini->SetIndex(menu_list.size());        // 设置界面序号
182             wstring str_name = ui_mini->GetUIName();    // 获取界面的名称
183             if (str_name.empty())                       // 如果名称为空(没有指定名称),则使用“迷你模式 + 数字”的默认名称
184                 str_name = theApp.m_str_table.LoadTextFormat(L"TXT_UI_NAME_MINI_DEFAULT", { i });
185             UINT id = ID_MINIMODE_UI_DEFAULT + i;
186             menu_list.emplace_back(MenuMgr::MenuItem{ id, IconMgr::IconType::IT_NO_ICON, str_name });
187 
188             if (ID_MINIMODE_UI_DEFAULT + i >= ID_MINIMODE_UI_MAX)
189                 break;
190         }
191     }
192     if (menu_list.size() > 1)                           // 如果只有一个分隔符就不更新
193         theApp.m_menu_mgr.UpdateMenu(MenuMgr::MiniModeSwitchUiMenu, menu_list);
194 }
195 
UpdatePlayPauseButton()196 void CMiniModeDlg::UpdatePlayPauseButton()
197 {
198     CPlayerUIBase* cur_ui{ GetCurUi() };
199     if (cur_ui != nullptr)
200         cur_ui->UpdatePlayPauseButtonTip();
201 }
202 
ShowPlaylist()203 void CMiniModeDlg::ShowPlaylist()
204 {
205     m_playlist_ctrl.ShowPlaylist(theApp.m_media_lib_setting_data.display_format);
206     SetPlayListColor();
207     m_playlist_ctrl.SetCurSel(-1);
208 }
209 
SetPlayListColor()210 void CMiniModeDlg::SetPlayListColor()
211 {
212     m_playlist_ctrl.SetHightItem(CPlayer::GetInstance().GetIndex());
213     //m_playlist_ctrl.SetColor(theApp.m_app_setting_data.theme_color);
214     m_playlist_ctrl.EnsureVisible(CPlayer::GetInstance().GetIndex(), FALSE);
215 }
216 
MoveWindowPos()217 void CMiniModeDlg::MoveWindowPos()
218 {
219     CRect rect;
220     GetWindowRect(rect);
221     MoveWindow(rect + CCommon::CalculateWindowMoveOffset(rect, theApp.m_screen_rects));
222 }
223 
OnInitDialog()224 BOOL CMiniModeDlg::OnInitDialog()
225 {
226     CDialogEx::OnInitDialog();
227 
228     // TODO:  在此添加额外的初始化
229 
230     // 设置mini窗口为工具窗口使其不在多任务切换界面显示并可跨虚拟桌面
231     SetWindowLongW(m_hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
232 
233     m_playlist_ctrl.SetFont(&theApp.m_font_set.dlg.GetFont());
234 
235     //如果使用UI播放列表,则隐藏播放列表控件
236     if (m_use_ui_playlist)
237     {
238         m_playlist_ctrl.ShowWindow(SW_HIDE);
239         m_playlist_ctrl.SetCtrlAEnable(false);
240     }
241 
242     m_pDC = GetDC();
243     for (auto& ui : m_ui_list)
244     {
245         ui->Init(m_pDC);
246 
247         CUserUi* cur_ui{ dynamic_cast<CUserUi*>(ui.get()) };
248         if (cur_ui != nullptr)
249             cur_ui->InitSearchBox(this);
250     }
251 
252     m_show_playlist = false;
253 
254     //初始化窗口位置
255     if (m_position_x != -1 && m_position_y != -1)
256         SetWindowPos(nullptr, m_position_x, m_position_y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
257 
258     //获取窗口大小
259     AdjustWindowSize();
260 
261     //设置定时器
262     SetTimer(TIMER_ID_MINI, TIMER_ELAPSE_MINI, NULL);	//设置主定时器
263     SetTimer(TIMER_ID_MINI2, TIMER_ELAPSE, NULL);		//设置用于界面刷新的定时器
264 
265     //显示播放列表
266     ShowPlaylist();
267 
268     SetDragEnable();
269     m_playlist_ctrl.EnableWindow(!CPlayer::GetInstance().m_loading);
270 
271     //设置窗口不透明度
272     SetTransparency();
273 
274     m_show_playlist = false;
275     m_first_start = true;
276 
277     return TRUE;  // return TRUE unless you set the focus to a control
278     // 异常: OCX 属性页应返回 FALSE
279 }
280 
281 
OnLButtonDown(UINT nFlags,CPoint point)282 void CMiniModeDlg::OnLButtonDown(UINT nFlags, CPoint point)
283 {
284     // TODO: 在此添加消息处理程序代码和/或调用默认值
285     CPlayerUIBase* cur_ui{ GetCurUi() };
286     if (cur_ui != nullptr)
287     {
288         if (!cur_ui->PointInControlArea(point))
289             PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
290 
291         cur_ui->LButtonDown(point);
292     }
293     CDialogEx::OnLButtonDown(nFlags, point);
294 }
295 
296 
OnTimer(UINT_PTR nIDEvent)297 void CMiniModeDlg::OnTimer(UINT_PTR nIDEvent)
298 {
299     // TODO: 在此添加消息处理程序代码和/或调用默认值
300     if (nIDEvent == TIMER_ID_MINI)
301     {
302         //更新鼠标提示
303         static SongInfo last_song_info;
304         const SongInfo& song_info = CPlayer::GetInstance().GetCurrentSongInfo();
305         //如果当前播放的歌曲发生变化,就更新鼠标提示信息
306         if (!song_info.IsSameSong(last_song_info))
307         {
308             last_song_info = song_info;
309             SetTitle();
310             m_draw_reset = true;
311         }
312     }
313     if (nIDEvent == TIMER_ID_MINI2)
314     {
315         if (m_first_start)
316         {
317             SetTitle();
318         }
319         m_first_start = false;
320     }
321     CDialogEx::OnTimer(nIDEvent);
322 }
323 
324 
SetVolume(int step)325 void CMiniModeDlg::SetVolume(int step)
326 {
327     CPlayer::GetInstance().MusicControl(Command::VOLUME_ADJ, step);
328 
329     CUserUi* cur_ui{ dynamic_cast<CUserUi*>(GetCurUi()) };
330     if (cur_ui != nullptr)
331         cur_ui->VolumeAdjusted();
332 }
333 
SetTransparency()334 void CMiniModeDlg::SetTransparency()
335 {
336     CCommon::SetWindowOpacity(m_hWnd, theApp.m_app_setting_data.window_transparency);
337 }
338 
SetDragEnable()339 void CMiniModeDlg::SetDragEnable()
340 {
341     m_playlist_ctrl.SetDragEnable(CPlayer::GetInstance().IsPlaylistMode() && !theApp.m_media_lib_setting_data.disable_drag_sort);
342 }
343 
GetPlaylistItemSelected()344 void CMiniModeDlg::GetPlaylistItemSelected()
345 {
346     m_item_selected = m_playlist_ctrl.GetCurSel();          // 获取鼠标选中的项目
347     m_playlist_ctrl.GetItemSelected(m_items_selected);      // 获取多个选中的项目
348 }
349 
DrawInfo()350 void CMiniModeDlg::DrawInfo()
351 {
352     if (!IsIconic() && IsWindowVisible())		//窗口最小化或隐藏时不绘制,以降低CPU利用率
353     {
354         CPlayerUIBase* cur_ui{ GetCurUi() };
355         if (cur_ui != nullptr)
356         {
357             cur_ui->DrawInfo(m_draw_reset);
358             m_draw_reset = false;
359         }
360     }
361 }
362 
PreTranslateMessage(MSG * pMsg)363 BOOL CMiniModeDlg::PreTranslateMessage(MSG* pMsg)
364 {
365     // TODO: 在此添加专用代码和/或调用基类
366 
367     if (pMsg->message == WM_KEYDOWN)
368     {
369         if (pMsg->wParam == VK_ESCAPE)
370         {
371             OnOK();		//按ESC键返回主窗口
372             return TRUE;
373         }
374         if (pMsg->wParam == VK_RETURN) return TRUE;
375 
376         //按上下方向键调整音量
377         if (pMsg->wParam == VK_UP)
378         {
379             SetVolume(theApp.m_nc_setting_data.volum_step);
380             return TRUE;
381         }
382         if (pMsg->wParam == VK_DOWN)
383         {
384             SetVolume(-theApp.m_nc_setting_data.volum_step);
385             return TRUE;
386         }
387 
388         if ((GetKeyState(VK_CONTROL) & 0x80))
389         {
390             //按Ctrl+X退出
391             if (pMsg->wParam == 'X')
392             {
393                 OnCancel();
394                 return TRUE;
395             }
396             //按Ctrl+M回到主窗口
397             if (pMsg->wParam == 'M')
398             {
399                 OnOK();
400                 return TRUE;
401             }
402 
403             if (pMsg->wParam == 'L')
404             {
405                 OnShowPlayList();
406                 return TRUE;
407             }
408 
409             //按Ctrl+A自绘播放列表全选
410             if (pMsg->wParam == 'A')
411             {
412                 CMiniModeUserUi* cur_ui{ dynamic_cast<CMiniModeUserUi*>(GetCurUi()) };
413                 if (cur_ui != nullptr)
414                 {
415                     auto playlist = cur_ui->GetPlaylist();
416                     if (playlist != nullptr)
417                         playlist->SelectAll();
418                 }
419             }
420         }
421 
422         if (pMsg->wParam == VK_APPS)		//按菜单键弹出主菜单
423         {
424             CRect rect;
425             GetWindowRect(rect);
426             theApp.m_menu_mgr.GetMenu(MenuMgr::MainAreaMenu)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, rect.left, rect.bottom, this);
427             return TRUE;
428         }
429 
430         if (WM_KEYFIRST <= pMsg->message && pMsg->message <= WM_KEYLAST)
431         {
432             //响应Accelerator中设置的快捷键
433             CMusicPlayerDlg* main_wnd = CMusicPlayerDlg::GetInstance();
434             if (main_wnd != nullptr && main_wnd->GetAccel() && ::TranslateAccelerator(m_hWnd, main_wnd->GetAccel(), pMsg))
435                 return TRUE;
436         }
437     }
438 
439     if (pMsg->message == WM_MOUSEWHEEL)                         // 将滚轮消息转发给主窗口处理音量调整
440     {
441         CRect rect{};
442         GetWindowRect(rect);
443         CRect m_ui_rect{ rect.left, rect.top, rect.left + m_ui_width, rect.top + m_ui_height };
444         if (m_ui_rect.PtInRect(pMsg->pt))   // 仅自绘区域可调整音量
445         {
446             if (CWnd* pMainWnd = AfxGetMainWnd())
447             {
448                 POINT pt = { INT16_MAX, INT16_MAX };                // 修改pt参数为一个特殊值
449                 LPARAM lParam = MAKELPARAM(pt.x, pt.y);
450                 pMainWnd->SendMessage(WM_MOUSEWHEEL, pMsg->wParam, lParam);
451                 return TRUE;
452             }
453         }
454     }
455 
456     if (pMsg->message == WM_MOUSEMOVE)
457     {
458         CPlayerUIBase* cur_ui{ GetCurUi() };
459         if (cur_ui != nullptr)
460             cur_ui->GetToolTipCtrl().RelayEvent(pMsg);
461     }
462 
463     return CDialogEx::PreTranslateMessage(pMsg);
464 }
465 
466 
OnDestroy()467 void CMiniModeDlg::OnDestroy()
468 {
469     CDialogEx::OnDestroy();
470 
471     // TODO: 在此处添加消息处理程序代码
472     CRect rect;
473     GetWindowRect(rect);
474     m_position_x = rect.left;
475     m_position_y = rect.top + m_playlist_y_offset;
476     m_playlist_y_offset = 0;
477     SaveConfig();
478     KillTimer(TIMER_ID_MINI);
479     //m_menu.DestroyMenu();
480     ReleaseDC(m_pDC);
481 }
482 
483 
484 //void CMiniModeDlg::OnMove(int x, int y)
485 //{
486 //    CDialogEx::OnMove(x, y);
487 //
488 //    // TODO: 在此处添加消息处理程序代码
489 //    MoveWindowPos();
490 //}
491 
492 
OnRButtonUp(UINT nFlags,CPoint point)493 void CMiniModeDlg::OnRButtonUp(UINT nFlags, CPoint point)
494 {
495     // TODO: 在此添加消息处理程序代码和/或调用默认值
496     //设置点击鼠标右键弹出菜单
497     CPoint point1;	//定义一个用于确定光标位置的位置
498     GetCursorPos(&point1);	//获取当前光标的位置,以便使得菜单可以跟随光标
499     if (nFlags == MK_SHIFT)		//按住Shift键点击鼠标右键时,弹出系统菜单
500     {
501         theApp.m_menu_mgr.GetMenu(MenuMgr::MainPopupMenu)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this);
502     }
503     else
504     {
505         CRect rect_ui(CPoint(0, 0), CSize(m_ui_width, m_ui_height));
506         if (rect_ui.PtInRect(point))
507         {
508             CMenu* pContextMenu = theApp.m_menu_mgr.GetMenu(MenuMgr::MiniAreaMenu);
509             pContextMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this); //在指定位置显示弹出菜单
510         }
511         else
512         {
513             CPlayerUIBase* cur_ui{ GetCurUi() };
514             if (cur_ui != nullptr)
515                 cur_ui->RButtonUp(point);
516         }
517     }
518 
519     CDialogEx::OnRButtonUp(nFlags, point);
520 }
521 
522 
OnMiniModeExit()523 void CMiniModeDlg::OnMiniModeExit()
524 {
525     // TODO: 在此添加命令处理程序代码
526     //执行退出命令时让对话框返回IDCANCEL,主窗口检测到这个返回值时就退出程序。
527     OnCancel();
528 }
529 
530 
OnInitMenu(CMenu * pMenu)531 void CMiniModeDlg::OnInitMenu(CMenu* pMenu)
532 {
533     CDialogEx::OnInitMenu(pMenu);
534 
535     // TODO: 在此处添加消息处理程序代码
536     CMusicPlayerDlg* pPlayerDlg = CMusicPlayerDlg::GetInstance();
537     if (pPlayerDlg != nullptr)
538         pPlayerDlg->m_pCurMenu = pMenu;
539 
540     //设置复选菜单项的勾选
541     pMenu->CheckMenuItem(ID_SHOW_PLAY_LIST, MF_BYCOMMAND | (m_show_playlist ? MF_CHECKED : MF_UNCHECKED));
542     pMenu->CheckMenuItem(ID_ADD_REMOVE_FROM_FAVOURITE, MF_BYCOMMAND | (CPlayer::GetInstance().IsFavourite() ? MF_CHECKED : MF_UNCHECKED));
543     pMenu->CheckMenuItem(ID_MINI_MODE_ALWAYS_ON_TOP, MF_BYCOMMAND | (m_always_on_top ? MF_CHECKED : MF_UNCHECKED));
544 
545     //设置“切换界面”菜单的状态
546     pMenu->CheckMenuRadioItem(ID_MINIMODE_UI_DEFAULT, ID_MINIMODE_UI_MAX, ID_MINIMODE_UI_DEFAULT + m_ui_index, MF_BYCOMMAND | MF_CHECKED);
547 
548 
549     theApp.m_pMainWnd->SendMessage(WM_SET_MENU_STATE, (WPARAM)pMenu);
550 }
551 
552 
OnLButtonDblClk(UINT nFlags,CPoint point)553 void CMiniModeDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
554 {
555     // TODO: 在此添加消息处理程序代码和/或调用默认值
556     //if(!m_ui.PointInControlArea(point))
557     //	OnOK();
558 
559     CPlayerUIBase* cur_ui{ GetCurUi() };
560     if (cur_ui != nullptr)
561         cur_ui->DoubleClick(point);
562 
563     CDialogEx::OnLButtonDblClk(nFlags, point);
564 }
565 
566 
OnNMDblclkList2(NMHDR * pNMHDR,LRESULT * pResult)567 void CMiniModeDlg::OnNMDblclkList2(NMHDR *pNMHDR, LRESULT *pResult)
568 {
569     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
570     // TODO: 在此添加控件通知处理程序代码
571     if (pNMItemActivate->iItem < 0)
572         return;
573     m_item_selected = pNMItemActivate->iItem;
574     theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_PLAY_ITEM);
575 
576     *pResult = 0;
577 }
578 
579 
OnNMRClickList2(NMHDR * pNMHDR,LRESULT * pResult)580 void CMiniModeDlg::OnNMRClickList2(NMHDR *pNMHDR, LRESULT *pResult)
581 {
582     LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
583     // TODO: 在此添加控件通知处理程序代码
584     m_item_selected = pNMItemActivate->iItem;	//获取鼠标选中的项目
585     m_playlist_ctrl.GetItemSelected(m_items_selected);
586 
587     CMenu* pContextMenu = theApp.m_menu_mgr.GetMenu(MenuMgr::PlaylistMenu);
588     m_playlist_ctrl.ShowPopupMenu(pContextMenu, pNMItemActivate->iItem, this);
589     *pResult = 0;
590 }
591 
592 
OnPaint()593 void CMiniModeDlg::OnPaint()
594 {
595     CPaintDC dc(this); // device context for painting
596     // TODO: 在此处添加消息处理程序代码
597     // 不为绘图消息调用 CDialogEx::OnPaint()
598     //m_ui.DrawInfo();
599 }
600 
601 
OnMouseMove(UINT nFlags,CPoint point)602 void CMiniModeDlg::OnMouseMove(UINT nFlags, CPoint point)
603 {
604     // TODO: 在此添加消息处理程序代码和/或调用默认值
605     CPlayerUIBase* cur_ui{ GetCurUi() };
606     if (cur_ui != nullptr)
607         cur_ui->MouseMove(point);
608 
609     CDialogEx::OnMouseMove(nFlags, point);
610 }
611 
612 
OnLButtonUp(UINT nFlags,CPoint point)613 void CMiniModeDlg::OnLButtonUp(UINT nFlags, CPoint point)
614 {
615     // TODO: 在此添加消息处理程序代码和/或调用默认值
616     CPlayerUIBase* cur_ui{ GetCurUi() };
617     if (cur_ui != nullptr)
618         cur_ui->LButtonUp(point);
619 
620     CDialogEx::OnLButtonUp(nFlags, point);
621 }
622 
623 
OnShowPlayList()624 void CMiniModeDlg::OnShowPlayList()
625 {
626     // TODO: 在此添加命令处理程序代码
627     CRect rect{};
628     GetWindowRect(rect);
629     //获取窗口大小
630     int width{}, height{}, height_with_playlist{};
631     CalculateWindowSize(width, height, height_with_playlist);
632     if (m_show_playlist)
633     {
634         SetWindowPos(nullptr, rect.left, rect.top + m_playlist_y_offset, width, height, SWP_NOZORDER);
635         m_playlist_y_offset = 0;
636         m_show_playlist = false;
637     }
638     else
639     {
640         rect.bottom = rect.top + height_with_playlist;
641         POINT tmp{ CCommon::CalculateWindowMoveOffset(rect, theApp.m_screen_rects) };    // 向下展开播放列表所需偏移量
642         ASSERT(tmp.x == 0); // 此函数不处理横向偏移,需要由OnExitSizeMove及MoveWindowPos保证横向在屏幕内
643         // 向下展开播放列表并记录窗口还原偏移量,自行拖动窗口时偏移量会清零
644         m_playlist_y_offset = -tmp.y;
645         SetWindowPos(nullptr, rect.left, rect.top + tmp.y, width, height_with_playlist, SWP_NOZORDER);
646         m_show_playlist = true;
647     }
648 }
649 
650 
OnMouseLeave()651 void CMiniModeDlg::OnMouseLeave()
652 {
653     // TODO: 在此添加消息处理程序代码和/或调用默认值
654     CPlayerUIBase* cur_ui{ GetCurUi() };
655     if (cur_ui != nullptr)
656         cur_ui->MouseLeave();
657 
658     CDialogEx::OnMouseLeave();
659 }
660 
661 
OnSetCursor(CWnd * pWnd,UINT nHitTest,UINT message)662 BOOL CMiniModeDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
663 {
664     // TODO: 在此添加消息处理程序代码和/或调用默认值
665     CPlayerUIBase* cur_ui{ GetCurUi() };
666     if (cur_ui != nullptr && cur_ui->SetCursor())
667         return TRUE;
668     else
669         return CDialogEx::OnSetCursor(pWnd, nHitTest, message);
670 }
671 
672 
OnMiniMideMinimize()673 void CMiniModeDlg::OnMiniMideMinimize()
674 {
675     // TODO: 在此添加命令处理程序代码
676     ShowWindow(HIDE_WINDOW);
677 }
678 
679 
OnListItemDragged(WPARAM wParam,LPARAM lParam)680 afx_msg LRESULT CMiniModeDlg::OnListItemDragged(WPARAM wParam, LPARAM lParam)
681 {
682     theApp.m_pMainWnd->SendMessage(WM_LIST_ITEM_DRAGGED, wParam, lParam);
683     return 0;
684 }
685 
686 
OnCommand(WPARAM wParam,LPARAM lParam)687 BOOL CMiniModeDlg::OnCommand(WPARAM wParam, LPARAM lParam)
688 {
689     // TODO: 在此添加专用代码和/或调用基类
690     WORD command = LOWORD(wParam);
691 
692     if (command == ID_PLAYLIST_SELECT_CHANGE)       // 更新播放列表选中项
693     {
694         GetPlaylistItemSelected();
695         return true;
696     }
697     if ((command >= ID_ADD_TO_DEFAULT_PLAYLIST && command <= ID_ADD_TO_MY_FAVOURITE + ADD_TO_PLAYLIST_MAX_SIZE)
698         || command == ID_ADD_TO_OTHER_PLAYLIST)
699     {
700         theApp.m_pMainWnd->SendMessage(WM_COMMAND, wParam, lParam);
701         return TRUE;
702     }
703 
704     //响应切换界面命令
705     if (command >= ID_MINIMODE_UI_DEFAULT && command <= ID_MINIMODE_UI_MAX)
706     {
707         m_ui_index = command - ID_MINIMODE_UI_DEFAULT;
708         CPlayerUIBase* cur_ui = GetCurUi();
709         if (cur_ui != nullptr)
710             cur_ui->UpdateSongInfoToolTip();
711         AdjustWindowSize();
712         return TRUE;
713     }
714 
715     return CDialogEx::OnCommand(wParam, lParam);
716 }
717 
718 
OnMiniModeAlwaysOnTop()719 void CMiniModeDlg::OnMiniModeAlwaysOnTop()
720 {
721     // TODO: 在此添加命令处理程序代码
722     m_always_on_top = !m_always_on_top;
723     SetAlwaysOnTop();
724 }
725 
726 
727 //afx_msg LRESULT CMiniModeDlg::OnTimerIntervalChanged(WPARAM wParam, LPARAM lParam)
728 //{
729 //    KillTimer(TIMER_ID_MINI2);
730 //    SetTimer(TIMER_ID_MINI2, theApp.m_app_setting_data.ui_refresh_interval, NULL);		//设置用于界面刷新的定时器
731 //    return 0;
732 //}
733 
734 
OnExitSizeMove()735 void CMiniModeDlg::OnExitSizeMove()
736 {
737     // TODO: 在此添加消息处理程序代码和/或调用默认值
738     MoveWindowPos();
739     m_playlist_y_offset = 0;
740 
741     CDialogEx::OnExitSizeMove();
742 }
743 
744 
OnTabletQuerysystemgesturestatus(WPARAM wParam,LPARAM lParam)745 afx_msg LRESULT CMiniModeDlg::OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam)
746 {
747     return 0;
748 }
749 
750 
OnMouseWheel(UINT nFlags,short zDelta,CPoint pt)751 BOOL CMiniModeDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
752 {
753     //仅自绘播放列表区域的鼠标滚轮事件会在这里响应,自绘播放列表以外的迷你模式区域的滚动事件在PreTranslateMessage中被转发给了主窗口用于调节音量
754 
755     ScreenToClient(&pt);
756     CPlayerUIBase* cur_ui{ GetCurUi() };
757     if (cur_ui != nullptr)
758         cur_ui->MouseWheel(zDelta, pt);
759 
760     return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
761 }
762 
763 
OnRButtonDown(UINT nFlags,CPoint point)764 void CMiniModeDlg::OnRButtonDown(UINT nFlags, CPoint point)
765 {
766     // TODO: 在此添加消息处理程序代码和/或调用默认值
767     CRect rect_ui(CPoint(0, 0), CSize(m_ui_width, m_ui_height));
768     if (!rect_ui.PtInRect(point))
769     {
770         CPlayerUIBase* cur_ui{ GetCurUi() };
771         if (cur_ui != nullptr)
772             cur_ui->RButtonDown(point);
773     }
774 
775     CDialogEx::OnRButtonDown(nFlags, point);
776 }
777