1 // PropertyAlbumCover.cpp: 实现文件
2 //
3
4 #include "stdafx.h"
5 #include "MusicPlayer2.h"
6 #include "Player.h"
7 #include "PropertyAlbumCoverDlg.h"
8 #include "COSUPlayerHelper.h"
9 #include "DrawCommon.h"
10 #include "MusicPlayerCmdHelper.h"
11 #include "PropertyDlgHelper.h"
12 #include "CommonDialogMgr.h"
13 #include "FilterHelper.h"
14
15 #define PROPERTY_COVER_IMG_FILE_NAME L"PropertyCoverImg_U6V19HODcJ2p11FM"
16
17 // CPropertyAlbumCoverDlg 对话框
18
IMPLEMENT_DYNAMIC(CPropertyAlbumCoverDlg,CTabDlg)19 IMPLEMENT_DYNAMIC(CPropertyAlbumCoverDlg, CTabDlg)
20
21 CPropertyAlbumCoverDlg::CPropertyAlbumCoverDlg(vector<SongInfo>& all_song_info, int& index, bool show_out_album_cover, bool read_only /*= false*/, CWnd* pParent /*=nullptr*/)
22 : CTabDlg(IDD_PROPERTY_ALBUM_COVER_DIALOG, pParent), m_all_song_info{ all_song_info }, m_index{ index },
23 m_show_out_album_cover{ show_out_album_cover }, m_read_only{ read_only }, m_batch_edit{ false }
24 {
25
26 }
27
CPropertyAlbumCoverDlg(vector<SongInfo> & all_song_info,CWnd * pParent)28 CPropertyAlbumCoverDlg::CPropertyAlbumCoverDlg(vector<SongInfo>& all_song_info, CWnd* pParent /*= nullptr*/)
29 : CTabDlg(IDD_PROPERTY_ALBUM_COVER_DIALOG, pParent), m_all_song_info{ all_song_info }, m_index{ m_no_use }, m_batch_edit{ true }
30 {
31
32 }
33
~CPropertyAlbumCoverDlg()34 CPropertyAlbumCoverDlg::~CPropertyAlbumCoverDlg()
35 {
36 }
37
PagePrevious()38 void CPropertyAlbumCoverDlg::PagePrevious()
39 {
40 m_cover_changed = false;
41 m_cover_deleted = false;
42 m_index--;
43 if (m_index < 0) m_index = static_cast<int>(m_all_song_info.size()) - 1;
44 if (m_index < 0) m_index = 0;
45 SetWreteEnable();
46 ShowInfo();
47 }
48
PageNext()49 void CPropertyAlbumCoverDlg::PageNext()
50 {
51 m_cover_changed = false;
52 m_cover_deleted = false;
53 m_index++;
54 if (m_index >= static_cast<int>(m_all_song_info.size())) m_index = 0;
55 SetWreteEnable();
56 ShowInfo();
57 }
58
SaveModified()59 int CPropertyAlbumCoverDlg::SaveModified()
60 {
61 if (m_cover_deleted || m_cover_changed || IsDlgButtonChecked(IDC_SAVE_ALBUM_COVER_BUTTON))
62 {
63 CWaitCursor wait_cursor;
64 int current_position{};
65 bool is_playing{};
66 // 调用SaveModified的属性主窗口已进行ReOpen操作,此时程序没有打开任何歌曲
67
68 int saved_count{};
69 if (m_cover_changed)
70 {
71 //保存手动浏览的专辑封面
72 saved_count += SaveAlbumCover(m_out_img_path);
73 }
74 else if (m_cover_deleted)
75 {
76 //删除内嵌专辑封面
77 saved_count += SaveAlbumCover(wstring());
78 }
79 else if (IsDlgButtonChecked(IDC_SAVE_ALBUM_COVER_BUTTON))
80 {
81 //将关联的外部专辑封面嵌入到音频文件
82 if (m_batch_edit)
83 saved_count += SaveEnbedLinkedCoverForBatchEdit();
84 else
85 saved_count += SaveAlbumCover(m_out_img_path, true);
86 }
87
88 return saved_count;
89 }
90 return 1;
91 }
92
AdjustColumnWidth()93 void CPropertyAlbumCoverDlg::AdjustColumnWidth()
94 {
95 CRect rect;
96 m_list_ctrl.GetWindowRect(rect);
97 int width0 = theApp.DPI(85);
98 int width1 = rect.Width() - width0 - theApp.DPI(20) - 1;
99 m_list_ctrl.SetColumnWidth(0, width0);
100 m_list_ctrl.SetColumnWidth(1, width1);
101 }
102
ShowInfo()103 void CPropertyAlbumCoverDlg::ShowInfo()
104 {
105 m_cover_img.Destroy();
106 m_cover_out_img.Destroy();
107 int cover_type{};
108 size_t cover_size{};
109
110 //载入内嵌专辑封面
111 if (!IsShowOutAlbumCover() && !m_batch_edit)
112 {
113 CAudioTag audio_tag(CurrentSong().file_path);
114 wstring cover_img_path = audio_tag.GetAlbumCover(cover_type, PROPERTY_COVER_IMG_FILE_NAME, &cover_size);
115
116 //载入图片
117 if (cover_size > 0)
118 m_cover_img.Load(cover_img_path.c_str());
119 }
120
121 //载入外部专辑封面
122 if (IsShowOutAlbumCover())
123 {
124 if (m_cover_changed)
125 {
126 m_cover_out_img.Load(m_out_img_path.c_str());
127 cover_size = CCommon::GetFileSize(m_out_img_path);
128 }
129 else if (!m_batch_edit)
130 {
131 CMusicPlayerCmdHelper helper;
132 m_out_img_path = helper.SearchAlbumCover(CurrentSong());
133 m_cover_out_img.Load(m_out_img_path.c_str());
134 }
135 }
136
137 //显示列表信息
138 //文件路径
139 m_list_ctrl.SetItemText(RI_FILE_PATH, 1, CurrentSong().file_path.c_str());
140 if (HasAlbumCover())
141 {
142 //路径
143 wstring str_path;
144 if (IsShowOutAlbumCover())
145 str_path = m_out_img_path;
146 else
147 str_path = theApp.m_str_table.LoadText(L"TXT_INNER_COVER");
148 m_list_ctrl.SetItemText(RI_COVER_PATH, 1, str_path.c_str());
149
150 //文件类型
151 CString str_type;
152 if (IsShowOutAlbumCover())
153 str_type = CFilePathHelper(m_out_img_path).GetFileExtension().c_str();
154 else
155 {
156 switch (cover_type)
157 {
158 case 0:
159 str_type = L"jpg";
160 break;
161 case 1:
162 str_type = L"png";
163 break;
164 case 2:
165 str_type = L"gif";
166 break;
167 case 3:
168 str_type = L"bmp";
169 break;
170 default:
171 break;
172 }
173 }
174 m_list_ctrl.SetItemText(RI_FORMAT, 1, str_type);
175
176 //宽度、高度、BPP
177 int cover_width{};
178 int cover_height{};
179 int cover_bpp;
180 cover_width = GetCoverImage().GetWidth();
181 cover_height = GetCoverImage().GetHeight();
182 cover_bpp = GetCoverImage().GetBPP();
183 m_list_ctrl.SetItemText(RI_WIDTH, 1, std::to_wstring(cover_width).c_str());
184 m_list_ctrl.SetItemText(RI_HEIGHT, 1, std::to_wstring(cover_height).c_str());
185 m_list_ctrl.SetItemText(RI_BPP, 1, std::to_wstring(cover_bpp).c_str());
186
187 //文件大小
188 if (IsShowOutAlbumCover())
189 {
190 size_t file_size = CCommon::GetFileSize(m_out_img_path);
191 m_list_ctrl.SetItemText(RI_SIZE, 1, CCommon::DataSizeToString(file_size));
192 }
193 else
194 {
195 m_list_ctrl.SetItemText(RI_SIZE, 1, CCommon::DataSizeToString(cover_size));
196 }
197 }
198 else
199 {
200 //m_list_ctrl.SetItemText(RI_COMPRESSED, 0, _T(""));
201 for (int i = 0; i < RI_MAX; i++)
202 {
203 if (i != RI_FILE_PATH)
204 m_list_ctrl.SetItemText(i, 1, _T(""));
205 }
206 }
207
208
209 SetWreteEnable();
210 CheckDlgButton(IDC_SAVE_ALBUM_COVER_BUTTON, FALSE);
211 Invalidate();
212 }
213
CurrentSong()214 const SongInfo& CPropertyAlbumCoverDlg::CurrentSong()
215 {
216 if (m_index >= 0 && m_index < static_cast<int>(m_all_song_info.size()) && !m_batch_edit)
217 {
218 return m_all_song_info[m_index];
219 }
220 else
221 {
222 static SongInfo song;
223 return song;
224 }
225 }
226
GetCoverImage()227 CImage& CPropertyAlbumCoverDlg::GetCoverImage()
228 {
229 if (IsShowOutAlbumCover())
230 return m_cover_out_img;
231 else
232 return m_cover_img;
233 }
234
IsCurrentSong()235 bool CPropertyAlbumCoverDlg::IsCurrentSong()
236 {
237 if (m_batch_edit)
238 {
239 for (const auto& song : m_all_song_info)
240 {
241 if (song.file_path == CPlayer::GetInstance().GetCurrentFilePath())
242 return true;
243 }
244 return false;
245 }
246 else
247 {
248 const SongInfo song{ CurrentSong() };
249 bool is_current_song{ song.file_path == CPlayer::GetInstance().GetCurrentFilePath() };
250 return is_current_song;
251 }
252 }
253
IsShowOutAlbumCover()254 bool CPropertyAlbumCoverDlg::IsShowOutAlbumCover()
255 {
256 return m_show_out_album_cover || m_cover_changed || COSUPlayerHelper::IsOsuFile(CurrentSong().file_path) || m_batch_edit;
257 }
258
IsDeleteEnable()259 bool CPropertyAlbumCoverDlg::IsDeleteEnable()
260 {
261 if (m_batch_edit)
262 {
263 return m_write_enable;
264 }
265 else
266 {
267 if (IsShowOutAlbumCover())
268 return (CCommon::FileExist(m_out_img_path) && !COSUPlayerHelper::IsOsuFile(CurrentSong().file_path));
269 else
270 return m_write_enable && HasAlbumCover();
271 }
272 }
273
HasAlbumCover()274 bool CPropertyAlbumCoverDlg::HasAlbumCover()
275 {
276 return !GetCoverImage().IsNull();
277 }
278
SetWreteEnable()279 void CPropertyAlbumCoverDlg::SetWreteEnable()
280 {
281 if (m_batch_edit)
282 {
283 CPropertyDlgHelper helper(m_all_song_info);
284 m_write_enable = helper.IsMultiCoverWritable();
285 }
286 else
287 {
288 CFilePathHelper file_path{ m_all_song_info[m_index].file_path };
289 m_write_enable = (!m_all_song_info[m_index].is_cue && !COSUPlayerHelper::IsOsuFile(file_path.GetFilePath()) && CAudioTag::IsFileTypeCoverWriteSupport(file_path.GetFileExtension()));
290 }
291 m_write_enable &= !m_read_only;
292 EnableControls();
293 SetSaveBtnEnable();
294 }
295
EnableControls()296 void CPropertyAlbumCoverDlg::EnableControls()
297 {
298
299 EnableDlgCtrl(IDC_BROWSE_BUTTON, m_write_enable);
300 EnableDlgCtrl(IDC_DELETE_BUTTON, IsDeleteEnable());
301 if (m_batch_edit)
302 {
303 EnableDlgCtrl(IDC_SAVE_ALBUM_COVER_BUTTON, m_write_enable);
304 }
305 else
306 {
307 EnableDlgCtrl(IDC_SAVE_ALBUM_COVER_BUTTON, m_write_enable && IsShowOutAlbumCover() && !m_cover_out_img.IsNull());
308 }
309 EnableDlgCtrl(IDC_SHOW_OUT_ALBUM_COVER_CHK, (!m_batch_edit && !COSUPlayerHelper::IsOsuFile(CurrentSong().file_path)));
310 }
311
SetSaveBtnEnable()312 void CPropertyAlbumCoverDlg::SetSaveBtnEnable()
313 {
314 bool enable = m_write_enable && (IsDlgButtonChecked(IDC_SAVE_ALBUM_COVER_BUTTON) || m_cover_changed || m_cover_deleted);
315 CWnd* pParent = GetParentWindow();
316 if (pParent != nullptr)
317 pParent->SendMessage(WM_PROPERTY_DIALOG_MODIFIED, enable);
318 }
319
SaveAlbumCover(const wstring & album_cover_path,bool delete_file)320 int CPropertyAlbumCoverDlg::SaveAlbumCover(const wstring& album_cover_path, bool delete_file)
321 {
322 if (m_batch_edit)
323 {
324 int saved_count{};
325 for (const auto& song : m_all_song_info)
326 {
327 CAudioTag audio_tag(song.file_path);
328 if (audio_tag.WriteAlbumCover(album_cover_path))
329 {
330 saved_count++;
331 if (delete_file)
332 {
333 DeleteLinkedPic(song.file_path, album_cover_path);
334 }
335 }
336 }
337 return saved_count;
338 }
339 else
340 {
341 CAudioTag audio_tag(CurrentSong().file_path);
342 bool rtn = audio_tag.WriteAlbumCover(album_cover_path);
343 if (rtn && delete_file)
344 {
345 DeleteLinkedPic(CurrentSong().file_path, album_cover_path);
346 }
347 return rtn;
348 }
349 }
350
SaveEnbedLinkedCoverForBatchEdit()351 int CPropertyAlbumCoverDlg::SaveEnbedLinkedCoverForBatchEdit()
352 {
353 int saved_count{};
354 for (const auto& song : m_all_song_info)
355 {
356 CMusicPlayerCmdHelper helper;
357 wstring album_cover_path = helper.SearchAlbumCover(song);
358 CAudioTag audio_tag(song.file_path);
359 if (!album_cover_path.empty() && audio_tag.WriteAlbumCover(album_cover_path))
360 {
361 saved_count++;
362 DeleteLinkedPic(song.file_path, album_cover_path);
363 }
364 }
365 return saved_count;
366
367 }
368
DeleteLinkedPic(const wstring & file_path,const wstring & album_cover_path)369 void CPropertyAlbumCoverDlg::DeleteLinkedPic(const wstring& file_path, const wstring& album_cover_path)
370 {
371 //将外部专辑封面嵌入到音频文件后,如果图片的文件名和音频文件的文件名相同,则删除此外部专辑封面图片,因此这个图片已经没有作用了
372 wstring album_cover_file_name = CFilePathHelper(album_cover_path).GetFilePathWithoutExtension();
373 wstring file_name = CFilePathHelper(file_path).GetFilePathWithoutExtension();
374 if (file_name == album_cover_file_name)
375 {
376 CommonDialogMgr::DeleteAFile(theApp.m_pMainWnd->GetSafeHwnd(), album_cover_path);
377 }
378 }
379
OnTabEntered()380 void CPropertyAlbumCoverDlg::OnTabEntered()
381 {
382 ShowInfo();
383 }
384
InitializeControls()385 bool CPropertyAlbumCoverDlg::InitializeControls()
386 {
387 wstring temp;
388 // IDC_LIST1
389 temp = theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_BROWSE");
390 SetDlgItemTextW(IDC_BROWSE_BUTTON, temp.c_str());
391 temp = theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_DELETE");
392 SetDlgItemTextW(IDC_DELETE_BUTTON, temp.c_str());
393 temp = theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_SHOW_OUT_COVER");
394 SetDlgItemTextW(IDC_SHOW_OUT_ALBUM_COVER_CHK, temp.c_str());
395 temp = theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_DO_INNER_COVER");
396 SetDlgItemTextW(IDC_SAVE_ALBUM_COVER_BUTTON, temp.c_str());
397
398 RepositionTextBasedControls({
399 { CtrlTextInfo::L1, IDC_BROWSE_BUTTON, CtrlTextInfo::W32 },
400 { CtrlTextInfo::L2, IDC_DELETE_BUTTON, CtrlTextInfo::W32 }
401 });
402 return true;
403 }
404
DoDataExchange(CDataExchange * pDX)405 void CPropertyAlbumCoverDlg::DoDataExchange(CDataExchange* pDX)
406 {
407 CTabDlg::DoDataExchange(pDX);
408 DDX_Control(pDX, IDC_LIST1, m_list_ctrl);
409 }
410
411
BEGIN_MESSAGE_MAP(CPropertyAlbumCoverDlg,CTabDlg)412 BEGIN_MESSAGE_MAP(CPropertyAlbumCoverDlg, CTabDlg)
413 ON_WM_MOUSEWHEEL()
414 ON_WM_PAINT()
415 ON_BN_CLICKED(IDC_SAVE_ALBUM_COVER_BUTTON, &CPropertyAlbumCoverDlg::OnBnClickedSaveAlbumCoverButton)
416 ON_BN_CLICKED(IDC_DELETE_BUTTON, &CPropertyAlbumCoverDlg::OnBnClickedDeleteButton)
417 ON_BN_CLICKED(IDC_BROWSE_BUTTON, &CPropertyAlbumCoverDlg::OnBnClickedBrowseButton)
418 ON_WM_RBUTTONUP()
419 ON_COMMAND(ID_COVER_BROWSE, &CPropertyAlbumCoverDlg::OnCoverBrowse)
420 ON_COMMAND(ID_COVER_DELETE, &CPropertyAlbumCoverDlg::OnCoverDelete)
421 ON_COMMAND(ID_COVER_SAVE_AS, &CPropertyAlbumCoverDlg::OnCoverSaveAs)
422 ON_WM_INITMENU()
423 ON_BN_CLICKED(IDC_SHOW_OUT_ALBUM_COVER_CHK, &CPropertyAlbumCoverDlg::OnBnClickedShowOutAlbumCoverChk)
424 ON_COMMAND(ID_COMPRESS_SIZE, &CPropertyAlbumCoverDlg::OnCompressSize)
425 ON_MESSAGE(WM_TABLET_QUERYSYSTEMGESTURESTATUS, &CPropertyAlbumCoverDlg::OnTabletQuerysystemgesturestatus)
426 END_MESSAGE_MAP()
427
428
429 // CPropertyAlbumCoverDlg 消息处理程序
430
431
432 BOOL CPropertyAlbumCoverDlg::OnInitDialog()
433 {
434 CTabDlg::OnInitDialog();
435
436 // TODO: 在此添加额外的初始化
437 SetButtonIcon(IDC_BROWSE_BUTTON, IconMgr::IconType::IT_Folder_Explore);
438 SetButtonIcon(IDC_DELETE_BUTTON, IconMgr::IconType::IT_Cancel);
439
440 //初始化列表
441 //初始化列表
442 CRect rect;
443 m_list_ctrl.GetWindowRect(rect);
444 m_list_ctrl.SetExtendedStyle(m_list_ctrl.GetExtendedStyle() | LVS_EX_GRIDLINES);
445 int width0 = theApp.DPI(85);
446 int width1 = rect.Width() - width0 - theApp.DPI(20) - 1;
447 m_list_ctrl.InsertColumn(0, theApp.m_str_table.LoadText(L"TXT_ITEM").c_str(), LVCFMT_LEFT, width0);
448 m_list_ctrl.InsertColumn(1, theApp.m_str_table.LoadText(L"TXT_VALUE").c_str(), LVCFMT_LEFT, width1);
449
450
451 m_list_ctrl.InsertItem(RI_FILE_PATH, theApp.m_str_table.LoadText(L"TXT_FILE_PATH").c_str()); //文件路径
452 m_list_ctrl.InsertItem(RI_COVER_PATH, theApp.m_str_table.LoadText(L"TXT_PATH").c_str()); //封面路径
453 m_list_ctrl.InsertItem(RI_FORMAT, theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_FORMAT").c_str()); //封面类型
454 m_list_ctrl.InsertItem(RI_WIDTH, theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_WIDTH").c_str()); //宽度
455 m_list_ctrl.InsertItem(RI_HEIGHT, theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_HEIGHT").c_str()); //高度
456 m_list_ctrl.InsertItem(RI_BPP, theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_BPP").c_str()); //每像素位数
457 m_list_ctrl.InsertItem(RI_SIZE, theApp.m_str_table.LoadText(L"TXT_COVER_PROPERTY_FILE_SIZE").c_str()); //文件大小
458
459 CheckDlgButton(IDC_SHOW_OUT_ALBUM_COVER_CHK, m_show_out_album_cover);
460
461 return TRUE; // return TRUE unless you set the focus to a control
462 // 异常: OCX 属性页应返回 FALSE
463 }
464
465
OnMouseWheel(UINT nFlags,short zDelta,CPoint pt)466 BOOL CPropertyAlbumCoverDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
467 {
468 // TODO: 在此添加消息处理程序代码和/或调用默认值
469
470 //return CTabDlg::OnMouseWheel(nFlags, zDelta, pt);
471 return TRUE;
472 }
473
474
OnPaint()475 void CPropertyAlbumCoverDlg::OnPaint()
476 {
477 CPaintDC dc(this); // device context for painting
478 // TODO: 在此处添加消息处理程序代码
479 // 不为绘图消息调用 CTabDlg::OnPaint()
480
481 //计算专辑封面的绘图区域
482 CRect rect;
483 GetClientRect(rect);
484
485 CRect rect_list;
486 m_list_ctrl.GetWindowRect(rect_list);
487 ScreenToClient(rect_list);
488
489 rect.right = rect_list.left;
490 rect.DeflateRect(theApp.DPI(16), theApp.DPI(16));
491
492 if (HasAlbumCover()) //有专辑封面时绘制专辑封面
493 {
494 CImage& img{ GetCoverImage() };
495 if (img.GetWidth() < rect.Width() && img.GetHeight() < rect.Height()) //如果专辑封面图片大小小于绘图区域,则将绘图区域改为图片大小
496 {
497 CRect rect_img;
498 rect_img.left = rect.left + (rect.Width() - img.GetWidth()) / 2;
499 rect_img.top = rect.top + (rect.Height() - img.GetHeight()) / 2;
500 rect_img.right = rect_img.left + img.GetWidth();
501 rect_img.bottom = rect_img.top + img.GetHeight();
502 rect = rect_img;
503 }
504 CDrawCommon draw;
505 draw.Create(&dc);
506 draw.DrawImage(img, rect.TopLeft(), rect.Size(), CDrawCommon::StretchMode::FIT);
507 }
508 else //否则以灰色填充
509 {
510 dc.FillSolidRect(rect, RGB(210, 210, 210));
511 }
512 }
513
514
OnBnClickedSaveAlbumCoverButton()515 void CPropertyAlbumCoverDlg::OnBnClickedSaveAlbumCoverButton()
516 {
517 // TODO: 在此添加控件通知处理程序代码
518 SetSaveBtnEnable();
519 }
520
521
OnBnClickedDeleteButton()522 void CPropertyAlbumCoverDlg::OnBnClickedDeleteButton()
523 {
524 // TODO: 在此添加控件通知处理程序代码
525 if (IsShowOutAlbumCover() && !m_batch_edit)
526 {
527 wstring inquiry_info = theApp.m_str_table.LoadTextFormat(L"MSG_DELETE_SINGLE_FILE_INQUIRY", { m_out_img_path });
528 if (MessageBox(inquiry_info.c_str(), NULL, MB_ICONQUESTION | MB_OKCANCEL) == IDOK)
529 {
530 if (CommonDialogMgr::DeleteAFile(theApp.m_pMainWnd->GetSafeHwnd(), m_out_img_path) != 0)
531 {
532 const wstring& info = theApp.m_str_table.LoadText(L"MSG_DELETE_FILE_FAILED");
533 MessageBox(info.c_str(), NULL, MB_ICONWARNING);
534 }
535 }
536 }
537 else
538 {
539 m_cover_deleted = true;
540 SetSaveBtnEnable();
541 }
542 }
543
544
OnBnClickedBrowseButton()545 void CPropertyAlbumCoverDlg::OnBnClickedBrowseButton()
546 {
547 // TODO: 在此添加控件通知处理程序代码
548
549 wstring filter = FilterHelper::GetImageFileFilter();
550 CFileDialog fileDlg(TRUE, NULL, NULL, 0, filter.c_str(), this);
551 if (IDOK == fileDlg.DoModal())
552 {
553 m_out_img_path = fileDlg.GetPathName().GetString();
554 m_cover_changed = true;
555 ShowInfo();
556 }
557 }
558
559
OnRButtonUp(UINT nFlags,CPoint point)560 void CPropertyAlbumCoverDlg::OnRButtonUp(UINT nFlags, CPoint point)
561 {
562 // TODO: 在此添加消息处理程序代码和/或调用默认值
563 CPoint point1;
564 GetCursorPos(&point1);
565 CMenu* pMenu = theApp.m_menu_mgr.GetMenu(MenuMgr::PropertyCoverMenu);
566 if (pMenu != NULL)
567 pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this);
568
569 CTabDlg::OnRButtonUp(nFlags, point);
570 }
571
572
OnCoverBrowse()573 void CPropertyAlbumCoverDlg::OnCoverBrowse()
574 {
575 // TODO: 在此添加命令处理程序代码
576 OnBnClickedBrowseButton();
577 }
578
579
OnCoverDelete()580 void CPropertyAlbumCoverDlg::OnCoverDelete()
581 {
582 // TODO: 在此添加命令处理程序代码
583 OnBnClickedDeleteButton();
584 }
585
586
OnCoverSaveAs()587 void CPropertyAlbumCoverDlg::OnCoverSaveAs()
588 {
589 // TODO: 在此添加命令处理程序代码
590 //设置过滤器
591 wstring szFilter = theApp.m_str_table.LoadText(L"TXT_FILTER_ALL_FILES") + L"(*.*)|*.*||";
592 //设置另存为时的默认文件名
593 CString file_name;
594 CString extension = m_list_ctrl.GetItemText(RI_FORMAT, 1);
595 file_name.Format(_T("AlbumCover - %s - %s.%s"), CurrentSong().artist.c_str(), CurrentSong().album.c_str(), extension);
596 wstring file_name_wcs{ file_name };
597 CCommon::FileNameNormalize(file_name_wcs); //替换掉文件名中的无效字符
598 //构造保存文件对话框
599 CFileDialog fileDlg(FALSE, NULL, file_name_wcs.c_str(), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, szFilter.c_str(), this);
600 //显示保存文件对话框
601 if (IDOK == fileDlg.DoModal())
602 {
603 CString dest_file = fileDlg.GetPathName();
604 CString src_file;
605
606 if (IsShowOutAlbumCover())
607 src_file = m_out_img_path.c_str();
608 else
609 src_file = (CCommon::GetTemplatePath() + PROPERTY_COVER_IMG_FILE_NAME).c_str();
610
611 ::CopyFile(src_file, dest_file, FALSE);
612 SetFileAttributes(dest_file, FILE_ATTRIBUTE_NORMAL); //取消文件的隐藏属性
613 }
614
615 }
616
617
OnInitMenu(CMenu * pMenu)618 void CPropertyAlbumCoverDlg::OnInitMenu(CMenu* pMenu)
619 {
620 CTabDlg::OnInitMenu(pMenu);
621
622 // TODO: 在此处添加消息处理程序代码
623 pMenu->EnableMenuItem(ID_COVER_BROWSE, MF_BYCOMMAND | (m_write_enable ? MF_ENABLED : MF_GRAYED));
624 pMenu->EnableMenuItem(ID_COVER_DELETE, MF_BYCOMMAND | (IsDeleteEnable() ? MF_ENABLED : MF_GRAYED));
625 pMenu->EnableMenuItem(ID_COVER_SAVE_AS, MF_BYCOMMAND | (HasAlbumCover() ? MF_ENABLED : MF_GRAYED));
626 CImage& cover_image{ m_cover_img };
627 int cover_size{};
628 if (!cover_image.IsNull())
629 cover_size = max(cover_image.GetWidth(), cover_image.GetHeight());
630 pMenu->EnableMenuItem(ID_COMPRESS_SIZE, MF_BYCOMMAND | (!IsShowOutAlbumCover() && !m_batch_edit && cover_size > theApp.m_nc_setting_data.max_album_cover_size ? MF_ENABLED : MF_GRAYED));
631 }
632
633
OnBnClickedShowOutAlbumCoverChk()634 void CPropertyAlbumCoverDlg::OnBnClickedShowOutAlbumCoverChk()
635 {
636 // TODO: 在此添加控件通知处理程序代码
637 m_show_out_album_cover = (IsDlgButtonChecked(IDC_SHOW_OUT_ALBUM_COVER_CHK) != 0);
638 ShowInfo();
639 }
640
641
OnCompressSize()642 void CPropertyAlbumCoverDlg::OnCompressSize()
643 {
644 CImage& album_cover{ GetCoverImage() };
645 if (!album_cover.IsNull() && theApp.m_nc_setting_data.max_album_cover_size > 0)
646 {
647 CSize image_size;
648 image_size.cx = album_cover.GetWidth();
649 image_size.cy = album_cover.GetHeight();
650 if (max(image_size.cx, image_size.cy) > theApp.m_nc_setting_data.max_album_cover_size) //如果专辑封面的尺寸大于设定的最大值,则将其缩小
651 {
652 wstring temp_img_path{ CCommon::GetTemplatePath() + ALBUM_COVER_TEMP_NAME_FOR_PROPERTIES };
653 temp_img_path += L".jpg";
654 //缩小图片大小并保存到临时目录
655 CDrawCommon::ImageResize(album_cover, temp_img_path, theApp.m_nc_setting_data.max_album_cover_size, IT_JPG);
656 m_out_img_path = temp_img_path;
657 m_cover_changed = true;
658 SetSaveBtnEnable();
659 }
660 }
661
662 }
663
664
OnTabletQuerysystemgesturestatus(WPARAM wParam,LPARAM lParam)665 afx_msg LRESULT CPropertyAlbumCoverDlg::OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam)
666 {
667 return 0;
668 }
669