xref: /MusicPlayer2/MusicPlayer2/PropertyAlbumCoverDlg.cpp (revision 9c4ef8a8f2876557772f84b85d0eb04ab8fa8c61)
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