1 // CMediaLibDlg.cpp: 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "CMediaLibDlg.h"
7 #include "MediaLibStatisticsDlg.h"
8
9 // CMediaLibDlg 对话框
10
11 int CMediaLibDlg::m_last_tab{};
12
IMPLEMENT_DYNAMIC(CMediaLibDlg,CBaseDialog)13 IMPLEMENT_DYNAMIC(CMediaLibDlg, CBaseDialog)
14
15 CMediaLibDlg::CMediaLibDlg(int cur_tab, CWnd* pParent /*=nullptr*/)
16 : CBaseDialog(IDD_MEDIA_LIB_DIALOG, pParent), m_init_tab(cur_tab)
17 {
18 }
19
~CMediaLibDlg()20 CMediaLibDlg::~CMediaLibDlg()
21 {
22 // 保存设置更改到OnDestroy,因为CMediaLibDlg不会在关闭时被delete析构而是下次打开/程序退出时析构
23 }
24
SetCurTab(int tab)25 void CMediaLibDlg::SetCurTab(int tab)
26 {
27 m_tab_ctrl.SetCurTab(tab);
28 }
29
NavigateToItem(const wstring & item)30 bool CMediaLibDlg::NavigateToItem(const wstring& item)
31 {
32 CWnd* pCurTab{ m_tab_ctrl.GetCurrentTab() };
33 CMediaClassifyDlg* media_classfi_dlg = dynamic_cast<CMediaClassifyDlg*>(pCurTab);
34 if (media_classfi_dlg != nullptr)
35 {
36 return media_classfi_dlg->SetLeftListSel(item);
37 }
38
39 CSetPathDlg* folder_dlg = dynamic_cast<CSetPathDlg*>(pCurTab);
40 if (folder_dlg != nullptr)
41 {
42 return folder_dlg->SetCurSel(item);
43 }
44
45 CSelectPlaylistDlg* playlist_dlg = dynamic_cast<CSelectPlaylistDlg*>(pCurTab);
46 if (playlist_dlg != nullptr)
47 {
48 return playlist_dlg->SetCurSel(item);
49 }
50
51 return false;
52 }
53
GetDialogName() const54 CString CMediaLibDlg::GetDialogName() const
55 {
56 return L"MediaLibDlg";
57 }
58
InitializeControls()59 bool CMediaLibDlg::InitializeControls()
60 {
61 wstring temp;
62 temp = theApp.m_str_table.LoadText(L"TITLE_LIB");
63 SetWindowTextW(temp.c_str());
64 temp = theApp.m_str_table.LoadText(L"TXT_LIB_MEDIA_LIB_SETTING");
65 SetDlgItemTextW(IDC_MEDIA_LIB_SETTINGS_BTN, temp.c_str());
66 temp = theApp.m_str_table.LoadText(L"TXT_LIB_STATISTICS_INFO");
67 SetDlgItemTextW(IDC_STATISTICS_INFO_BUTTON, temp.c_str());
68 temp = theApp.m_str_table.LoadText(L"TXT_LIB_PLAY_SEL");
69 SetDlgItemTextW(IDC_PLAY_SELECTED, temp.c_str());
70 temp = theApp.m_str_table.LoadText(L"TXT_CLOSE");
71 SetDlgItemTextW(IDCANCEL, temp.c_str());
72
73 RepositionTextBasedControls({
74 { CtrlTextInfo::L2, IDC_MEDIA_LIB_SETTINGS_BTN, CtrlTextInfo::W32 },
75 { CtrlTextInfo::L1, IDC_STATISTICS_INFO_BUTTON, CtrlTextInfo::W32 },
76 { CtrlTextInfo::R1, IDC_PLAY_SELECTED, CtrlTextInfo::W32 },
77 { CtrlTextInfo::R2, IDCANCEL, CtrlTextInfo::W32 }
78 });
79 return true;
80 }
81
DoDataExchange(CDataExchange * pDX)82 void CMediaLibDlg::DoDataExchange(CDataExchange* pDX)
83 {
84 CBaseDialog::DoDataExchange(pDX);
85 DDX_Control(pDX, IDC_TAB1, m_tab_ctrl);
86 }
87
88
BEGIN_MESSAGE_MAP(CMediaLibDlg,CBaseDialog)89 BEGIN_MESSAGE_MAP(CMediaLibDlg, CBaseDialog)
90 ON_BN_CLICKED(IDC_PLAY_SELECTED, &CMediaLibDlg::OnBnClickedPlaySelected)
91 ON_MESSAGE(WM_PLAY_SELECTED_BTN_ENABLE, &CMediaLibDlg::OnPlaySelectedBtnEnable)
92 ON_BN_CLICKED(IDC_MEDIA_LIB_SETTINGS_BTN, &CMediaLibDlg::OnBnClickedMediaLibSettingsBtn)
93 ON_BN_CLICKED(IDC_STATISTICS_INFO_BUTTON, &CMediaLibDlg::OnBnClickedStatisticsInfoButton)
94 ON_WM_DESTROY()
95 END_MESSAGE_MAP()
96
97
98 // CMediaLibDlg 消息处理程序
99
100 BOOL CMediaLibDlg::OnInitDialog()
101 {
102 CBaseDialog::OnInitDialog();
103
104 // TODO: 在此添加额外的初始化
105 ModifyStyle(0, WS_CLIPCHILDREN);
106
107 SetIcon(IconMgr::IconType::IT_Media_Lib, FALSE);
108 SetIcon(IconMgr::IconType::IT_Media_Lib, TRUE);
109
110 SetButtonIcon(IDC_MEDIA_LIB_SETTINGS_BTN, IconMgr::IconType::IT_Setting);
111 SetButtonIcon(IDC_STATISTICS_INFO_BUTTON, IconMgr::IconType::IT_Info);
112 SetButtonIcon(IDC_PLAY_SELECTED, IconMgr::IconType::IT_Play);
113
114 // 创建子对话框,因为CMediaLibDlg不会及时析构为避免持续占用大量内存不再使用成员变量存储子窗口窗口类
115 m_path_dlg = new CSetPathDlg();
116 m_playlist_dlg = new CSelectPlaylistDlg();
117 m_artist_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_ARTIST);
118 m_album_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_ALBUM);
119 m_genre_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_GENRE);
120 m_year_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_YEAR);
121 m_type_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_TYPE);
122 m_bitrate_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_BITRATE);
123 m_rating_dlg = new CMediaClassifyDlg(CMediaClassifier::CT_RATING);
124 m_all_media_dlg = new CAllMediaDlg(CAllMediaDlg::DT_ALL_MEDIA);
125 m_recent_media_dlg = new CAllMediaDlg(CAllMediaDlg::DT_RECENT_MEDIA);
126 m_folder_explore_dlg = new CFolderExploreDlg();
127 //文件夹
128 m_path_dlg->Create(IDD_SET_PATH_DIALOG);
129 m_tab_ctrl.AddWindow(m_path_dlg, theApp.m_str_table.LoadText(L"TXT_FOLDER").c_str(), IconMgr::IconType::IT_Folder);
130
131 //播放列表
132 m_playlist_dlg->Create(IDD_SELECT_PLAYLIST_DIALOG);
133 m_tab_ctrl.AddWindow(m_playlist_dlg, theApp.m_str_table.LoadText(L"TXT_PLAYLIST").c_str(), IconMgr::IconType::IT_Playlist);
134
135 auto isTabShown = [&](MediaLibDisplayItem tab) {
136 return (theApp.m_media_lib_setting_data.display_item & tab) || (m_tab_show_force & tab);
137 };
138
139 //艺术家
140 if (isTabShown(MLDI_ARTIST))
141 {
142 m_artist_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
143 m_tab_ctrl.AddWindow(m_artist_dlg, theApp.m_str_table.LoadText(L"TXT_ARTIST").c_str(), IconMgr::IconType::IT_Artist);
144 }
145 //唱片集
146 if (isTabShown(MLDI_ALBUM))
147 {
148 m_album_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
149 m_tab_ctrl.AddWindow(m_album_dlg, theApp.m_str_table.LoadText(L"TXT_ALBUM").c_str(), IconMgr::IconType::IT_Album);
150 }
151 //流派
152 if (isTabShown(MLDI_GENRE))
153 {
154 m_genre_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
155 m_tab_ctrl.AddWindow(m_genre_dlg, theApp.m_str_table.LoadText(L"TXT_GENRE").c_str(), IconMgr::IconType::IT_Genre);
156 }
157 //年份
158 if (isTabShown(MLDI_YEAR))
159 {
160 m_year_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
161 m_tab_ctrl.AddWindow(m_year_dlg, theApp.m_str_table.LoadText(L"TXT_YEAR").c_str(), IconMgr::IconType::IT_Year);
162 }
163 //类型
164 if (isTabShown(MLDI_TYPE))
165 {
166 m_type_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
167 m_tab_ctrl.AddWindow(m_type_dlg, theApp.m_str_table.LoadText(L"TXT_FILE_TYPE").c_str(), IconMgr::IconType::IT_File_Relate);
168 }
169 //比特率
170 if (isTabShown(MLDI_BITRATE))
171 {
172 m_bitrate_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
173 m_tab_ctrl.AddWindow(m_bitrate_dlg, theApp.m_str_table.LoadText(L"TXT_BITRATE").c_str(), IconMgr::IconType::IT_Bitrate);
174 }
175 //分级
176 if (isTabShown(MLDI_RATING))
177 {
178 m_rating_dlg->Create(IDD_MEDIA_CLASSIFY_DIALOG);
179 m_tab_ctrl.AddWindow(m_rating_dlg, theApp.m_str_table.LoadText(L"TXT_RATING").c_str(), IconMgr::IconType::IT_Star);
180 }
181 //所有曲目
182 if (isTabShown(MLDI_ALL))
183 {
184 m_all_media_dlg->Create(IDD_ALL_MEDIA_DIALOG);
185 m_tab_ctrl.AddWindow(m_all_media_dlg, theApp.m_str_table.LoadText(L"TXT_ALL_TRACKS").c_str(), IconMgr::IconType::IT_Media_Lib);
186 }
187 //最近播放
188 if (isTabShown(MLDI_RECENT))
189 {
190 m_recent_media_dlg->Create(IDD_ALL_MEDIA_DIALOG);
191 m_tab_ctrl.AddWindow(m_recent_media_dlg, theApp.m_str_table.LoadText(L"TXT_RECENT_PLAYED").c_str(), IconMgr::IconType::IT_History);
192 }
193 //文件夹浏览
194 if (isTabShown(MLDI_FOLDER_EXPLORE))
195 {
196 m_folder_explore_dlg->Create(IDD_FOLDER_EXPLORE_DIALOG);
197 m_tab_ctrl.AddWindow(m_folder_explore_dlg, theApp.m_str_table.LoadText(L"TXT_FOLDER_EXPLORE").c_str(), IconMgr::IconType::IT_Folder_Explore);
198 }
199
200 m_tab_ctrl.SetItemSize(CSize(theApp.DPI(60), theApp.DPI(24)));
201 m_tab_ctrl.AdjustTabWindowSize();
202
203 //如果要显示的标签序号无效,则保持上次的标签
204 m_tab_ctrl.SetCurTab(m_init_tab >= 0 ? m_init_tab : m_last_tab);
205
206 m_path_dlg->AdjustColumnWidth();
207 m_playlist_dlg->AdjustColumnWidth();
208
209 CenterWindow(GetParent());
210
211 return TRUE; // return TRUE unless you set the focus to a control
212 // 异常: OCX 属性页应返回 FALSE
213 }
214
215
OnBnClickedPlaySelected()216 void CMediaLibDlg::OnBnClickedPlaySelected()
217 {
218 // 调用子窗口的OnOK方法
219 CTabDlg* current_tab = dynamic_cast<CTabDlg*>(m_tab_ctrl.GetCurrentTab());
220 if (current_tab != nullptr)
221 current_tab->OnOK(); // OnOK是虚方法,此处实际上执行的是CTabDlg的最终派生类的OnOK
222 }
223
224
OnPlaySelectedBtnEnable(WPARAM wParam,LPARAM lParam)225 afx_msg LRESULT CMediaLibDlg::OnPlaySelectedBtnEnable(WPARAM wParam, LPARAM lParam)
226 {
227 bool enable = (wParam != 0);
228 CWnd* pBtn = GetDlgItem(IDC_PLAY_SELECTED);
229 if (pBtn != nullptr)
230 pBtn->EnableWindow(enable);
231
232 return 0;
233 }
234
235
OnBnClickedMediaLibSettingsBtn()236 void CMediaLibDlg::OnBnClickedMediaLibSettingsBtn()
237 {
238 // TODO: 在此添加控件通知处理程序代码
239 theApp.m_pMainWnd->SendMessage(WM_OPTION_SETTINGS, 4, LPARAM(this));
240 }
241
242
OnBnClickedStatisticsInfoButton()243 void CMediaLibDlg::OnBnClickedStatisticsInfoButton()
244 {
245 // TODO: 在此添加控件通知处理程序代码
246 CMediaLibStatisticsDlg dlg;
247 dlg.DoModal();
248 }
249
250
OnDestroy()251 void CMediaLibDlg::OnDestroy()
252 {
253 CBaseDialog::OnDestroy();
254
255 // TODO: 在此处添加消息处理程序代码
256
257 //窗口关闭时保存选中的标签
258 m_last_tab = m_tab_ctrl.GetCurSel();
259
260 // 销毁并释放子窗口内存
261 if (m_path_dlg != nullptr) { m_path_dlg->DestroyWindow(); delete m_path_dlg; m_path_dlg = nullptr; }
262 if (m_playlist_dlg != nullptr) { m_playlist_dlg->DestroyWindow(); delete m_playlist_dlg; m_playlist_dlg = nullptr; }
263 if (m_artist_dlg != nullptr) { m_artist_dlg->DestroyWindow(); delete m_artist_dlg; m_artist_dlg = nullptr; }
264 if (m_album_dlg != nullptr) { m_album_dlg->DestroyWindow(); delete m_album_dlg; m_album_dlg = nullptr; }
265 if (m_genre_dlg != nullptr) { m_genre_dlg->DestroyWindow(); delete m_genre_dlg; m_genre_dlg = nullptr; }
266 if (m_year_dlg != nullptr) { m_year_dlg->DestroyWindow(); delete m_year_dlg; m_year_dlg = nullptr; }
267 if (m_type_dlg != nullptr) { m_type_dlg->DestroyWindow(); delete m_type_dlg; m_type_dlg = nullptr; }
268 if (m_bitrate_dlg != nullptr) { m_bitrate_dlg->DestroyWindow(); delete m_bitrate_dlg; m_bitrate_dlg = nullptr; }
269 if (m_rating_dlg != nullptr) { m_rating_dlg->DestroyWindow(); delete m_rating_dlg; m_rating_dlg = nullptr; }
270 if (m_all_media_dlg != nullptr) { m_all_media_dlg->DestroyWindow(); delete m_all_media_dlg; m_all_media_dlg = nullptr; }
271 if (m_recent_media_dlg != nullptr) { m_recent_media_dlg->DestroyWindow(); delete m_recent_media_dlg; m_recent_media_dlg = nullptr; }
272 if (m_folder_explore_dlg != nullptr) { m_folder_explore_dlg->DestroyWindow(); delete m_folder_explore_dlg; m_folder_explore_dlg = nullptr; }
273 }
274
275
OnOK()276 void CMediaLibDlg::OnOK()
277 {
278 // TODO: 在此添加专用代码和/或调用基类
279 DestroyWindow();
280 // CDialog::OnOK();
281 }
282
283
OnCancel()284 void CMediaLibDlg::OnCancel()
285 {
286 // TODO: 在此添加专用代码和/或调用基类
287 DestroyWindow();
288 // CDialog::OnCancel();
289 }
290