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