├── .gitattributes ├── .github └── workflows │ └── ci.yaml ├── .gitignore ├── Debug ├── bass.dll ├── bass_fx.dll └── tag.dll ├── Documents ├── Introduction.md ├── update_log.md └── update_log_en-us.md ├── LICENSE ├── MusicPlayer2.sln ├── MusicPlayer2 ├── AboutDlg.cpp ├── AboutDlg.h ├── AcceleratorRes.cpp ├── AcceleratorRes.h ├── AddToPlaylistDlg.cpp ├── AddToPlaylistDlg.h ├── AllMediaDlg.cpp ├── AllMediaDlg.h ├── AppearanceSettingDlg.cpp ├── AppearanceSettingDlg.h ├── AudioCommon.cpp ├── AudioCommon.h ├── AudioTag.cpp ├── AudioTag.h ├── AudioTagOld.cpp ├── AudioTagOld.h ├── BASSEncodeLibrary.cpp ├── BASSEncodeLibrary.h ├── BASSMidiLibrary.cpp ├── BASSMidiLibrary.h ├── BASSWmaLibrary.cpp ├── BASSWmaLibrary.h ├── BaseDialog.cpp ├── BaseDialog.h ├── BassCore.cpp ├── BassCore.h ├── BassMixLibrary.cpp ├── BassMixLibrary.h ├── BrowseEdit.cpp ├── BrowseEdit.h ├── CDevicesManager.cpp ├── CDevicesManager.h ├── CDonateDlg.cpp ├── CDonateDlg.h ├── CFloatPlaylistDlg.cpp ├── CFloatPlaylistDlg.h ├── CHotKey.cpp ├── CHotKey.h ├── CHotKeySettingDlg.cpp ├── CHotKeySettingDlg.h ├── CHotkeyManager.cpp ├── CHotkeyManager.h ├── CListBoxEnhanced.cpp ├── CListBoxEnhanced.h ├── CListenTimeStatisticsDlg.cpp ├── CListenTimeStatisticsDlg.h ├── CMMNotificationClient.cpp ├── CMMNotificationClient.h ├── CMainDialogBase.cpp ├── CMainDialogBase.h ├── CMediaLibDlg.cpp ├── CMediaLibDlg.h ├── CNotifyIcon.cpp ├── CNotifyIcon.h ├── COSUPlayerHelper.cpp ├── COSUPlayerHelper.h ├── CPlayerUIBase.cpp ├── CPlayerUIBase.h ├── CPlayerUIHelper.cpp ├── CPlayerUIHelper.h ├── CRecentList.cpp ├── CRecentList.h ├── CSelectPlaylist.cpp ├── CSelectPlaylist.h ├── CTabCtrlEx.cpp ├── CTabCtrlEx.h ├── CTest.cpp ├── CTest.h ├── CUIDrawer.cpp ├── CUIDrawer.h ├── CVariant.cpp ├── CVariant.h ├── ChinesePingyinRes.cpp ├── ChinesePingyinRes.h ├── CleanupRangeDlg.cpp ├── CleanupRangeDlg.h ├── ColorConvert.cpp ├── ColorConvert.h ├── ColorStatic.cpp ├── ColorStatic.h ├── ColorStaticEx.cpp ├── ColorStaticEx.h ├── Common.cpp ├── Common.h ├── CommonData.cpp ├── CommonData.h ├── CommonDialogMgr.cpp ├── CommonDialogMgr.h ├── CortanaLyric.cpp ├── CortanaLyric.h ├── CoverDownloadCommon.cpp ├── CoverDownloadCommon.h ├── CoverDownloadDlg.cpp ├── CoverDownloadDlg.h ├── CueFile.cpp ├── CueFile.h ├── DataSettingsDlg.cpp ├── DataSettingsDlg.h ├── Define.h ├── DesktopLyric.cpp ├── DesktopLyric.h ├── DllLib.cpp ├── DllLib.h ├── DrawCommon.cpp ├── DrawCommon.h ├── EditEx.cpp ├── EditEx.h ├── EditStringListDlg.cpp ├── EditStringListDlg.h ├── EditableListBox.cpp ├── EditableListBox.h ├── Encoder │ ├── bassenc.dll │ ├── bassmix.dll │ ├── flac.exe │ ├── lame.exe │ └── oggenc.exe ├── EqualizerDlg.cpp ├── EqualizerDlg.h ├── FfmpegCore.cpp ├── FfmpegCore.h ├── FileNameFormDlg.cpp ├── FileNameFormDlg.h ├── FilePathHelper.cpp ├── FilePathHelper.h ├── FileRelateDlg.cpp ├── FileRelateDlg.h ├── FilterHelper.cpp ├── FilterHelper.h ├── FindContainerDlg.cpp ├── FindContainerDlg.h ├── FindDlg.cpp ├── FindDlg.h ├── FindListDlg.cpp ├── FindListDlg.h ├── FlacEncodeCfgDlg.cpp ├── FlacEncodeCfgDlg.h ├── FolderBrowserDlg.cpp ├── FolderBrowserDlg.h ├── FolderExploreDlg.cpp ├── FolderExploreDlg.h ├── FolderPropertiesDlg.cpp ├── FolderPropertiesDlg.h ├── FontDialogEx.cpp ├── FontDialogEx.h ├── FormatConvertDlg.cpp ├── FormatConvertDlg.h ├── GaussBlur.cpp ├── GaussBlur.h ├── GdiPlusTool.cpp ├── GdiPlusTool.h ├── GetTagOnlineDlg.cpp ├── GetTagOnlineDlg.h ├── HorizontalSplitter.cpp ├── HorizontalSplitter.h ├── IPlayerCore.h ├── IPlayerUI.h ├── IPropertyTabDlg.h ├── IconMgr.cpp ├── IconMgr.h ├── IniHelper.cpp ├── IniHelper.h ├── InputDlg.cpp ├── InputDlg.h ├── InternetCommon.cpp ├── InternetCommon.h ├── LastFM.cpp ├── LastFM.h ├── LastFMDataArchive.cpp ├── LastFMDataArchive.h ├── ListCache.cpp ├── ListCache.h ├── ListCtrlEx.cpp ├── ListCtrlEx.h ├── ListItem.cpp ├── ListItem.h ├── Lyric.cpp ├── Lyric.h ├── LyricBatchDownloadDlg.cpp ├── LyricBatchDownloadDlg.h ├── LyricDownloadCommon.cpp ├── LyricDownloadCommon.h ├── LyricDownloadDlg.cpp ├── LyricDownloadDlg.h ├── LyricEditDlg.cpp ├── LyricEditDlg.h ├── LyricRelateDlg.cpp ├── LyricRelateDlg.h ├── LyricSettingsDlg.cpp ├── LyricSettingsDlg.h ├── LyricsWindow.cpp ├── LyricsWindow.h ├── MP3EncodeCfgDlg.cpp ├── MP3EncodeCfgDlg.h ├── MciCore.cpp ├── MciCore.h ├── MediaClassifyDlg.cpp ├── MediaClassifyDlg.h ├── MediaLibHelper.cpp ├── MediaLibHelper.h ├── MediaLibItemPropertiesDlg.cpp ├── MediaLibItemPropertiesDlg.h ├── MediaLibSettingDlg.cpp ├── MediaLibSettingDlg.h ├── MediaLibStatisticsDlg.cpp ├── MediaLibStatisticsDlg.h ├── MediaLibTabDlg.cpp ├── MediaLibTabDlg.h ├── MediaTransControls.cpp ├── MediaTransControls.h ├── MediaTransControlsImpl.cpp ├── MediaTransControlsImpl.h ├── MenuEditCtrl.cpp ├── MenuEditCtrl.h ├── MenuMgr.cpp ├── MenuMgr.h ├── MessageDlg.cpp ├── MessageDlg.h ├── MiniModeDlg.cpp ├── MiniModeDlg.h ├── MiniModeUserUi.cpp ├── MiniModeUserUi.h ├── MoreRecentItemDlg.cpp ├── MoreRecentItemDlg.h ├── MusicPlayer2.cpp ├── MusicPlayer2.h ├── MusicPlayer2.rc ├── MusicPlayer2.vcxproj ├── MusicPlayer2.vcxproj.filters ├── MusicPlayerCmdHelper.cpp ├── MusicPlayerCmdHelper.h ├── MusicPlayerDlg.cpp ├── MusicPlayerDlg.h ├── MyComboBox.cpp ├── MyComboBox.h ├── OggEncodeCfgDlg.cpp ├── OggEncodeCfgDlg.h ├── OptionsDlg.cpp ├── OptionsDlg.h ├── PlayListCtrl.cpp ├── PlayListCtrl.h ├── PlaySettingsDlg.cpp ├── PlaySettingsDlg.h ├── Player.cpp ├── Player.h ├── PlayerProgressBar.cpp ├── PlayerProgressBar.h ├── PlayerToolBar.cpp ├── PlayerToolBar.h ├── Playlist.cpp ├── Playlist.h ├── PlaylistMgr.cpp ├── PlaylistPropertiesDlg.cpp ├── PlaylistPropertiesDlg.h ├── Plugins │ ├── bass_aac.dll │ ├── bass_ape.dll │ ├── basscd.dll │ ├── bassflac.dll │ ├── bassmidi.dll │ └── basswma.dll ├── PropertyAdvancedDlg.cpp ├── PropertyAdvancedDlg.h ├── PropertyAlbumCoverDlg.cpp ├── PropertyAlbumCoverDlg.h ├── PropertyDlg.cpp ├── PropertyDlg.h ├── PropertyDlgHelper.cpp ├── PropertyDlgHelper.h ├── PropertyTabDlg.cpp ├── PropertyTabDlg.h ├── ReadMe.txt ├── RecentFolderAndPlaylist.cpp ├── RecentFolderMgr.cpp ├── RegFileRelate.cpp ├── RegFileRelate.h ├── RenameDlg.cpp ├── RenameDlg.h ├── ReverbDlg.cpp ├── ReverbDlg.h ├── ScintillaEditView.cpp ├── ScintillaEditView.h ├── SearchEditCtrl.cpp ├── SearchEditCtrl.h ├── SelectItemDlg.cpp ├── SelectItemDlg.h ├── SetPathDlg.cpp ├── SetPathDlg.h ├── SimplePropertiesDlg.cpp ├── SimplePropertiesDlg.h ├── SimpleXML.cpp ├── SimpleXML.h ├── SliderCtrlEx.cpp ├── SliderCtrlEx.h ├── SongDataManager.cpp ├── SongDataManager.h ├── SongInfo.cpp ├── SongInfo.h ├── SongInfoHelper.cpp ├── SongInfoHelper.h ├── SoundEffectDlg.cpp ├── SoundEffectDlg.h ├── SpectralDataHelper.cpp ├── SpectralDataHelper.h ├── SpinEdit.cpp ├── SpinEdit.h ├── StaticEx.cpp ├── StaticEx.h ├── StrTable.cpp ├── StrTable.h ├── SupportedFormatDlg.cpp ├── SupportedFormatDlg.h ├── TabDlg.cpp ├── TabDlg.h ├── TagEditDlg.cpp ├── TagEditDlg.h ├── TagFromNameDlg.cpp ├── TagFromNameDlg.h ├── TagLibHelper.cpp ├── TagLibHelper.h ├── TagSelBaseDlg.cpp ├── TagSelBaseDlg.h ├── TestDlg.cpp ├── TestDlg.h ├── Time.h ├── TinyXml2Helper.cpp ├── TinyXml2Helper.h ├── TreeCtrlEx.cpp ├── TreeCtrlEx.h ├── UIElement.cpp ├── UIElement.h ├── UIWindow.cpp ├── UIWindow.h ├── UIWindowCmdHelper.cpp ├── UIWindowCmdHelper.h ├── UiMediaLibItemMgr.cpp ├── UiMediaLibItemMgr.h ├── UiSearchBox.cpp ├── UiSearchBox.h ├── UpdateHelper.cpp ├── UpdateHelper.h ├── UserUi.cpp ├── UserUi.h ├── WinVersionHelper.cpp ├── WinVersionHelper.h ├── WmaEncodeCfgDlg.cpp ├── WmaEncodeCfgDlg.h ├── bass.h ├── bass.lib ├── bass_fx.h ├── bass_fx.lib ├── bass_fx_x64.lib ├── bass_x64.lib ├── crashtool.cpp ├── crashtool.h ├── default_background.jpg ├── language │ ├── English.ini │ └── Simplified_Chinese.ini ├── md5.cpp ├── md5.h ├── print_compile_time.bat ├── res │ ├── Acknowledgement.txt │ ├── AddTag.ico │ ├── Cortana_black.bmp │ ├── Cortana_white.bmp │ ├── DeleteTag.ico │ ├── Find.ico │ ├── MusicPlayer2.ico │ ├── MusicPlayer2.rc2 │ ├── MusicPlayer2_dark.ico │ ├── MusicPlayer2_debug.ico │ ├── MusicPlayer2_light.ico │ ├── Replace.ico │ ├── ReplaceTag.ico │ ├── Save.ico │ ├── add.ico │ ├── add_d.ico │ ├── album.ico │ ├── album_cover.ico │ ├── album_cover_d.ico │ ├── album_d.ico │ ├── artist.ico │ ├── artist_d.ico │ ├── background_d.ico │ ├── bitrate.ico │ ├── bitrate_d.ico │ ├── close.ico │ ├── close_d.ico │ ├── convert_d.ico │ ├── copy.ico │ ├── dark_mode.ico │ ├── default_cover.bmp │ ├── default_cover_new.ico │ ├── default_cover_new_not_played.ico │ ├── display_mode.ico │ ├── display_mode_d.ico │ ├── donate.bmp │ ├── donate_wechat.bmp │ ├── double_line_d.ico │ ├── download1_d.ico │ ├── download_d.ico │ ├── drag.cur │ ├── edit_d.ico │ ├── eq.ico │ ├── eq_d.ico │ ├── exit_d.ico │ ├── expand.ico │ ├── expand_d.ico │ ├── explorer_folder.ico │ ├── favourite.ico │ ├── favourite_d.ico │ ├── ff_new_d.ico │ ├── file_icon.ico │ ├── file_playlist_icon.ico │ ├── file_relate.ico │ ├── file_relate_d.ico │ ├── fix_d.ico │ ├── folder_explore.ico │ ├── folder_explore_d.ico │ ├── genre.ico │ ├── genre_d.ico │ ├── heart.ico │ ├── help.ico │ ├── help_d.ico │ ├── hot_key.ico │ ├── hzpy-utf8.txt │ ├── internal_lyric_d.ico │ ├── karaoke.ico │ ├── karaoke_d.ico │ ├── light_mode.ico │ ├── link.ico │ ├── link_d.ico │ ├── locate.ico │ ├── locate_d.ico │ ├── lock_d.ico │ ├── lyric.ico │ ├── lyric_d.ico │ ├── lyric_delay.ico │ ├── lyric_forward.ico │ ├── maximize.ico │ ├── maximize_d.ico │ ├── media_lib.ico │ ├── media_lib_d.ico │ ├── menu.ico │ ├── menu_d.ico │ ├── mini.ico │ ├── mini_d.ico │ ├── mini_restore.ico │ ├── mini_restore_d.ico │ ├── minimize.ico │ ├── minimize_d.ico │ ├── more_d.ico │ ├── music_d.ico │ ├── new_folder.ico │ ├── new_folder_d.ico │ ├── next_dark.ico │ ├── next_white.ico │ ├── notify_preview.bmp │ ├── notify_preview_light.bmp │ ├── now_playing.ico │ ├── now_playing_d.ico │ ├── ok.ico │ ├── online_d.ico │ ├── owner_draw_titlebar_preview.bmp │ ├── pause_dark.ico │ ├── pause_white.ico │ ├── pin_d.ico │ ├── play_as_next.ico │ ├── play_dark.ico │ ├── play_in_folder.ico │ ├── play_in_playlist.ico │ ├── play_in_playlist_d.ico │ ├── play_pause_d.ico │ ├── play_white.ico │ ├── playlist_dock.ico │ ├── playlist_dock_d.ico │ ├── playlist_float_d.ico │ ├── previous_dark.ico │ ├── previous_white.ico │ ├── recent_songs.ico │ ├── recent_songs_d.ico │ ├── refresh.ico │ ├── refresh_d.ico │ ├── rename_d.ico │ ├── restore.ico │ ├── restore_d.ico │ ├── reverb.ico │ ├── reverb_d.ico │ ├── rew_new_d.ico │ ├── save_as_d.ico │ ├── save_new.ico │ ├── setting.ico │ ├── setting_d.ico │ ├── shortcut_d.ico │ ├── skn.ico │ ├── skn_d.ico │ ├── slow_down_d.ico │ ├── sort.ico │ ├── sort_d.ico │ ├── speed_up_d.ico │ ├── star.ico │ ├── star_d.ico │ ├── statistics_d.ico │ ├── stop_dark.ico │ ├── stop_white.ico │ ├── switch.ico │ ├── switch_d.ico │ ├── system_titlebar_preview.bmp │ ├── tag.ico │ ├── toolbar1.bmp │ ├── tree_branch_collapsed.ico │ ├── tree_branch_collapsed_d.ico │ ├── tree_branch_expanded.ico │ ├── tree_branch_expanded_d.ico │ ├── unlink.ico │ ├── unlink_d.ico │ ├── up_d.ico │ ├── volume0.ico │ ├── volume0_d.ico │ ├── volume1.ico │ ├── volume1_d.ico │ ├── volume2.ico │ ├── volume2_d.ico │ ├── volume3.ico │ ├── volume3_d.ico │ ├── year.ico │ ├── year_d.ico │ ├── 上一曲.ico │ ├── 下一曲.ico │ ├── 停止.ico │ ├── 全屏.ico │ ├── 全屏1.ico │ ├── 全屏1_d.ico │ ├── 全屏_d.ico │ ├── 列表循环.ico │ ├── 列表循环_d.ico │ ├── 单曲循环.ico │ ├── 单曲循环_d.ico │ ├── 单曲播放.ico │ ├── 单曲播放_d.ico │ ├── 快进.ico │ ├── 快退.ico │ ├── 播放.ico │ ├── 播放_暂停.ico │ ├── 播放列表.ico │ ├── 播放列表_d.ico │ ├── 文件夹.ico │ ├── 文件夹_d.ico │ ├── 暂停.ico │ ├── 曲目信息.ico │ ├── 曲目信息_d.ico │ ├── 查找.ico │ ├── 查找_d.ico │ ├── 随机播放.ico │ ├── 随机播放1.ico │ ├── 随机播放1_d.ico │ ├── 随机播放_d.ico │ ├── 顺序播放.ico │ ├── 顺序播放_d.ico │ ├── 黑色胶片.png │ └── 黑色胶片_not_played.png ├── resource.h ├── skins │ ├── 00_uiTest.xml │ ├── 01_simple.xml │ ├── 02_grooveMusic.xml │ ├── 03_grooveMusicWin11.xml │ ├── miniMode │ │ ├── miniMode00.xml │ │ ├── miniMode01.xml │ │ ├── miniMode02.xml │ │ └── miniMode03.xml │ ├── skin.xsd │ ├── test.xml │ ├── ui1.xml │ ├── ui11.xml │ ├── ui12.xml │ ├── ui2.xml │ ├── ui3.xml │ ├── ui4.xml │ └── ui5.xml ├── stdafx.cpp ├── stdafx.h ├── tag.lib ├── tag_x64.lib ├── taglib │ ├── aifffile.h │ ├── aiffproperties.h │ ├── apefile.h │ ├── apefooter.h │ ├── apeitem.h │ ├── apeproperties.h │ ├── apetag.h │ ├── asfattribute.h │ ├── asffile.h │ ├── asfpicture.h │ ├── asfproperties.h │ ├── asftag.h │ ├── attachedpictureframe.h │ ├── audioproperties.h │ ├── chapterframe.h │ ├── commentsframe.h │ ├── eventtimingcodesframe.h │ ├── fileref.h │ ├── flacfile.h │ ├── flacmetadatablock.h │ ├── flacpicture.h │ ├── flacproperties.h │ ├── generalencapsulatedobjectframe.h │ ├── id3v1genres.h │ ├── id3v1tag.h │ ├── id3v2.h │ ├── id3v2extendedheader.h │ ├── id3v2footer.h │ ├── id3v2frame.h │ ├── id3v2framefactory.h │ ├── id3v2header.h │ ├── id3v2synchdata.h │ ├── id3v2tag.h │ ├── infotag.h │ ├── itfile.h │ ├── itproperties.h │ ├── modfile.h │ ├── modfilebase.h │ ├── modproperties.h │ ├── modtag.h │ ├── mp4atom.h │ ├── mp4coverart.h │ ├── mp4file.h │ ├── mp4item.h │ ├── mp4properties.h │ ├── mp4tag.h │ ├── mpcfile.h │ ├── mpcproperties.h │ ├── mpegfile.h │ ├── mpegheader.h │ ├── mpegproperties.h │ ├── oggfile.h │ ├── oggflacfile.h │ ├── oggpage.h │ ├── oggpageheader.h │ ├── opusfile.h │ ├── opusproperties.h │ ├── ownershipframe.h │ ├── podcastframe.h │ ├── popularimeterframe.h │ ├── privateframe.h │ ├── relativevolumeframe.h │ ├── rifffile.h │ ├── s3mfile.h │ ├── s3mproperties.h │ ├── speexfile.h │ ├── speexproperties.h │ ├── synchronizedlyricsframe.h │ ├── tableofcontentsframe.h │ ├── tag.h │ ├── tag_c.h │ ├── taglib.h │ ├── taglib_config.h │ ├── taglib_export.h │ ├── tbytevector.h │ ├── tbytevectorlist.h │ ├── tbytevectorstream.h │ ├── tdebuglistener.h │ ├── textidentificationframe.h │ ├── tfile.h │ ├── tfilestream.h │ ├── tiostream.h │ ├── tlist.h │ ├── tlist.tcc │ ├── tmap.h │ ├── tmap.tcc │ ├── tpropertymap.h │ ├── trefcounter.h │ ├── trueaudiofile.h │ ├── trueaudioproperties.h │ ├── tstring.h │ ├── tstringlist.h │ ├── uniquefileidentifierframe.h │ ├── unknownframe.h │ ├── unsynchronizedlyricsframe.h │ ├── urllinkframe.h │ ├── vorbisfile.h │ ├── vorbisproperties.h │ ├── wavfile.h │ ├── wavpackfile.h │ ├── wavpackproperties.h │ ├── wavproperties.h │ ├── xingheader.h │ ├── xiphcomment.h │ ├── xmfile.h │ └── xmproperties.h ├── targetver.h └── tinyxml2 │ ├── tinyxml2.cpp │ └── tinyxml2.h ├── README.md ├── README_en-us.md ├── Release └── tag.dll ├── Screenshots ├── Cortana_lyric.png ├── Main_window.png ├── Main_window2.png ├── Mini_mode.png ├── desktop_lyric.jpg ├── en_us │ ├── options.png │ └── options2.png ├── images │ ├── image1.JPG │ └── image2.jpg ├── main_window_ui1.png ├── main_window_ui2.png ├── main_window_ui3.png ├── main_window_ui4.png ├── main_window_ui5.png ├── main_window_with_playlist.png ├── options.png └── options2.png ├── UnitTest ├── UnitTest.vcxproj ├── UnitTest.vcxproj.filters ├── stdafx.cpp ├── stdafx.h ├── targetver.h └── unittest1.cpp ├── scintilla ├── CONTRIBUTING ├── License.txt ├── README ├── include │ ├── ILexer.h │ ├── ILoader.h │ ├── Platform.h │ ├── SciLexer.h │ ├── Sci_Position.h │ ├── Scintilla.h │ └── ScintillaWidget.h ├── lexers │ ├── LexLyric.cxx │ └── LexNull.cxx ├── lexlib │ ├── Accessor.cxx │ ├── Accessor.h │ ├── CatalogueModules.h │ ├── CharacterCategory.cxx │ ├── CharacterCategory.h │ ├── CharacterSet.cxx │ ├── CharacterSet.h │ ├── DefaultLexer.cxx │ ├── DefaultLexer.h │ ├── LexAccessor.h │ ├── LexerBase.cxx │ ├── LexerBase.h │ ├── LexerModule.cxx │ ├── LexerModule.h │ ├── LexerNoExceptions.cxx │ ├── LexerNoExceptions.h │ ├── LexerSimple.cxx │ ├── LexerSimple.h │ ├── OptionSet.h │ ├── PropSetSimple.cxx │ ├── PropSetSimple.h │ ├── SparseState.h │ ├── StringCopy.h │ ├── StyleContext.cxx │ ├── StyleContext.h │ ├── SubStyles.h │ ├── WordList.cxx │ └── WordList.h ├── src │ ├── AutoComplete.cxx │ ├── AutoComplete.h │ ├── CallTip.cxx │ ├── CallTip.h │ ├── CaseConvert.cxx │ ├── CaseConvert.h │ ├── CaseFolder.cxx │ ├── CaseFolder.h │ ├── Catalogue.cxx │ ├── Catalogue.h │ ├── CellBuffer.cxx │ ├── CellBuffer.h │ ├── CharClassify.cxx │ ├── CharClassify.h │ ├── ContractionState.cxx │ ├── ContractionState.h │ ├── DBCS.cxx │ ├── DBCS.h │ ├── Decoration.cxx │ ├── Decoration.h │ ├── Document.cxx │ ├── Document.h │ ├── EditModel.cxx │ ├── EditModel.h │ ├── EditView.cxx │ ├── EditView.h │ ├── Editor.cxx │ ├── Editor.h │ ├── ElapsedPeriod.h │ ├── ExternalLexer.cxx │ ├── ExternalLexer.h │ ├── FontQuality.h │ ├── Indicator.cxx │ ├── Indicator.h │ ├── IntegerRectangle.h │ ├── KeyMap.cxx │ ├── KeyMap.h │ ├── LineMarker.cxx │ ├── LineMarker.h │ ├── MarginView.cxx │ ├── MarginView.h │ ├── Partitioning.h │ ├── PerLine.cxx │ ├── PerLine.h │ ├── Position.h │ ├── PositionCache.cxx │ ├── PositionCache.h │ ├── RESearch.cxx │ ├── RESearch.h │ ├── RunStyles.cxx │ ├── RunStyles.h │ ├── SciTE.properties │ ├── ScintillaBase.cxx │ ├── ScintillaBase.h │ ├── Selection.cxx │ ├── Selection.h │ ├── SparseVector.h │ ├── SplitVector.h │ ├── Style.cxx │ ├── Style.h │ ├── UniConversion.cxx │ ├── UniConversion.h │ ├── UniqueString.cxx │ ├── UniqueString.h │ ├── ViewStyle.cxx │ ├── ViewStyle.h │ ├── XPM.cxx │ └── XPM.h ├── version.txt └── win32 │ ├── DepGen.py │ ├── HanjaDic.cxx │ ├── HanjaDic.h │ ├── PlatWin.cxx │ ├── PlatWin.h │ ├── SciLexer.vcxproj │ ├── SciLexer.vcxproj.filters │ ├── SciTE.properties │ ├── ScintRes.rc │ ├── Scintilla.def │ ├── Scintilla.vcxproj │ ├── ScintillaDLL.cxx │ ├── ScintillaWin.cxx │ ├── ScintillaWin.h │ ├── deps.mak │ ├── makefile │ ├── nmdeps.mak │ └── scintilla.mak ├── version.info └── x64 ├── Debug ├── bass.dll ├── bass_fx.dll └── tag.dll └── Release └── tag.dll /.gitattributes: -------------------------------------------------------------------------------- 1 | MusicPlayer2/MusicPlayer2.rc text working-tree-encoding=UTF-16LE-BOM eol=CRLF 2 | scintilla/win32/ScintRes.rc text working-tree-encoding=UTF-16LE-BOM eol=CRLF 3 | -------------------------------------------------------------------------------- /Debug/bass.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/Debug/bass.dll -------------------------------------------------------------------------------- /Debug/bass_fx.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/Debug/bass_fx.dll -------------------------------------------------------------------------------- /Debug/tag.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/Debug/tag.dll -------------------------------------------------------------------------------- /Documents/Introduction.md: -------------------------------------------------------------------------------- 1 | # MusicPlayer2 帮助 2 | **帮助文档已经移至 [Wiki页面](https://github.com/zhongyang219/MusicPlayer2/wiki)。** -------------------------------------------------------------------------------- /MusicPlayer2/AcceleratorRes.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CAcceleratorRes 3 | { 4 | public: 5 | CAcceleratorRes(); 6 | ~CAcceleratorRes(); 7 | 8 | struct Key 9 | { 10 | unsigned short key{}; 11 | bool ctrl{}; 12 | bool shift{}; 13 | bool alt{}; 14 | 15 | std::wstring ToString() const; 16 | }; 17 | 18 | void Init(); 19 | std::wstring GetShortcutDescriptionById(UINT id) const; 20 | 21 | private: 22 | std::map m_accelerator_res; 23 | std::string m_res_data; 24 | }; 25 | -------------------------------------------------------------------------------- /MusicPlayer2/AddToPlaylistDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "CListBoxEnhanced.h" 4 | #include "SearchEditCtrl.h" 5 | 6 | 7 | // CAddToPlaylistDlg 对话框 8 | 9 | class CAddToPlaylistDlg : public CBaseDialog 10 | { 11 | DECLARE_DYNAMIC(CAddToPlaylistDlg) 12 | 13 | public: 14 | CAddToPlaylistDlg(CWnd* pParent = nullptr); // 标准构造函数 15 | virtual ~CAddToPlaylistDlg(); 16 | 17 | // 对话框数据 18 | #ifdef AFX_DESIGN_TIME 19 | enum { IDD = IDD_ADD_TO_PLAYLIST_DIALOG }; 20 | #endif 21 | 22 | wstring GetPlaylistSelected() const { return m_playlist_selected; } 23 | 24 | protected: 25 | CListBoxEnhanced m_playlist_list_ctrl; 26 | wstring m_playlist_selected; 27 | CSearchEditCtrl m_search_edit; 28 | vector m_list; //播放列表的列表 29 | vector m_search_result; //搜索结果 30 | bool m_searched{ false }; //是否处于搜索状态 31 | 32 | protected: 33 | virtual CString GetDialogName() const override; 34 | virtual bool InitializeControls() override; 35 | 36 | void ShowList(); 37 | void QuickSearch(const wstring& key_word); 38 | 39 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 40 | 41 | DECLARE_MESSAGE_MAP() 42 | public: 43 | virtual BOOL OnInitDialog(); 44 | virtual void OnOK(); 45 | afx_msg void OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult); 46 | afx_msg void OnEnChangeSearchEdit(); 47 | protected: 48 | afx_msg LRESULT OnSearchEditBtnClicked(WPARAM wParam, LPARAM lParam); 49 | }; 50 | -------------------------------------------------------------------------------- /MusicPlayer2/BASSEncodeLibrary.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "BASSEncodeLibrary.h" 3 | 4 | 5 | CBASSEncodeLibrary::CBASSEncodeLibrary() 6 | { 7 | } 8 | 9 | 10 | CBASSEncodeLibrary::~CBASSEncodeLibrary() 11 | { 12 | } 13 | 14 | bool CBASSEncodeLibrary::GetFunction() 15 | { 16 | bool rtn = true; 17 | //获取函数入口 18 | BASS_Encode_Start = (_BASS_Encode_Start)::GetProcAddress(m_dll_module, "BASS_Encode_Start"); 19 | BASS_Encode_Stop = (_BASS_Encode_Stop)::GetProcAddress(m_dll_module, "BASS_Encode_Stop"); 20 | BASS_Encode_IsActive = (_BASS_Encode_IsActive)::GetProcAddress(m_dll_module, "BASS_Encode_IsActive"); 21 | //判断是否成功 22 | rtn &= (BASS_Encode_Start != NULL); 23 | rtn &= (BASS_Encode_Stop != NULL); 24 | rtn &= (BASS_Encode_IsActive != NULL); 25 | return rtn; 26 | } 27 | -------------------------------------------------------------------------------- /MusicPlayer2/BASSEncodeLibrary.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "DllLib.h" 3 | typedef DWORD HENCODE; // encoder handle 4 | 5 | typedef void (CALLBACK ENCODEPROC)(HENCODE handle, DWORD channel, const void *buffer, DWORD length, void *user); 6 | /* Encoding callback function. 7 | handle : The encoder 8 | channel: The channel handle 9 | buffer : Buffer containing the encoded data 10 | length : Number of bytes 11 | user : The 'user' parameter value given when calling BASS_Encode_Start */ 12 | 13 | // BASS_Encode_Start flags 14 | #define BASS_ENCODE_PCM 64 // write PCM sample data (no encoder) 15 | #define BASS_ENCODE_AUTOFREE 0x40000 // free the encoder when the channel is freed 16 | 17 | 18 | class CBASSEncodeLibrary : public CDllLib 19 | { 20 | typedef HENCODE (WINAPI *_BASS_Encode_Start)(DWORD handle, const char *cmdline, DWORD flags, ENCODEPROC *proc, void *user); 21 | typedef BOOL (WINAPI *_BASS_Encode_Stop)(DWORD handle); 22 | typedef DWORD (WINAPI *_BASS_Encode_IsActive)(DWORD handle); 23 | public: 24 | CBASSEncodeLibrary(); 25 | ~CBASSEncodeLibrary(); 26 | 27 | //BASS encoder库中的函数指针 28 | _BASS_Encode_Start BASS_Encode_Start; 29 | _BASS_Encode_Stop BASS_Encode_Stop; 30 | _BASS_Encode_IsActive BASS_Encode_IsActive; 31 | 32 | HENCODE BASS_Encode_StartW(DWORD handle, const wchar_t *cmdline, DWORD flags, ENCODEPROC *proc, void *user) 33 | { 34 | return BASS_Encode_Start(handle, (const char*)cmdline, flags | BASS_UNICODE, proc, user); 35 | } 36 | 37 | private: 38 | virtual bool GetFunction() override; 39 | }; 40 | 41 | -------------------------------------------------------------------------------- /MusicPlayer2/BASSMidiLibrary.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "BASSMidiLibrary.h" 3 | 4 | 5 | CBASSMidiLibrary::CBASSMidiLibrary() 6 | { 7 | } 8 | 9 | 10 | CBASSMidiLibrary::~CBASSMidiLibrary() 11 | { 12 | UnInit(); 13 | } 14 | 15 | bool CBASSMidiLibrary::GetFunction() 16 | { 17 | bool rtn = true; 18 | //获取函数入口 19 | BASS_MIDI_FontInit = (_BASS_MIDI_FontInit)::GetProcAddress(m_dll_module, "BASS_MIDI_FontInit"); 20 | BASS_MIDI_StreamSetFonts = (_BASS_MIDI_StreamSetFonts)::GetProcAddress(m_dll_module, "BASS_MIDI_StreamSetFonts"); 21 | BASS_MIDI_FontGetInfo = (_BASS_MIDI_FontGetInfo)::GetProcAddress(m_dll_module, "BASS_MIDI_FontGetInfo"); 22 | BASS_MIDI_FontFree = (_BASS_MIDI_FontFree)::GetProcAddress(m_dll_module, "BASS_MIDI_FontFree"); 23 | BASS_MIDI_StreamGetEvent = (_BASS_MIDI_StreamGetEvent)::GetProcAddress(m_dll_module, "BASS_MIDI_StreamGetEvent"); 24 | BASS_MIDI_StreamGetMark = (_BASS_MIDI_StreamGetMark)::GetProcAddress(m_dll_module, "BASS_MIDI_StreamGetMark"); 25 | //判断是否成功 26 | rtn &= (BASS_MIDI_FontInit != NULL); 27 | rtn &= (BASS_MIDI_StreamSetFonts != NULL); 28 | rtn &= (BASS_MIDI_FontGetInfo != NULL); 29 | rtn &= (BASS_MIDI_FontFree != NULL); 30 | rtn &= (BASS_MIDI_StreamGetEvent != NULL); 31 | rtn &= (BASS_MIDI_StreamGetMark != NULL); 32 | return rtn; 33 | } 34 | -------------------------------------------------------------------------------- /MusicPlayer2/BASSWmaLibrary.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "BASSWmaLibrary.h" 3 | 4 | 5 | CBASSWmaLibrary::CBASSWmaLibrary() 6 | { 7 | } 8 | 9 | 10 | CBASSWmaLibrary::~CBASSWmaLibrary() 11 | { 12 | } 13 | 14 | bool CBASSWmaLibrary::GetFunction() 15 | { 16 | bool rtn = true; 17 | BASS_WMA_EncodeOpenFile = (_BASS_WMA_EncodeOpenFile)::GetProcAddress(m_dll_module, "BASS_WMA_EncodeOpenFile"); 18 | BASS_WMA_EncodeWrite = (_BASS_WMA_EncodeWrite)::GetProcAddress(m_dll_module, "BASS_WMA_EncodeWrite"); 19 | BASS_WMA_EncodeClose = (_BASS_WMA_EncodeClose)::GetProcAddress(m_dll_module, "BASS_WMA_EncodeClose"); 20 | BASS_WMA_EncodeSetTag = (_BASS_WMA_EncodeSetTag)::GetProcAddress(m_dll_module, "BASS_WMA_EncodeSetTag"); 21 | rtn &= (BASS_WMA_EncodeOpenFile != NULL); 22 | rtn &= (BASS_WMA_EncodeWrite != NULL); 23 | rtn &= (BASS_WMA_EncodeClose != NULL); 24 | rtn &= (BASS_WMA_EncodeSetTag != NULL); 25 | return rtn; 26 | } 27 | -------------------------------------------------------------------------------- /MusicPlayer2/BassMixLibrary.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "BassMixLibrary.h" 3 | 4 | 5 | CBassMixLibrary::CBassMixLibrary() 6 | { 7 | } 8 | 9 | 10 | CBassMixLibrary::~CBassMixLibrary() 11 | { 12 | } 13 | 14 | bool CBassMixLibrary::GetFunction() 15 | { 16 | bool rtn = true; 17 | BASS_Mixer_StreamCreate = (_BASS_Mixer_StreamCreate)::GetProcAddress(m_dll_module, "BASS_Mixer_StreamCreate"); 18 | BASS_Mixer_StreamAddChannel = (_BASS_Mixer_StreamAddChannel)::GetProcAddress(m_dll_module, "BASS_Mixer_StreamAddChannel"); 19 | rtn &= (BASS_Mixer_StreamCreate != NULL); 20 | rtn &= (BASS_Mixer_StreamAddChannel != NULL); 21 | return rtn; 22 | } 23 | -------------------------------------------------------------------------------- /MusicPlayer2/BassMixLibrary.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "DllLib.h" 3 | 4 | // BASS_Mixer_StreamCreate flags 5 | #define BASS_MIXER_END 0x10000 // end the stream when there are no sources 6 | 7 | class CBassMixLibrary : 8 | public CDllLib 9 | { 10 | typedef DWORD(WINAPI *_BASS_Mixer_StreamCreate)(DWORD freq, DWORD chans, DWORD flags); 11 | typedef BOOL(WINAPI *_BASS_Mixer_StreamAddChannel)(DWORD handle, DWORD channel, DWORD flags); 12 | 13 | public: 14 | CBassMixLibrary(); 15 | ~CBassMixLibrary(); 16 | 17 | _BASS_Mixer_StreamCreate BASS_Mixer_StreamCreate; 18 | _BASS_Mixer_StreamAddChannel BASS_Mixer_StreamAddChannel; 19 | 20 | private: 21 | virtual bool GetFunction() override; 22 | 23 | }; 24 | 25 | -------------------------------------------------------------------------------- /MusicPlayer2/BrowseEdit.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ColorConvert.h" 3 | #include 4 | #include "CommonData.h" 5 | 6 | #define WM_EDIT_BROWSE_CHANGED (WM_USER+126) //通过“浏览”按钮选择了一个文件或文件夹后发送此消息 7 | // CBrowseEdit 8 | 9 | class CBrowseEdit : public CMFCEditBrowseCtrl 10 | { 11 | DECLARE_DYNAMIC(CBrowseEdit) 12 | 13 | public: 14 | CBrowseEdit(); 15 | virtual ~CBrowseEdit(); 16 | 17 | //自定义的编辑模式 18 | enum class EditBrowseMode 19 | { 20 | NONE, 21 | RENAME, //重命名模式 22 | LIST, //编辑列表模式 aa,bb,cc 23 | LIST2 //编辑列表模式 "aa","bb","cc" 24 | }; 25 | 26 | virtual void OnDrawBrowseButton(CDC* pDC, CRect rect, BOOL bIsButtonPressed, BOOL bIsButtonHot) override; 27 | virtual void OnChangeLayout() override; 28 | virtual void OnBrowse() override; 29 | virtual void OnAfterUpdate() override; 30 | void SetEditBrowseMode(EditBrowseMode browse_mode); 31 | void SetPopupDlgTitle(const wstring& popup_dlg_title); 32 | 33 | protected: 34 | DECLARE_MESSAGE_MAP() 35 | 36 | private: 37 | ColorTable& m_theme_color; 38 | wstring m_btn_str; 39 | EditBrowseMode m_browse_mode; //自定义的编辑模式,当基类的m_Mode设置为BrowseMode_Default时使用 40 | CString m_poopup_dlg_title; //弹出对话框的标题 41 | 42 | public: 43 | afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point); 44 | protected: 45 | afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 46 | }; 47 | -------------------------------------------------------------------------------- /MusicPlayer2/CDevicesManager.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class CMMNotificationClient; 4 | struct IMMDeviceEnumerator; 5 | struct IMMDevice; 6 | 7 | class CDevicesManager 8 | { 9 | public: 10 | CDevicesManager(void); 11 | ~CDevicesManager(void); 12 | HRESULT InitializeDeviceEnumerator(); 13 | void ReleaseDeviceEnumerator(); 14 | 15 | void DefaultMultimediaDeviceChanged(); 16 | 17 | friend class CMMNotificationClient; 18 | private: 19 | IMMDeviceEnumerator* pEnum; 20 | CMMNotificationClient* client; 21 | }; 22 | 23 | -------------------------------------------------------------------------------- /MusicPlayer2/CDonateDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | 4 | // CDonateDlg 对话框 5 | 6 | class CDonateDlg : public CBaseDialog 7 | { 8 | DECLARE_DYNAMIC(CDonateDlg) 9 | 10 | public: 11 | CDonateDlg(CWnd* pParent = nullptr); // 标准构造函数 12 | virtual ~CDonateDlg(); 13 | 14 | // 对话框数据 15 | #ifdef AFX_DESIGN_TIME 16 | enum { IDD = IDD_DONATE_DIALOG }; 17 | #endif 18 | 19 | private: 20 | CRect m_pic1_rect; 21 | CRect m_pic2_rect; 22 | 23 | protected: 24 | virtual CString GetDialogName() const override; 25 | virtual bool IsRememberDialogSizeEnable() const { return false; }; 26 | virtual bool InitializeControls() override; 27 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 28 | 29 | DECLARE_MESSAGE_MAP() 30 | public: 31 | virtual BOOL OnInitDialog(); 32 | afx_msg void OnPaint(); 33 | }; 34 | -------------------------------------------------------------------------------- /MusicPlayer2/CHotKey.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CHotKey 3 | { 4 | public: 5 | bool ctrl{}; 6 | bool shift{}; 7 | bool alt{}; 8 | short key{}; 9 | 10 | public: 11 | CHotKey(); 12 | ~CHotKey(); 13 | 14 | WORD Modifiers() const; 15 | 16 | wstring ToString() const; 17 | void FromString(const wstring& str); 18 | wstring GetHotkeyName() const; 19 | void Clear(); 20 | }; 21 | 22 | -------------------------------------------------------------------------------- /MusicPlayer2/CHotKeySettingDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "CHotkeyManager.h" 3 | #include "TabDlg.h" 4 | #include "ListCtrlEx.h" 5 | 6 | 7 | // CHotKeySettingDlg 对话框 8 | 9 | class CHotKeySettingDlg : public CTabDlg 10 | { 11 | DECLARE_DYNAMIC(CHotKeySettingDlg) 12 | 13 | public: 14 | CHotKeySettingDlg(CWnd* pParent = nullptr); // 标准构造函数 15 | virtual ~CHotKeySettingDlg(); 16 | 17 | // 对话框数据 18 | #ifdef AFX_DESIGN_TIME 19 | enum { IDD = IDD_HOT_KEY_SETTINGS_DIALOG }; 20 | #endif 21 | 22 | public: 23 | std::map m_hotkey_group; 24 | GlobalHotKeySettingData m_data; 25 | 26 | private: 27 | CListCtrlEx m_key_list; 28 | CButton m_hot_key_enable_check; 29 | CButton m_enable_global_multimedia_key_check; 30 | int m_item_selected{ -1 }; 31 | CToolTipCtrl m_toolTip; 32 | 33 | protected: 34 | void ShowKeyList(); 35 | void EnableControl(); 36 | void ListClicked(); 37 | 38 | virtual bool InitializeControls() override; 39 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 40 | 41 | DECLARE_MESSAGE_MAP() 42 | public: 43 | virtual BOOL OnInitDialog(); 44 | CHotKeyCtrl m_hot_key_ctrl; 45 | afx_msg void OnBnClickedSetButton(); 46 | afx_msg void OnNMClickHotKeyList(NMHDR *pNMHDR, LRESULT *pResult); 47 | afx_msg void OnNMRClickHotKeyList(NMHDR *pNMHDR, LRESULT *pResult); 48 | afx_msg void OnBnClickedHotKeyEnableCheck(); 49 | afx_msg void OnBnClickedEnableGlobalMultimediaKeyCheck(); 50 | virtual BOOL PreTranslateMessage(MSG* pMsg); 51 | }; 52 | -------------------------------------------------------------------------------- /MusicPlayer2/CHotkeyManager.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "CHotKey.h" 3 | #include "IniHelper.h" 4 | 5 | enum eHotKeyId 6 | { 7 | HK_PLAY_PAUSE = 1031, 8 | HK_STOP, 9 | HK_FF, 10 | HK_REW, 11 | HK_PREVIOUS, 12 | HK_NEXT, 13 | HK_VOLUME_UP, 14 | HK_VOLUME_DOWN, 15 | HK_EXIT, 16 | HK_SHOW_HIDE_PLAYER, 17 | HK_SHOW_HIDE_DESKTOP_LYRIC, 18 | HK_ADD_TO_MY_FAVOURITE, 19 | HK_MAX 20 | }; 21 | 22 | class CHotkeyManager 23 | { 24 | public: 25 | CHotkeyManager(); 26 | ~CHotkeyManager(); 27 | 28 | using HotKeyMap = std::map; 29 | 30 | void SetHotKey(eHotKeyId id, CHotKey key); 31 | CHotKey GetHotKey(eHotKeyId id); 32 | void RegisterAllHotKey(); 33 | void UnRegisterAllHotKey(); 34 | void FromHotkeyGroup(const HotKeyMap& group); 35 | const HotKeyMap& GetHotKeyGroup() const; 36 | 37 | void LoadFromIni(const CIniHelper& ini); 38 | void SaveToTni(CIniHelper& ini); 39 | 40 | private: 41 | HotKeyMap m_hotkey_group; 42 | }; 43 | -------------------------------------------------------------------------------- /MusicPlayer2/CListBoxEnhanced.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ListCtrlEx.h" 3 | 4 | #define WM_LISTBOX_SEL_CHANGED (WM_USER+116) 5 | 6 | class CListBoxEnhanced : 7 | public CListCtrlEx 8 | { 9 | public: 10 | CListBoxEnhanced(); 11 | ~CListBoxEnhanced(); 12 | 13 | void AddString(LPCTSTR str); 14 | CString GetItemText(int index); 15 | virtual bool DeleteItem(int nItem) override; 16 | 17 | protected: 18 | virtual void PreSubclassWindow(); 19 | int CalculateColumnWidth(); 20 | 21 | DECLARE_MESSAGE_MAP() 22 | afx_msg void OnNMClick(NMHDR *pNMHDR, LRESULT *pResult); 23 | afx_msg BOOL OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult); //这里函数的返回值必须为BOOL,消息映射的宏使用ON_NOTIFY_REFLECT_EX,函数返回FALSE,这样派生类才能正常响应此消息 24 | afx_msg void OnSize(UINT nType, int cx, int cy); 25 | }; 26 | 27 | -------------------------------------------------------------------------------- /MusicPlayer2/CListenTimeStatisticsDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "ListCtrlEx.h" 4 | 5 | // CListenTimeStatisticsDlg 对话框 6 | 7 | class CListenTimeStatisticsDlg : public CBaseDialog 8 | { 9 | DECLARE_DYNAMIC(CListenTimeStatisticsDlg) 10 | 11 | public: 12 | CListenTimeStatisticsDlg(CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CListenTimeStatisticsDlg(); 14 | 15 | // 对话框数据 16 | #ifdef AFX_DESIGN_TIME 17 | enum { IDD = IDD_LISTEN_TIME_STATISTICS_DLG }; 18 | #endif 19 | 20 | protected: 21 | enum ColumeIndex 22 | { 23 | COL_INDEX = 0, 24 | COL_TRACK, 25 | COL_PATH, 26 | COL_TOTAL_TIME, 27 | COL_LENGTH, 28 | COL_TIMES, 29 | }; 30 | 31 | struct ListItem 32 | { 33 | wstring name; 34 | wstring path; 35 | Time total_time; 36 | Time length; 37 | double times; 38 | }; 39 | 40 | protected: 41 | CListCtrlEx m_list_ctrl; 42 | 43 | vector m_data_list; 44 | 45 | protected: 46 | virtual CString GetDialogName() const override; 47 | virtual bool InitializeControls() override; 48 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 49 | 50 | void ShowData(bool size_changed = true); 51 | ListItem SongInfoToListItem(const SongInfo& song); 52 | 53 | DECLARE_MESSAGE_MAP() 54 | public: 55 | virtual BOOL OnInitDialog(); 56 | afx_msg void OnBnClickedExportButton(); 57 | afx_msg void OnBnClickedClearButton(); 58 | afx_msg void OnHdnItemclickList1(NMHDR *pNMHDR, LRESULT *pResult); 59 | }; 60 | -------------------------------------------------------------------------------- /MusicPlayer2/CMMNotificationClient.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | class CDevicesManager; 4 | class CMMNotificationClient : public IMMNotificationClient 5 | { 6 | public: 7 | CMMNotificationClient(IMMDeviceEnumerator* _pEnum, CDevicesManager* manager); 8 | virtual ~CMMNotificationClient(); 9 | ULONG STDMETHODCALLTYPE AddRef(); 10 | ULONG STDMETHODCALLTYPE Release(); 11 | HRESULT STDMETHODCALLTYPE QueryInterface( 12 | REFIID riid, VOID** ppvInterface); 13 | HRESULT STDMETHODCALLTYPE OnDefaultDeviceChanged( 14 | EDataFlow flow, ERole role, 15 | LPCWSTR pwstrDeviceId); 16 | HRESULT STDMETHODCALLTYPE OnDeviceAdded(LPCWSTR pwstrDeviceId); 17 | HRESULT STDMETHODCALLTYPE OnDeviceRemoved(LPCWSTR pwstrDeviceId); 18 | HRESULT STDMETHODCALLTYPE OnDeviceStateChanged( 19 | LPCWSTR pwstrDeviceId, 20 | DWORD dwNewState); 21 | HRESULT STDMETHODCALLTYPE OnPropertyValueChanged( 22 | LPCWSTR pwstrDeviceId, 23 | const PROPERTYKEY key); 24 | private: 25 | LONG _cRef; 26 | IMMDeviceEnumerator* _pEnum; 27 | CDevicesManager* manager; 28 | }; 29 | 30 | -------------------------------------------------------------------------------- /MusicPlayer2/CMainDialogBase.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class CMainDialogBase : 4 | public CDialog 5 | { 6 | DECLARE_DYNAMIC(CMainDialogBase) 7 | public: 8 | CMainDialogBase(UINT nIDTemplate, CWnd *pParent = NULL); 9 | ~CMainDialogBase(); 10 | 11 | protected: 12 | void SetFullScreen(bool full_screen); //设置窗口全屏(来自:https://www.cnblogs.com/weixinhum/p/3916673.html) 13 | void ShowTitlebar(bool show); //是否显示标题栏 14 | void ShowSizebox(bool show); //是否显示大小边框 15 | 16 | private: 17 | bool m_bFullScreen{ false }; 18 | WINDOWPLACEMENT m_struOldWndpl{}; // 结构中包含了有关窗口在屏幕上位置的信息 19 | 20 | public: 21 | DECLARE_MESSAGE_MAP() 22 | afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI); 23 | }; 24 | -------------------------------------------------------------------------------- /MusicPlayer2/CNotifyIcon.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CNotifyIcon 3 | { 4 | public: 5 | CNotifyIcon(); 6 | ~CNotifyIcon(); 7 | void Init(HICON hIcon); 8 | void SetIcon(HICON hIcon); 9 | 10 | void AddNotifyIcon(); 11 | void DeleteNotifyIcon(); 12 | void SetIconToolTip(LPCTSTR strTip); 13 | 14 | void OnNotifyIcon(UINT msgId, HWND hMiniMode); 15 | 16 | private: 17 | NOTIFYICONDATA m_ntIcon; 18 | CString m_tool_tip_str; 19 | }; 20 | 21 | -------------------------------------------------------------------------------- /MusicPlayer2/COSUPlayerHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SongInfo.h" 3 | class COSUPlayerHelper 4 | { 5 | public: 6 | COSUPlayerHelper(); 7 | ~COSUPlayerHelper(); 8 | 9 | static bool IsOsuFolder(const std::wstring& strPath); 10 | static bool IsOsuFile(const std::wstring& strPath); 11 | static void GetOSUAudioFiles(wstring path, vector& song_list); 12 | static void GetOSUAudioFiles(wstring path, vector& files); 13 | static void GetOSUAudioTitleArtist(SongInfo& song_info); 14 | static wstring GetAlbumCover(wstring file_path); 15 | 16 | private: 17 | static void GetOSUFile(wstring folder_path); 18 | }; 19 | 20 | 21 | //解析osu文件的类 22 | class COSUFile 23 | { 24 | public: 25 | COSUFile(const wchar_t* file_path); 26 | wstring GetAudioFileName(); 27 | wstring GetArtist(); 28 | wstring GetTitle(); 29 | wstring GetAlbum(); 30 | wstring GetBeatampId(); 31 | wstring GetBeatampSetId(); 32 | wstring GetAlbumCoverFileName(); 33 | 34 | private: 35 | void GetTag(const string& tag, string& tag_content); 36 | wstring GetTagItem(const string& tag, const string& tag_content); 37 | 38 | private: 39 | string m_data; 40 | string m_general_seg; 41 | string m_metadata_seg; 42 | string m_events_seg; 43 | }; -------------------------------------------------------------------------------- /MusicPlayer2/CPlayerUIHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ColorConvert.h" 3 | 4 | struct UIColors //界面颜色 5 | { 6 | COLORREF color_text; //文本颜色 7 | COLORREF color_text_lable; //标签文本的颜色 8 | COLORREF color_text_2; //歌词未播放文本的颜色 9 | COLORREF color_text_heighlight; //鼠标指向时文本的颜色 10 | COLORREF color_back; //背景颜色 11 | COLORREF color_lyric_back; //歌词界面背景颜色 12 | COLORREF color_control_bar_back; //控制条背景颜色 13 | COLORREF color_spectrum; //频谱分析柱形的颜色 14 | COLORREF color_spectrum_cover; //有专辑封面时的频谱分析柱形的颜色 15 | COLORREF color_spectrum_back; //频谱分析的背景颜色 16 | COLORREF color_button_back; //歌词翻译按钮的背景色 17 | COLORREF color_button_pressed; //按钮按下的颜色 18 | COLORREF color_button_hover; //按钮指向时的颜色 19 | COLORREF color_stack_indicator; //staticElement指示器的颜色 20 | COLORREF color_scrollbar_handle; //滚动条把手的颜色 21 | }; 22 | 23 | class CPlayerUIHelper 24 | { 25 | public: 26 | CPlayerUIHelper(); 27 | ~CPlayerUIHelper(); 28 | 29 | static UIColors GetUIColors(const ColorTable& colorTable, bool dark, bool draw_alpha = true); 30 | 31 | static bool IsMidiLyric(); //是否绘制MIDI音乐的歌词 32 | static bool IsDrawStatusBar(); //是否绘制状态栏 33 | 34 | static double GetScrollTextPixel(); 35 | 36 | }; 37 | 38 | -------------------------------------------------------------------------------- /MusicPlayer2/CTabCtrlEx.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "IconMgr.h" 3 | 4 | // CTabCtrlEx 5 | 6 | class CTabCtrlEx : public CTabCtrl 7 | { 8 | DECLARE_DYNAMIC(CTabCtrlEx) 9 | 10 | public: 11 | CTabCtrlEx(); 12 | virtual ~CTabCtrlEx(); 13 | 14 | void AddWindow(CWnd* pWnd, LPCTSTR lable_text, IconMgr::IconType icon_type); //向当前tab控件添加一个子窗口 15 | void SetCurTab(int index); 16 | CWnd* GetCurrentTab(); 17 | // 调整所有标签页大小兼执行设置图标 18 | void AdjustTabWindowSize(); 19 | 20 | void Clear(); 21 | 22 | protected: 23 | void CalSubWindowSize(); 24 | 25 | DECLARE_MESSAGE_MAP() 26 | 27 | protected: 28 | vector m_tab_list; //保存tab控件每个子窗口的指针 29 | vector m_icon_list; 30 | int m_last_tab_index{ -1 }; 31 | public: 32 | afx_msg void OnTcnSelchange(NMHDR *pNMHDR, LRESULT *pResult); 33 | virtual void PreSubclassWindow(); 34 | 35 | CRect m_tab_rect; 36 | afx_msg void OnSize(UINT nType, int cx, int cy); 37 | }; 38 | 39 | 40 | -------------------------------------------------------------------------------- /MusicPlayer2/CTest.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | //用于测试的代码 4 | class CTest 5 | { 6 | public: 7 | CTest(); 8 | ~CTest(); 9 | 10 | static void Test(); 11 | 12 | private: 13 | static void TestStringMatch(); 14 | static void TestCrash(); 15 | static void TestShortCut(); 16 | static void TestCommon(); 17 | static void TestOSUFile(); 18 | static void TestReg(); 19 | static void TestMediaLib(); 20 | static void TestAudioTag(); 21 | static void TestImageResize(); 22 | static void TestCrashDlg(); 23 | static void TestTagParse(); 24 | static void TestStringSplit(); 25 | static void TestRating(); 26 | static void TestCueSave(); 27 | static void TestFilePathHelper(); 28 | static void TestStringToInt(); 29 | static void TestChinesePingyinMatch(); 30 | }; 31 | 32 | -------------------------------------------------------------------------------- /MusicPlayer2/CVariant.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CVariant 3 | { 4 | public: 5 | CVariant(int value); 6 | CVariant(size_t value); 7 | CVariant(double value); 8 | CVariant(LPCTSTR value); 9 | CVariant(const CString& value); 10 | CVariant(const wstring& value); 11 | 12 | ~CVariant(); 13 | 14 | CString ToString() const; 15 | int ToInt() const; 16 | double ToDouble() const; 17 | bool ToBool() const; 18 | 19 | private: 20 | enum class eType { INT, UINT, DOUBLE, STRING }; 21 | 22 | int m_value_int{}; 23 | double m_value_double{}; 24 | CString m_value_string; 25 | eType m_type; 26 | 27 | }; 28 | 29 | -------------------------------------------------------------------------------- /MusicPlayer2/ChinesePingyinRes.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | 6 | class CChinesePingyinRes 7 | { 8 | public: 9 | CChinesePingyinRes(); 10 | ~CChinesePingyinRes(); 11 | 12 | void Init(); 13 | static bool IsChineseCharactor(wchar_t ch); 14 | //判断一个字符串是否匹配关键字,关键字支持直接匹配、拼音首字母和全拼匹配,但是只支持一种方式匹配,不支持混合匹配 15 | bool IsStringMatchWithPingyin(const std::wstring& key_words, const std::wstring& compared_str); 16 | 17 | private: 18 | //保存每个汉字的拼音 19 | std::unordered_map m_pingyin_map; 20 | }; 21 | 22 | -------------------------------------------------------------------------------- /MusicPlayer2/ColorStatic.cpp: -------------------------------------------------------------------------------- 1 | // ColorStatic.cpp : 实现文件 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "ColorStatic.h" 6 | 7 | 8 | // CColorStatic 9 | 10 | IMPLEMENT_DYNAMIC(CColorStatic, CStatic) 11 | 12 | CColorStatic::CColorStatic() 13 | { 14 | 15 | } 16 | 17 | CColorStatic::~CColorStatic() 18 | { 19 | } 20 | 21 | void CColorStatic::SetFillColor(COLORREF fill_color) 22 | { 23 | m_fill_color = fill_color; 24 | Invalidate(); 25 | } 26 | 27 | 28 | BEGIN_MESSAGE_MAP(CColorStatic, CStatic) 29 | ON_WM_PAINT() 30 | END_MESSAGE_MAP() 31 | 32 | 33 | 34 | // CColorStatic 消息处理程序 35 | 36 | 37 | 38 | 39 | void CColorStatic::OnPaint() 40 | { 41 | CPaintDC dc(this); // device context for painting 42 | // TODO: 在此处添加消息处理程序代码 43 | // 不为绘图消息调用 CStatic::OnPaint() 44 | CRect rect; 45 | GetClientRect(rect); 46 | dc.FillSolidRect(rect, m_fill_color); 47 | } 48 | -------------------------------------------------------------------------------- /MusicPlayer2/ColorStatic.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | 4 | // CColorStatic 5 | 6 | class CColorStatic : public CStatic 7 | { 8 | DECLARE_DYNAMIC(CColorStatic) 9 | 10 | public: 11 | CColorStatic(); 12 | virtual ~CColorStatic(); 13 | 14 | void SetFillColor(COLORREF fill_color); //设置要填充的背景色 15 | 16 | protected: 17 | COLORREF m_fill_color{ RGB(255, 255,255) }; 18 | 19 | protected: 20 | DECLARE_MESSAGE_MAP() 21 | public: 22 | afx_msg void OnPaint(); 23 | }; 24 | 25 | 26 | -------------------------------------------------------------------------------- /MusicPlayer2/ColorStaticEx.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "ColorStaticEx.h" 3 | 4 | 5 | CColorStaticEx::CColorStaticEx() 6 | { 7 | } 8 | 9 | 10 | CColorStaticEx::~CColorStaticEx() 11 | { 12 | } 13 | 14 | 15 | COLORREF CColorStaticEx::GetFillColor() const 16 | { 17 | return m_fill_color; 18 | } 19 | 20 | void CColorStaticEx::PreSubclassWindow() 21 | { 22 | // TODO: 在此添加专用代码和/或调用基类 23 | DWORD dwStyle = GetStyle(); 24 | ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY); 25 | 26 | CColorStatic::PreSubclassWindow(); 27 | } 28 | BEGIN_MESSAGE_MAP(CColorStaticEx, CColorStatic) 29 | // ON_CONTROL_REFLECT(STN_CLICKED, &CColorStaticEx::OnStnClicked) 30 | ON_WM_LBUTTONUP() 31 | END_MESSAGE_MAP() 32 | 33 | 34 | //void CColorStaticEx::OnStnClicked() 35 | //{ 36 | // // TODO: 在此添加控件通知处理程序代码 37 | //} 38 | 39 | 40 | void CColorStaticEx::OnLButtonUp(UINT nFlags, CPoint point) 41 | { 42 | // TODO: 在此添加消息处理程序代码和/或调用默认值 43 | CColorDialog color_dlg(m_fill_color); 44 | if (color_dlg.DoModal() == IDOK) 45 | { 46 | SetFillColor(color_dlg.GetColor()); 47 | 48 | //向父窗口发送WM_COLOR_SELECTED消息 49 | CWnd* pParent = GetParent(); 50 | if(pParent!=nullptr) 51 | ::SendMessage(pParent->GetSafeHwnd(), WM_COLOR_SELECTED, (WPARAM)this, 0); 52 | } 53 | 54 | CColorStatic::OnLButtonUp(nFlags, point); 55 | } 56 | -------------------------------------------------------------------------------- /MusicPlayer2/ColorStaticEx.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ColorStatic.h" 3 | class CColorStaticEx : 4 | public CColorStatic 5 | { 6 | public: 7 | CColorStaticEx(); 8 | ~CColorStaticEx(); 9 | COLORREF GetFillColor() const; 10 | 11 | virtual void PreSubclassWindow(); 12 | DECLARE_MESSAGE_MAP() 13 | // afx_msg void OnStnClicked(); 14 | afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 15 | }; 16 | 17 | -------------------------------------------------------------------------------- /MusicPlayer2/CommonData.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "CommonData.h" 3 | #include "MusicPlayer2.h" 4 | 5 | bool UIData::ShowWindowMenuBar() const 6 | { 7 | return show_menu_bar && theApp.m_app_setting_data.show_window_frame && !full_screen; 8 | } 9 | 10 | bool UIData::ShowUiMenuBar() const 11 | { 12 | return show_menu_bar && !theApp.m_app_setting_data.show_window_frame && !full_screen; 13 | } 14 | 15 | int ApperanceSettingData::TitleDisplayItem() const 16 | { 17 | int value{}; 18 | if (show_minimize_btn_in_titlebar) 19 | value |= (1 << 0); 20 | if (show_maximize_btn_in_titlebar) 21 | value |= (1 << 1); 22 | if (show_minimode_btn_in_titlebar) 23 | value |= (1 << 2); 24 | if (show_fullscreen_btn_in_titlebar) 25 | value |= (1 << 3); 26 | if (show_skin_btn_in_titlebar) 27 | value |= (1 << 4); 28 | if (show_settings_btn_in_titlebar) 29 | value |= (1 << 5); 30 | return value; 31 | } 32 | 33 | void FontSet::Init(LPCTSTR font_name) 34 | { 35 | for (int font_size{ FONT_SIZE_MIN }; font_size <= FONT_SIZE_MAX; font_size++) 36 | { 37 | fonts[font_size].SetFont(font_size, font_name); 38 | } 39 | dlg.SetFont(9, font_name); 40 | } 41 | 42 | UIFont& FontSet::GetFontBySize(int font_size) 43 | { 44 | if (font_size < FONT_SIZE_MIN) 45 | font_size = FONT_SIZE_MIN; 46 | if (font_size > FONT_SIZE_MAX) 47 | font_size = FONT_SIZE_MAX; 48 | auto iter = fonts.find(font_size); 49 | if (iter != fonts.end()) 50 | return iter->second; 51 | return dlg; 52 | } 53 | -------------------------------------------------------------------------------- /MusicPlayer2/CommonDialogMgr.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CommonDialogMgr 3 | { 4 | public: 5 | CommonDialogMgr(); 6 | ~CommonDialogMgr(); 7 | 8 | // 删除一个文件 9 | static int DeleteAFile(HWND hwnd, wstring file); 10 | // 删除多个文件 11 | static int DeleteFiles(HWND hwnd, const vector& files); 12 | 13 | // 复制一个文件 14 | static int CopyAFile(HWND hwnd, wstring file_from, wstring file_to); 15 | // 复制多个文件 16 | static int CopyFiles(HWND hwnd, const vector& files, wstring file_to); 17 | 18 | // 移动一个文件 19 | // file_from:要移动的文件的路径 20 | // file_to:移动目标的目录的位置 21 | static int MoveAFile(HWND hwnd, wstring file_from, wstring file_to); 22 | // 移动多个文件 23 | static int MoveFiles(HWND hwnd, const vector& files, wstring file_to); 24 | 25 | // TODO: MessageBox 26 | }; 27 | 28 | -------------------------------------------------------------------------------- /MusicPlayer2/CoverDownloadCommon.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "CoverDownloadCommon.h" 3 | 4 | 5 | CCoverDownloadCommon::CCoverDownloadCommon() 6 | { 7 | } 8 | 9 | 10 | CCoverDownloadCommon::~CCoverDownloadCommon() 11 | { 12 | } 13 | 14 | wstring CCoverDownloadCommon::GetAlbumCoverURL(const wstring & song_id) 15 | { 16 | if(song_id.empty()) 17 | return wstring(); 18 | //获取专辑封面接口的URL 19 | wchar_t buff[256]; 20 | swprintf_s(buff, L"http://music.163.com/api/song/detail/?id=%s&ids=%%5B%s%%5D&csrf_token=", song_id.c_str(), song_id.c_str()); 21 | wstring contents; 22 | //将URL内容保存到内存 23 | if(!CInternetCommon::GetURL(wstring(buff), contents)) 24 | return wstring(); 25 | #ifdef _DEBUG 26 | ofstream out_put{ L".\\cover_down.log", std::ios::binary }; 27 | out_put << CCommon::UnicodeToStr(contents, CodeType::UTF8); 28 | out_put.close(); 29 | #endif // _DEBUG 30 | 31 | size_t index; 32 | index = contents.find(L"\"album\""); 33 | if (index == wstring::npos) 34 | return wstring(); 35 | index = contents.find(L"\"picUrl\"", index + 7); 36 | if (index == wstring::npos) 37 | return wstring(); 38 | wstring url; 39 | size_t index1; 40 | index1 = contents.find(L'\"', index + 10); 41 | url = contents.substr(index + 10, index1 - index - 10); 42 | 43 | return url; 44 | } 45 | -------------------------------------------------------------------------------- /MusicPlayer2/CoverDownloadCommon.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "InternetCommon.h" 3 | 4 | class CCoverDownloadCommon 5 | { 6 | public: 7 | CCoverDownloadCommon(); 8 | ~CCoverDownloadCommon(); 9 | 10 | static wstring GetAlbumCoverURL(const wstring& song_id); //根据一首歌曲的ID,获取专辑封面的链接 11 | }; 12 | 13 | -------------------------------------------------------------------------------- /MusicPlayer2/CueFile.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SongInfo.h" 3 | #include "Common.h" 4 | 5 | class CCueFile 6 | { 7 | public: 8 | CCueFile(const std::wstring& file_path); 9 | CCueFile(); 10 | ~CCueFile(); 11 | 12 | // 使用移动语义覆盖参数song_list,调用后此CCueFile对象不再可用 13 | void MoveToSongList(vector& song_list); 14 | std::vector& GetAnalysisResult(); 15 | 16 | //将所有cue音轨保存到cue文件 17 | //如果file_path为空,则保存到m_file_path 18 | bool Save(std::wstring file_path = std::wstring()); 19 | 20 | //从解析结果中获取一个音轨信息 21 | SongInfo& GetTrackInfo(const std::wstring& audio_path, int track); 22 | 23 | const std::map& GetCuePropertyMap() const; 24 | const std::map& GetTrackPropertyMap(const std::wstring& audio_path, int track); 25 | 26 | private: 27 | void DoAnalysis(); 28 | static wstring GetCommand(const wstring& str_contents, const wstring& str, size_t pos = 0); 29 | 30 | //查找str_contents中的所有属性,并添加到property_map中 31 | static void FindAllProperty(const wstring& str_contents, std::map& property_map); 32 | 33 | private: 34 | std::wstring m_file_path; 35 | std::wstring m_file_content_wcs; 36 | CodeType m_code_type{ CodeType::AUTO }; 37 | std::vector m_result; 38 | std::map m_cue_property_map; //保存整个cue共享的属性 39 | std::map>> m_track_property_maps; //保存cue中每个音频文件每个音轨的属性 40 | }; 41 | 42 | -------------------------------------------------------------------------------- /MusicPlayer2/DllLib.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "DllLib.h" 3 | 4 | 5 | CDllLib::CDllLib() 6 | { 7 | } 8 | 9 | 10 | CDllLib::~CDllLib() 11 | { 12 | } 13 | 14 | void CDllLib::Init(const wstring & dll_path) 15 | { 16 | //载入DLL 17 | m_dll_module = ::LoadLibrary(dll_path.c_str()); 18 | //获取函数入口 19 | bool rtn = false; 20 | if(m_dll_module != NULL) 21 | rtn = GetFunction(); 22 | //判断是否成功 23 | m_success = (m_dll_module != NULL && rtn); 24 | } 25 | 26 | void CDllLib::UnInit() 27 | { 28 | if (m_dll_module != NULL) 29 | { 30 | FreeLibrary(m_dll_module); 31 | m_dll_module = NULL; 32 | } 33 | } 34 | 35 | bool CDllLib::IsSucceed() 36 | { 37 | return m_success; 38 | } 39 | -------------------------------------------------------------------------------- /MusicPlayer2/DllLib.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | //使用动态方式加载Dll 4 | class CDllLib 5 | { 6 | public: 7 | CDllLib(); 8 | ~CDllLib(); 9 | void Init(const wstring& dll_path); //载入DLL文件并获取函数入口 10 | void UnInit(); 11 | bool IsSucceed(); //判断DLL中的函数是否获取成功 12 | 13 | protected: 14 | virtual bool GetFunction() = 0; //从DLL中获取函数入口地址并保存起来,成功则返回true 15 | 16 | protected: 17 | HMODULE m_dll_module; 18 | bool m_success{ false }; 19 | 20 | }; 21 | 22 | -------------------------------------------------------------------------------- /MusicPlayer2/EditEx.h: -------------------------------------------------------------------------------- 1 | //CEdit的派生类,用于支持按Ctrl+A全选 2 | #pragma once 3 | 4 | 5 | // CEditEx 6 | 7 | class CEditEx : public CEdit 8 | { 9 | DECLARE_DYNAMIC(CEditEx) 10 | 11 | public: 12 | CEditEx(); 13 | virtual ~CEditEx(); 14 | 15 | void ResetModified(); 16 | CString GetText() const; 17 | void SetColorWhenModified(bool val); //是否要在有修改时将文本颜色改为主题色 18 | 19 | protected: 20 | bool m_show_color_when_modified{ true }; 21 | 22 | protected: 23 | DECLARE_MESSAGE_MAP() 24 | virtual BOOL PreTranslateMessage(MSG* pMsg); 25 | public: 26 | afx_msg HBRUSH CtlColor(CDC* /*pDC*/, UINT /*nCtlColor*/); 27 | protected: 28 | afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 29 | }; 30 | 31 | 32 | -------------------------------------------------------------------------------- /MusicPlayer2/EditStringListDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "EditableListBox.h" 4 | 5 | // CEditStringListDlg 对话框 6 | 7 | class CEditStringListDlg : public CBaseDialog 8 | { 9 | DECLARE_DYNAMIC(CEditStringListDlg) 10 | 11 | public: 12 | CEditStringListDlg(vector& items, CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CEditStringListDlg(); 14 | 15 | void SetTitle(LPCTSTR title); 16 | void SetDlgIcon(IconMgr::IconType icon_type); 17 | 18 | // 对话框数据 19 | #ifdef AFX_DESIGN_TIME 20 | enum { IDD = IDD_SELECT_ITEM_DIALOG }; 21 | #endif 22 | 23 | private: 24 | CEditableListBox m_list_ctrl; 25 | CString m_title; 26 | vector& m_items; 27 | IconMgr::IconType m_icon_type{ IconMgr::IconType::IT_NO_ICON }; 28 | 29 | protected: 30 | virtual CString GetDialogName() const override; 31 | virtual bool InitializeControls() override; 32 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 33 | 34 | DECLARE_MESSAGE_MAP() 35 | public: 36 | virtual BOOL OnInitDialog(); 37 | virtual void OnOK(); 38 | }; 39 | -------------------------------------------------------------------------------- /MusicPlayer2/EditableListBox.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "CListBoxEnhanced.h" 3 | 4 | class CEditableListBox : 5 | public CListBoxEnhanced 6 | { 7 | DECLARE_DYNAMIC(CEditableListBox) 8 | public: 9 | CEditableListBox(); 10 | ~CEditableListBox(); 11 | 12 | void Edit(int row); //编辑指定行 13 | 14 | protected: 15 | CEdit m_item_edit; 16 | int m_edit_row{}; 17 | bool m_editing{}; 18 | 19 | protected: 20 | void EndEdit(); 21 | 22 | DECLARE_MESSAGE_MAP() 23 | virtual void PreSubclassWindow(); 24 | afx_msg void OnEnKillfocusEdit1(); 25 | 26 | public: 27 | afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult); 28 | afx_msg void OnLvnBeginScroll(NMHDR *pNMHDR, LRESULT *pResult); 29 | }; 30 | 31 | -------------------------------------------------------------------------------- /MusicPlayer2/Encoder/bassenc.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Encoder/bassenc.dll -------------------------------------------------------------------------------- /MusicPlayer2/Encoder/bassmix.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Encoder/bassmix.dll -------------------------------------------------------------------------------- /MusicPlayer2/Encoder/flac.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Encoder/flac.exe -------------------------------------------------------------------------------- /MusicPlayer2/Encoder/lame.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Encoder/lame.exe -------------------------------------------------------------------------------- /MusicPlayer2/Encoder/oggenc.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Encoder/oggenc.exe -------------------------------------------------------------------------------- /MusicPlayer2/EqualizerDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "TabDlg.h" 3 | #include "CListBoxEnhanced.h" 4 | 5 | 6 | // CEqualizerDlg 对话框 7 | 8 | class CEqualizerDlg : public CTabDlg 9 | { 10 | DECLARE_DYNAMIC(CEqualizerDlg) 11 | 12 | public: 13 | CEqualizerDlg(CWnd* pParent = NULL); // 标准构造函数 14 | virtual ~CEqualizerDlg(); 15 | 16 | // 对话框数据 17 | #ifdef AFX_DESIGN_TIME 18 | enum { IDD = IDD_EQUALIZER_DIALOG }; 19 | #endif 20 | 21 | protected: 22 | int m_user_defined_gain[EQU_CH_NUM]{}; //用户自定义的均衡器设置 23 | 24 | CSliderCtrl m_sliders[EQU_CH_NUM]; 25 | CListBoxEnhanced m_equ_style_list; 26 | CToolTipCtrl m_Mytip; //鼠标提示 27 | int m_equ_style_selected{}; //选中的均衡器预设 28 | 29 | void EnableControls(bool enable); //启用或禁用控件 30 | void SaveConfig() const; 31 | void LoadConfig(); 32 | void UpdateChannelTip(int channel, int gain); //更新通道滑动条的鼠标提示 33 | 34 | virtual bool InitializeControls() override; 35 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 36 | 37 | DECLARE_MESSAGE_MAP() 38 | protected: 39 | virtual BOOL OnInitDialog(); 40 | afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); 41 | virtual BOOL PreTranslateMessage(MSG* pMsg); 42 | afx_msg void OnBnClickedEnableEquCheck(); 43 | afx_msg LRESULT OnListboxSelChanged(WPARAM wParam, LPARAM lParam); 44 | afx_msg void OnDestroy(); 45 | }; 46 | -------------------------------------------------------------------------------- /MusicPlayer2/FileNameFormDlg.cpp: -------------------------------------------------------------------------------- 1 | // FileNameFormDlg.cpp: 实现文件 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MusicPlayer2.h" 6 | #include "FileNameFormDlg.h" 7 | 8 | 9 | // CFileNameFormDlg 对话框 10 | 11 | IMPLEMENT_DYNAMIC(CFileNameFormDlg, CTagSelBaseDlg) 12 | 13 | CFileNameFormDlg::CFileNameFormDlg(CWnd* pParent) 14 | : CTagSelBaseDlg(false, pParent) 15 | { 16 | } 17 | 18 | CFileNameFormDlg::~CFileNameFormDlg() 19 | { 20 | } 21 | 22 | CString CFileNameFormDlg::GetDialogName() const 23 | { 24 | return L"FileNameFormDlg"; 25 | } 26 | 27 | bool CFileNameFormDlg::InitializeControls() 28 | { 29 | wstring temp; 30 | temp = theApp.m_str_table.LoadText(L"TITLE_FILE_NAME_FORM"); 31 | SetWindowTextW(temp.c_str()); 32 | temp = theApp.m_str_table.LoadText(L"TXT_FILE_NAME_FORM_INFO"); 33 | SetDlgItemTextW(IDC_INFO_STATIC, temp.c_str()); 34 | 35 | return CTagSelBaseDlg::InitializeControls(); 36 | } 37 | 38 | void CFileNameFormDlg::DoDataExchange(CDataExchange* pDX) 39 | { 40 | CTagSelBaseDlg::DoDataExchange(pDX); 41 | } 42 | 43 | BEGIN_MESSAGE_MAP(CFileNameFormDlg, CTagSelBaseDlg) 44 | END_MESSAGE_MAP() 45 | 46 | 47 | BOOL CFileNameFormDlg::OnInitDialog() 48 | { 49 | CTagSelBaseDlg::OnInitDialog(); 50 | 51 | // TODO: 在此添加额外的初始化 52 | SetIcon(IconMgr::IconType::IT_Tag, FALSE); 53 | 54 | return TRUE; // return TRUE unless you set the focus to a control 55 | // 异常: OCX 属性页应返回 FALSE 56 | } 57 | -------------------------------------------------------------------------------- /MusicPlayer2/FileNameFormDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "TagSelBaseDlg.h" 3 | 4 | // CFileNameFormDlg 对话框 5 | 6 | class CFileNameFormDlg : public CTagSelBaseDlg 7 | { 8 | DECLARE_DYNAMIC(CFileNameFormDlg) 9 | public: 10 | CFileNameFormDlg(CWnd* pParent = nullptr); // 标准构造函数 11 | virtual ~CFileNameFormDlg(); 12 | 13 | protected: 14 | virtual CString GetDialogName() const; 15 | virtual bool InitializeControls() override; 16 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 17 | 18 | DECLARE_MESSAGE_MAP() 19 | public: 20 | virtual BOOL OnInitDialog(); 21 | }; 22 | 23 | 24 | -------------------------------------------------------------------------------- /MusicPlayer2/FilePathHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CFilePathHelper 3 | { 4 | public: 5 | CFilePathHelper(const wstring& file_path); 6 | CFilePathHelper(){} 7 | ~CFilePathHelper(); 8 | 9 | void SetFilePath(const wstring& file_path) { m_file_path = file_path; } 10 | 11 | // 获取文件的扩展名(upper:是否大写; width_dot:是否包含“.”) 12 | wstring GetFileExtension(bool upper = false, bool width_dot = false) const; 13 | // 获取文件名 14 | wstring GetFileName() const; 15 | // 获取文件名(不含扩展名) 16 | wstring GetFileNameWithoutExtension() const; 17 | // 获取文件夹名 18 | wstring GetFolderName() const; 19 | // 获取目录 20 | wstring GetDir() const; 21 | // 获取上级目录 22 | wstring GetParentDir() const; 23 | // 获取完整路径 24 | wstring GetFilePath() const { return m_file_path; } 25 | // 替换文件的扩展名,返回文件完整路径 26 | // 注意对不含扩展名的含“.”字符串使用可能会导致误识别 27 | const wstring& ReplaceFileExtension(const wchar_t* new_extension); 28 | // 获取文件路径(不含扩展名) 29 | wstring GetFilePathWithoutExtension() const; 30 | protected: 31 | wstring m_file_path; 32 | }; 33 | 34 | -------------------------------------------------------------------------------- /MusicPlayer2/FileRelateDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "ListCtrlEx.h" 4 | 5 | 6 | // CFileRelateDlg 对话框 7 | 8 | class CFileRelateDlg : public CBaseDialog 9 | { 10 | DECLARE_DYNAMIC(CFileRelateDlg) 11 | 12 | public: 13 | CFileRelateDlg(CWnd* pParent = nullptr); // 标准构造函数 14 | virtual ~CFileRelateDlg(); 15 | 16 | // 对话框数据 17 | #ifdef AFX_DESIGN_TIME 18 | enum { IDD = IDD_FILE_RELATE_DIALOG }; 19 | #endif 20 | 21 | protected: 22 | virtual CString GetDialogName() const override; 23 | virtual bool InitializeControls() override; 24 | 25 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 26 | void RefreshList(); 27 | 28 | DECLARE_MESSAGE_MAP() 29 | public: 30 | CListCtrlEx m_list_ctrl; 31 | virtual BOOL OnInitDialog(); 32 | virtual void OnOK(); 33 | afx_msg void OnBnClickedSelectAllCheck(); 34 | afx_msg void OnBnClickedDefaultButton(); 35 | }; 36 | -------------------------------------------------------------------------------- /MusicPlayer2/FilterHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class FilterHelper 4 | { 5 | public: 6 | static wstring GetAudioFileFilter(); 7 | static wstring GetLyricFileFilter(); 8 | static wstring GetSF2FileFilter(); 9 | static wstring GetListenTimeFilter(); 10 | // 获取打开播放列表对话框的filier 11 | static wstring GetPlaylistSelectFilter(); 12 | // 获取播放列表另存为的filier 13 | static wstring GetPlaylistSaveAsFilter(); 14 | static wstring GetImageFileFilter(); 15 | 16 | private: 17 | static wstring BulidExtFilter(const vector& ext_list); 18 | 19 | }; 20 | 21 | -------------------------------------------------------------------------------- /MusicPlayer2/FindContainerDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "afxdialogex.h" 3 | #include "CTabCtrlEx.h" 4 | #include "FindDlg.h" 5 | #include "FindListDlg.h" 6 | 7 | // CFindContainerDlg 对话框 8 | 9 | class CFindContainerDlg : public CBaseDialog 10 | { 11 | DECLARE_DYNAMIC(CFindContainerDlg) 12 | 13 | public: 14 | CFindContainerDlg(CWnd* pParent = nullptr); // 标准构造函数 15 | virtual ~CFindContainerDlg(); 16 | 17 | void LoadChildrenConfig(); 18 | void SaveChildrenConfig(); 19 | 20 | // 对话框数据 21 | #ifdef AFX_DESIGN_TIME 22 | enum { IDD = IDD_FIND_CONTAINER_DIALOG }; 23 | #endif 24 | 25 | private: 26 | CTabCtrlEx m_tab_ctrl; 27 | CFindDlg m_find_song_dlg; 28 | CFindListDlg* m_find_list_dlg{}; 29 | int m_tab_selected{}; 30 | 31 | protected: 32 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 33 | virtual CString GetDialogName() const override; 34 | virtual bool InitializeControls() override; 35 | 36 | DECLARE_MESSAGE_MAP() 37 | public: 38 | virtual BOOL OnInitDialog(); 39 | virtual void OnOK(); 40 | protected: 41 | afx_msg LRESULT OnPlaySelectedBtnEnable(WPARAM wParam, LPARAM lParam); 42 | public: 43 | afx_msg void OnDestroy(); 44 | }; 45 | -------------------------------------------------------------------------------- /MusicPlayer2/FlacEncodeCfgDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "IPlayerCore.h" 4 | 5 | 6 | // CFlacEncodeCfgDlg 对话框 7 | 8 | class CFlacEncodeCfgDlg : public CBaseDialog 9 | { 10 | DECLARE_DYNAMIC(CFlacEncodeCfgDlg) 11 | 12 | public: 13 | CFlacEncodeCfgDlg(CWnd* pParent = nullptr); // 标准构造函数 14 | virtual ~CFlacEncodeCfgDlg(); 15 | 16 | // 对话框数据 17 | #ifdef AFX_DESIGN_TIME 18 | enum { IDD = IDD_FLAC_ENCODE_CFG_DIALOG }; 19 | #endif 20 | 21 | FlacEncodePara m_encode_para; 22 | 23 | private: 24 | CSliderCtrl m_comp_level_slider; 25 | 26 | protected: 27 | virtual CString GetDialogName() const override; 28 | virtual bool IsRememberDialogSizeEnable() const { return false; }; 29 | virtual bool InitializeControls() override; 30 | 31 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 32 | void SetInfoText(); 33 | void EnableControl(); 34 | 35 | DECLARE_MESSAGE_MAP() 36 | public: 37 | virtual BOOL OnInitDialog(); 38 | afx_msg void OnNMCustomdrawSlider1(NMHDR* pNMHDR, LRESULT* pResult); 39 | afx_msg void OnBnClickedSpecifyParaCheck(); 40 | virtual void OnOK(); 41 | }; 42 | -------------------------------------------------------------------------------- /MusicPlayer2/FolderBrowserDlg.cpp: -------------------------------------------------------------------------------- 1 | #include "stdafx.h" 2 | #include "FolderBrowserDlg.h" 3 | #include "MusicPlayer2.h" 4 | 5 | 6 | CFolderBrowserDlg::CFolderBrowserDlg(HWND hParent) 7 | : m_hParent{ hParent } 8 | { 9 | } 10 | 11 | 12 | CFolderBrowserDlg::~CFolderBrowserDlg() 13 | { 14 | } 15 | 16 | int CFolderBrowserDlg::DoModal() 17 | { 18 | TCHAR szPath[MAX_PATH]; //存放选择的目录路径 19 | CString str; 20 | 21 | BROWSEINFO bi; 22 | bi.hwndOwner = m_hParent; 23 | bi.pidlRoot = NULL; 24 | bi.pszDisplayName = szPath; 25 | bi.lpszTitle = m_info; 26 | bi.ulFlags = 0; 27 | bi.lpfn = NULL; 28 | bi.lParam = 0; 29 | bi.iImage = 0; 30 | //弹出选择目录对话框 31 | browse: 32 | LPITEMIDLIST lp = SHBrowseForFolder(&bi); 33 | 34 | if (lp) 35 | { 36 | if (!SHGetPathFromIDList(lp, szPath)) 37 | { 38 | static const wstring& info = theApp.m_str_table.LoadText(L"MSG_FOLDER_BROWSER_INVALID_DIR_WARNING"); 39 | AfxMessageBox(info.c_str(), MB_ICONWARNING | MB_OK); 40 | goto browse; 41 | } 42 | m_path = szPath; 43 | return IDOK; 44 | } 45 | return IDCANCEL; 46 | } 47 | -------------------------------------------------------------------------------- /MusicPlayer2/FolderBrowserDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CFolderBrowserDlg 3 | { 4 | public: 5 | CFolderBrowserDlg(HWND hParent); 6 | ~CFolderBrowserDlg(); 7 | 8 | CString GetPathName() { return m_path; } 9 | void SetInfo(const CString& info) { m_info = info; } 10 | int DoModal(); 11 | 12 | protected: 13 | HWND m_hParent; 14 | CString m_path; 15 | CString m_info; 16 | }; 17 | 18 | -------------------------------------------------------------------------------- /MusicPlayer2/FolderPropertiesDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SimplePropertiesDlg.h" 3 | #include "ListItem.h" 4 | 5 | // CFolderPropertiesDlg 对话框 6 | 7 | class CFolderPropertiesDlg : public CSimplePropertiesDlg 8 | { 9 | DECLARE_DYNAMIC(CFolderPropertiesDlg) 10 | 11 | public: 12 | CFolderPropertiesDlg(const ListItem& folder_info, CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CFolderPropertiesDlg(); 14 | 15 | private: 16 | ListItem m_folder_info; 17 | 18 | protected: 19 | virtual CString GetDialogName() const override; 20 | 21 | DECLARE_MESSAGE_MAP() 22 | 23 | public: 24 | virtual BOOL OnInitDialog(); 25 | 26 | protected: 27 | virtual void InitData() override; 28 | }; 29 | -------------------------------------------------------------------------------- /MusicPlayer2/FontDialogEx.cpp: -------------------------------------------------------------------------------- 1 | // FontDialogEx.cpp: 实现文件 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MusicPlayer2.h" 6 | #include "FontDialogEx.h" 7 | 8 | // CFontDialogEx 9 | 10 | IMPLEMENT_DYNAMIC(CFontDialogEx, CFontDialog) 11 | 12 | CFontDialogEx::CFontDialogEx(LPLOGFONT lplfInitial, bool show_color, DWORD dwFlags, CDC* pdcPrinter, CWnd* pParentWnd) : 13 | CFontDialog(lplfInitial, dwFlags, pdcPrinter, pParentWnd), 14 | m_show_color(show_color) 15 | { 16 | 17 | } 18 | 19 | CFontDialogEx::~CFontDialogEx() 20 | { 21 | } 22 | 23 | 24 | BEGIN_MESSAGE_MAP(CFontDialogEx, CFontDialog) 25 | END_MESSAGE_MAP() 26 | 27 | 28 | 29 | // CFontDialogEx 消息处理程序 30 | 31 | 32 | 33 | void CFontDialogEx::ShowDlgCtrl(int id, bool show) 34 | { 35 | CWnd* ctrl = GetDlgItem(id); 36 | if (ctrl != nullptr) 37 | ctrl->ShowWindow(show ? SW_SHOW : SW_HIDE); 38 | } 39 | 40 | BOOL CFontDialogEx::OnInitDialog() 41 | { 42 | CFontDialog::OnInitDialog(); 43 | 44 | // TODO: 在此添加额外的初始化 45 | 46 | //隐藏颜色 47 | if (!m_show_color) 48 | { 49 | ShowDlgCtrl(0x473, false); //颜色COMBO 50 | ShowDlgCtrl(0x443, false); //颜色Static 51 | } 52 | 53 | return TRUE; // return TRUE unless you set the focus to a control 54 | // 异常: OCX 属性页应返回 FALSE 55 | } 56 | -------------------------------------------------------------------------------- /MusicPlayer2/FontDialogEx.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | 4 | // CFontDialogEx 5 | 6 | class CFontDialogEx : public CFontDialog 7 | { 8 | DECLARE_DYNAMIC(CFontDialogEx) 9 | 10 | public: 11 | CFontDialogEx(LPLOGFONT lplfInitial = nullptr, 12 | bool show_color = true, //是否显示颜色 13 | DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, 14 | CDC* pdcPrinter = nullptr, 15 | CWnd* pParentWnd = nullptr); 16 | 17 | virtual ~CFontDialogEx(); 18 | 19 | private: 20 | bool m_show_color; 21 | 22 | protected: 23 | DECLARE_MESSAGE_MAP() 24 | 25 | void ShowDlgCtrl(int id, bool show); 26 | 27 | public: 28 | virtual BOOL OnInitDialog(); 29 | }; 30 | 31 | 32 | -------------------------------------------------------------------------------- /MusicPlayer2/GaussBlur.h: -------------------------------------------------------------------------------- 1 | //实现高斯模糊的类,算法来自:http://www.cnblogs.com/hoodlum1980/p/4528486.html 2 | #pragma once 3 | 4 | class CGaussBlurThreadParams 5 | { 6 | public: 7 | int r; 8 | double* pTempl; 9 | LPBYTE pSrc; //Src 位图的位图数据起点 (对所有线程,pSrc,pDest 是相同的) 10 | LPBYTE pDest; //Dest 位图的位图数据起点 11 | 12 | int width; //图像宽度 13 | int height; //图像高度(已经被取绝对值) 14 | 15 | //处理的行范围:[rowBegin, rowEnd) ,不包括 rowEnd (每个线程不同) 16 | int rowBegin; 17 | int rowEnd; 18 | int stride; //扫描行宽度(bytes) 19 | int pixelSize; //像素大小 =bpp/8; 20 | 21 | bool bHorz; //true-水平模糊,false-纵向模糊 22 | }; 23 | 24 | 25 | class CGaussBlur 26 | { 27 | public: 28 | CGaussBlur(); 29 | ~CGaussBlur(); 30 | 31 | void SetSigma(double sigma); //设置高斯模糊半径 32 | void Reset(); 33 | void DoGaussBlur(const CImage& image_src, CImage& image_dest); //对image_src执行高斯模糊,结果保存在image_dest里 34 | 35 | protected: 36 | int m_r; //完整模板正方形的边长为 (2 * r + 1) 37 | double m_sigma; //高斯半径(方差的平方根) 38 | double* m_pTempl; //模板T[r+1]; 39 | 40 | bool Filter(LPCVOID pSrc, LPVOID pDest, int width, int height, int bpp); 41 | 42 | DWORD WINAPI GaussBlurThreadProc8(LPVOID lpParameters); 43 | DWORD WINAPI GaussBlurThreadProc24(LPVOID lpParameters); 44 | }; 45 | 46 | -------------------------------------------------------------------------------- /MusicPlayer2/GdiPlusTool.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include "CommonData.h" 4 | 5 | class CGdiPlusTool 6 | { 7 | public: 8 | CGdiPlusTool(); 9 | ~CGdiPlusTool(); 10 | 11 | static Gdiplus::Color COLORREFToGdiplusColor(COLORREF color, BYTE alpha = 255); 12 | static COLORREF GdiplusColorToCOLORREF(Gdiplus::Color color); 13 | static int ToGDIPluseFontStyle(const FontStyle& style); 14 | static void CreateRoundRectPath(Gdiplus::GraphicsPath& path, CRect rect, int radius); 15 | static CRect GdiplusRectToCRect(Gdiplus::Rect rect); 16 | static Gdiplus::Rect CRectToGdiplusRect(CRect rect); 17 | }; 18 | 19 | -------------------------------------------------------------------------------- /MusicPlayer2/GetTagOnlineDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "CoverDownloadDlg.h" 3 | #include "InternetCommon.h" 4 | class CGetTagOnlineDlg : public CCoverDownloadDlg 5 | { 6 | public: 7 | CGetTagOnlineDlg(const SongInfo& song, CWnd* pParent = nullptr); 8 | virtual ~CGetTagOnlineDlg(); 9 | const CInternetCommon::ItemInfo& GetSelectedItem() const { return m_item_info; } 10 | 11 | private: 12 | CInternetCommon::ItemInfo m_item_info; 13 | const SongInfo& m_song_info; 14 | 15 | private: 16 | virtual CString GetDialogName() const override; 17 | virtual void OnBnClickedDownloadSelected() override; 18 | virtual SongInfo GetSongInfo() const override; 19 | 20 | public: 21 | virtual BOOL OnInitDialog(); 22 | }; 23 | 24 | -------------------------------------------------------------------------------- /MusicPlayer2/IPlayerUI.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "stdafx.h" 3 | 4 | class IPlayerUI 5 | { 6 | public: 7 | struct UIButton //界面中绘制的按钮 8 | { 9 | CRect rect; //按钮的矩形区域 10 | bool hover{ false }; //鼠标是否指向按钮 11 | bool pressed{ false }; //按钮是否按下 12 | bool enable{ true }; //按钮是否启用 13 | }; 14 | 15 | public: 16 | IPlayerUI(){} 17 | virtual ~IPlayerUI(){} 18 | 19 | virtual void Init(CDC* pDC) = 0; 20 | virtual void DrawInfo(bool reset = false) = 0; 21 | virtual void ClearInfo() = 0; 22 | 23 | virtual bool LButtonDown(CPoint point) = 0; 24 | virtual void RButtonUp(CPoint point) = 0; 25 | virtual void MouseMove(CPoint point) = 0; 26 | virtual bool LButtonUp(CPoint point) = 0; 27 | virtual void RButtonDown(CPoint point) = 0; 28 | virtual bool MouseWheel(int delta, CPoint point) = 0; 29 | virtual bool DoubleClick(CPoint point) = 0; 30 | 31 | virtual CRect GetThumbnailClipArea() = 0; 32 | 33 | virtual void UpdateMouseToolTip(int btn, LPCTSTR str) = 0; 34 | virtual void UpdateToolTipPosition() = 0; 35 | virtual void UpdatePlayPauseButtonTip() = 0; 36 | virtual void UpdateFullScreenTip() = 0; 37 | 38 | virtual bool SetCursor() = 0; 39 | virtual void MouseLeave() = 0; 40 | 41 | virtual CToolTipCtrl& GetToolTipCtrl() = 0; 42 | }; -------------------------------------------------------------------------------- /MusicPlayer2/IPropertyTabDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "TabDlg.h" 3 | 4 | class IPropertyTabDlg 5 | { 6 | public: 7 | IPropertyTabDlg() {} 8 | virtual ~IPropertyTabDlg() {} 9 | 10 | virtual int SaveModified() = 0; 11 | virtual void PagePrevious() = 0; 12 | virtual void PageNext() = 0; 13 | }; 14 | -------------------------------------------------------------------------------- /MusicPlayer2/InputDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | 4 | // CInputDlg 对话框 5 | 6 | class CInputDlg : public CBaseDialog 7 | { 8 | DECLARE_DYNAMIC(CInputDlg) 9 | 10 | public: 11 | CInputDlg(CWnd* pParent = nullptr); // 标准构造函数 12 | virtual ~CInputDlg(); 13 | 14 | // 对话框数据 15 | #ifdef AFX_DESIGN_TIME 16 | enum { IDD = IDD_INPUT_DLG }; 17 | #endif 18 | 19 | void SetTitle(LPCTSTR strTitle); 20 | void SetInfoText(LPCTSTR strInfo); 21 | void SetEditText(LPCTSTR strEdit); 22 | CString GetEditText() const; 23 | 24 | protected: 25 | virtual CString GetDialogName() const override; 26 | virtual bool InitializeControls() override; 27 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 28 | 29 | private: 30 | CString m_strTitle; 31 | CString m_strInfo; 32 | CString m_strEdit; 33 | 34 | DECLARE_MESSAGE_MAP() 35 | public: 36 | virtual BOOL OnInitDialog(); 37 | virtual void OnOK(); 38 | }; 39 | -------------------------------------------------------------------------------- /MusicPlayer2/LastFM.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/LastFM.cpp -------------------------------------------------------------------------------- /MusicPlayer2/LastFM.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/LastFM.h -------------------------------------------------------------------------------- /MusicPlayer2/LastFMDataArchive.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/LastFMDataArchive.cpp -------------------------------------------------------------------------------- /MusicPlayer2/LyricDownloadCommon.h: -------------------------------------------------------------------------------- 1 | //此类用于定义通过网络下载歌词相关的全局函数 2 | //歌词的下载调用了网易云音乐的API 3 | #pragma once 4 | #include "InternetCommon.h" 5 | 6 | class CLyricDownloadCommon 7 | { 8 | 9 | public: 10 | CLyricDownloadCommon(); 11 | ~CLyricDownloadCommon(); 12 | 13 | 14 | //根据网易云音乐中歌曲的id下载歌词,结果保存中result中,download_translate参数指定是否下载带翻译的歌词 15 | static bool DownloadLyric(const wstring& song_id, wstring& result, bool download_translate = true); 16 | 17 | static bool DisposeLryic(wstring& lyric_str); //对从网易云音乐下载的歌词进行处理,转换成正确的歌词文本 18 | static void AddLyricTag(wstring& lyric_str, const wstring& song_id, const wstring& title = _T(""), const wstring& artist = _T(""), const wstring& album = _T("")); //在歌词前面加上标签信息 19 | }; 20 | 21 | -------------------------------------------------------------------------------- /MusicPlayer2/MediaLibHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SongInfo.h" 3 | 4 | #define STR_OTHER_CLASSIFY_TYPE L"eRk0Q6ov" 5 | 6 | //不区分大小写的字符串比较器 7 | struct StringComparerNoCase 8 | { 9 | bool operator()(const std::wstring& a, const std::wstring& b) const; 10 | }; 11 | 12 | class CMediaClassifier 13 | { 14 | public: 15 | enum ClassificationType 16 | { 17 | CT_ARTIST, 18 | CT_ALBUM, 19 | CT_GENRE, 20 | CT_YEAR, 21 | CT_TYPE, 22 | CT_BITRATE, 23 | CT_RATING, 24 | CT_NONE, 25 | CT_MAX 26 | }; 27 | 28 | typedef std::map, StringComparerNoCase> MediaList; //定义保存分类结果的map容器,使用不区分大小写的比较器,以实现分类时不区分大小写 29 | 30 | public: 31 | CMediaClassifier(ClassificationType type, bool hide_only_one_classification = false); 32 | ~CMediaClassifier(); 33 | 34 | const MediaList& GetMeidaList() const; 35 | MediaList& GetMeidaList(); 36 | void ClassifyMedia(); 37 | static bool IsStringYear(std::wstring str); 38 | void ClearResult(); 39 | void RemoveFiles(std::vector songs); //从结果中删除指定文件 40 | void SetHideOnlyOneClassification(bool hide_only_one_classification); 41 | 42 | private: 43 | 44 | private: 45 | MediaList m_media_list; 46 | ClassificationType m_type; 47 | bool m_hide_only_one_classification; //如果为true,则把只有一项的类别归到“其他”里面 48 | }; 49 | -------------------------------------------------------------------------------- /MusicPlayer2/MediaLibItemPropertiesDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SimplePropertiesDlg.h" 3 | #include "ListItem.h" 4 | 5 | // CMediaLibItemPropertiesDlg 对话框 6 | 7 | class CMediaLibItemPropertiesDlg : public CSimplePropertiesDlg 8 | { 9 | DECLARE_DYNAMIC(CMediaLibItemPropertiesDlg) 10 | 11 | public: 12 | CMediaLibItemPropertiesDlg(const ListItem& item_info, CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CMediaLibItemPropertiesDlg(); 14 | 15 | private: 16 | ListItem m_item_info; 17 | 18 | protected: 19 | virtual CString GetDialogName() const override; 20 | 21 | DECLARE_MESSAGE_MAP() 22 | 23 | public: 24 | virtual BOOL OnInitDialog(); 25 | 26 | protected: 27 | virtual void InitData() override; 28 | }; 29 | -------------------------------------------------------------------------------- /MusicPlayer2/MediaLibStatisticsDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SimplePropertiesDlg.h" 3 | #include "ListCtrlEx.h" 4 | 5 | 6 | // CMediaLibStatisticsDlg 对话框 7 | 8 | class CMediaLibStatisticsDlg : public CSimplePropertiesDlg 9 | { 10 | DECLARE_DYNAMIC(CMediaLibStatisticsDlg) 11 | 12 | public: 13 | CMediaLibStatisticsDlg(CWnd* pParent = nullptr); // 标准构造函数 14 | virtual ~CMediaLibStatisticsDlg(); 15 | 16 | protected: 17 | virtual CString GetDialogName() const override; 18 | 19 | DECLARE_MESSAGE_MAP() 20 | 21 | public: 22 | virtual BOOL OnInitDialog(); 23 | 24 | protected: 25 | virtual void InitData() override; 26 | }; 27 | -------------------------------------------------------------------------------- /MusicPlayer2/MediaTransControls.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SongInfo.h" 3 | 4 | enum class PlaybackStatus 5 | { 6 | Closed = 0, 7 | Changing = 1, 8 | Stopped = 2, 9 | Playing = 3, 10 | Paused = 4, 11 | }; 12 | 13 | class MediaTransControlsImpl; 14 | 15 | class MediaTransControls { 16 | public: 17 | MediaTransControls(); 18 | ~MediaTransControls(); 19 | bool InitSMTC(bool enable); 20 | void loadThumbnail(const wstring& fn); 21 | void loadThumbnail(const BYTE* content, size_t size); 22 | bool IsActive(); 23 | void ClearAll(); 24 | void UpdateControls(PlaybackStatus status); 25 | void UpdateControlsMetadata(const SongInfo& song); 26 | /// Update current time, in milliseconds 27 | void UpdatePosition(int64_t postion, bool force = false); 28 | /// Update current speed 29 | void UpdateSpeed(float speed); 30 | 31 | #ifndef DISABLE_MEDIA_TRANS_CONTROLS 32 | private: 33 | std::mutex m_mutex; // 使用pImpl指针期间锁定此互斥量 34 | std::unique_ptr pImpl; 35 | #endif 36 | }; 37 | -------------------------------------------------------------------------------- /MusicPlayer2/MenuEditCtrl.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ColorConvert.h" 3 | 4 | 5 | // CMenuEditCtrl 6 | 7 | class CMenuEditCtrl : public CMFCEditBrowseCtrl 8 | { 9 | DECLARE_DYNAMIC(CMenuEditCtrl) 10 | 11 | public: 12 | CMenuEditCtrl(); 13 | virtual ~CMenuEditCtrl(); 14 | void SetTooltopText(const CString& tooltip_text); //设置按钮上鼠标提示的文本 15 | 16 | virtual void OnBrowse() override; 17 | virtual void OnDrawBrowseButton(CDC* pDC, CRect rect, BOOL bIsButtonPressed, BOOL bIsButtonHot) override; 18 | virtual void OnChangeLayout()override; 19 | 20 | protected: 21 | void UpdateToolTipPosition(); //更新鼠标提示的位置 22 | 23 | DECLARE_MESSAGE_MAP() 24 | 25 | private: 26 | ColorTable& m_theme_color; 27 | CToolTipCtrl m_tool_tip; 28 | CString m_tooltip_text; //按钮上鼠标提示的文本 29 | CRect m_btn_rect; //按钮的矩形区域 30 | 31 | public: 32 | afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point); 33 | protected: 34 | afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 35 | virtual void PreSubclassWindow(); 36 | public: 37 | virtual BOOL PreTranslateMessage(MSG* pMsg); 38 | }; 39 | -------------------------------------------------------------------------------- /MusicPlayer2/MiniModeUserUi.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "UserUi.h" 3 | 4 | class CMiniModeUserUi : public CUserUi 5 | { 6 | public: 7 | CMiniModeUserUi(CWnd* pMainWnd, const std::wstring& xml_path); 8 | CMiniModeUserUi(CWnd* pMainWnd, UINT id); // id为xml资源ID 9 | ~CMiniModeUserUi(); 10 | 11 | bool GetUiSize(int& width, int& height, int& height_with_playlist); 12 | std::shared_ptr GetPlaylist() const; 13 | 14 | private: 15 | void InitUiPlaylist(); 16 | 17 | private: 18 | virtual void _DrawInfo(CRect draw_rect, bool reset = false) override; 19 | virtual void PreDrawInfo() override; 20 | virtual bool LButtonUp(CPoint point) override; 21 | virtual bool IsDrawLargeIcon() const override { return false; } 22 | virtual bool IsDrawStatusBar() const override { return false; } 23 | virtual bool IsDrawTitleBar() const override { return false; } 24 | virtual bool IsDrawMenuBar() const override { return false; } 25 | virtual bool PointInControlArea(CPoint point) const override; 26 | virtual const std::vector>& GetStackElements() const; 27 | 28 | bool IsShowUiPlaylist() const; 29 | 30 | private: 31 | std::shared_ptr m_ui_element; //迷你模式中的“ui”节点 32 | std::shared_ptr m_playlist_emelment; //ui中的播放列表 33 | }; 34 | 35 | -------------------------------------------------------------------------------- /MusicPlayer2/MusicPlayer2.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/MusicPlayer2.rc -------------------------------------------------------------------------------- /MusicPlayer2/MyComboBox.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CMyComboBox : public CComboBox 3 | { 4 | DECLARE_DYNAMIC(CMyComboBox) 5 | 6 | public: 7 | CMyComboBox(); 8 | virtual ~CMyComboBox(); 9 | 10 | void SetReadOnly(bool read_only = true); 11 | void SetEditReadOnly(bool read_only = true); 12 | CEdit* GetEditCtrl(); 13 | CString GetText(); 14 | void ResetModified(); 15 | void SetModify(); 16 | void SetMouseWheelEnable(bool enable); //设置是否允许响应鼠标滚轮 17 | 18 | protected: 19 | bool m_read_only{ false }; 20 | CRect m_arrow_rect; //下拉箭头的矩形区域 21 | bool m_modified{}; 22 | bool m_mouse_wheel_enable{ true }; 23 | 24 | public: 25 | DECLARE_MESSAGE_MAP() 26 | virtual BOOL PreTranslateMessage(MSG* pMsg); 27 | afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor); 28 | afx_msg BOOL OnCbnSelchange(); 29 | protected: 30 | afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 31 | }; 32 | 33 | -------------------------------------------------------------------------------- /MusicPlayer2/OggEncodeCfgDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "IPlayerCore.h" 4 | 5 | // COggEncodeCfgDlg 对话框 6 | 7 | class COggEncodeCfgDlg : public CBaseDialog 8 | { 9 | DECLARE_DYNAMIC(COggEncodeCfgDlg) 10 | 11 | public: 12 | COggEncodeCfgDlg(CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~COggEncodeCfgDlg(); 14 | 15 | // 对话框数据 16 | #ifdef AFX_DESIGN_TIME 17 | enum { IDD = IDD_OGG_ENCODE_CFG_DIALOG }; 18 | #endif 19 | 20 | OggEncodePara m_encode_para; 21 | 22 | protected: 23 | //控件变量 24 | CSliderCtrl m_quality_sld; 25 | 26 | void SetInfoText(); 27 | 28 | virtual CString GetDialogName() const; 29 | virtual bool IsRememberDialogSizeEnable() const { return false; }; 30 | virtual bool InitializeControls(); 31 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 32 | 33 | DECLARE_MESSAGE_MAP() 34 | public: 35 | virtual BOOL OnInitDialog(); 36 | afx_msg void OnNMCustomdrawQualitySlider(NMHDR *pNMHDR, LRESULT *pResult); 37 | }; 38 | -------------------------------------------------------------------------------- /MusicPlayer2/PlayerProgressBar.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ColorConvert.h" 3 | 4 | // CPlayerProgressBar 5 | 6 | class CPlayerProgressBar : public CStatic 7 | { 8 | DECLARE_DYNAMIC(CPlayerProgressBar) 9 | 10 | public: 11 | CPlayerProgressBar(); 12 | virtual ~CPlayerProgressBar(); 13 | 14 | void SetProgress(int progress); 15 | void SetBackgroundColor(COLORREF back_color); 16 | void SetBarCount(int bar_cnt); 17 | 18 | protected: 19 | int m_progress; //当前进度(百分比) 20 | const ColorTable& m_theme_color; 21 | COLORREF m_back_color{ RGB(255, 255, 255) }; 22 | int m_bar_count{ 10 }; 23 | 24 | protected: 25 | DECLARE_MESSAGE_MAP() 26 | afx_msg void OnPaint(); 27 | }; 28 | 29 | 30 | -------------------------------------------------------------------------------- /MusicPlayer2/Playlist.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SongInfo.h" 3 | class CPlaylistFile 4 | { 5 | public: 6 | enum Type //播放列表格式 7 | { 8 | PL_PLAYLIST, //MusicPlayer2播放列表 9 | PL_M3U, //m3u播放列表 10 | PL_M3U8 //m3u8播放列表 11 | }; 12 | 13 | CPlaylistFile(); 14 | ~CPlaylistFile(); 15 | void LoadFromFile(const wstring& file_path); 16 | void SaveToFile(const wstring& file_path, Type type = PL_PLAYLIST) const; 17 | const vector& GetPlaylist() const; 18 | int AddSongsToPlaylist(const vector& songs, bool insert_begin = false); 19 | // 使用移动语义覆盖参数song_list,调用后此CPlaylistFile对象不再可用 20 | void MoveToSongList(vector& song_list); 21 | bool IsSongInPlaylist(const SongInfo& song); 22 | int GetSongIndexInPlaylist(const SongInfo& song); 23 | void RemoveSong(const SongInfo& song); 24 | 25 | static bool IsPlaylistFile(const wstring& file_path); 26 | static bool IsPlaylistExt(wstring ext); 27 | 28 | static void SavePlaylistToFile(const vector& song_list, const wstring& file_path, Type type = PL_PLAYLIST); 29 | public: 30 | const static vector m_surpported_playlist; //支持的播放列表文件的扩展名列表 31 | 32 | private: 33 | void DisposePlaylistFileLine(const string& str_current_line, bool utf8); 34 | 35 | private: 36 | vector m_playlist; 37 | wstring m_path; 38 | }; 39 | 40 | -------------------------------------------------------------------------------- /MusicPlayer2/PlaylistMgr.cpp: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /MusicPlayer2/PlaylistPropertiesDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SimplePropertiesDlg.h" 3 | #include "ListItem.h" 4 | 5 | // CPlaylistPropertiesDlg 对话框 6 | 7 | class CPlaylistPropertiesDlg : public CSimplePropertiesDlg 8 | { 9 | DECLARE_DYNAMIC(CPlaylistPropertiesDlg) 10 | 11 | public: 12 | CPlaylistPropertiesDlg(const ListItem& playlist_info, CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CPlaylistPropertiesDlg(); 14 | 15 | private: 16 | ListItem m_playlist_info; 17 | 18 | protected: 19 | virtual CString GetDialogName() const override; 20 | 21 | DECLARE_MESSAGE_MAP() 22 | 23 | public: 24 | virtual BOOL OnInitDialog(); 25 | 26 | protected: 27 | virtual void InitData() override; 28 | }; 29 | -------------------------------------------------------------------------------- /MusicPlayer2/Plugins/bass_aac.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Plugins/bass_aac.dll -------------------------------------------------------------------------------- /MusicPlayer2/Plugins/bass_ape.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Plugins/bass_ape.dll -------------------------------------------------------------------------------- /MusicPlayer2/Plugins/basscd.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Plugins/basscd.dll -------------------------------------------------------------------------------- /MusicPlayer2/Plugins/bassflac.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Plugins/bassflac.dll -------------------------------------------------------------------------------- /MusicPlayer2/Plugins/bassmidi.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Plugins/bassmidi.dll -------------------------------------------------------------------------------- /MusicPlayer2/Plugins/basswma.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/Plugins/basswma.dll -------------------------------------------------------------------------------- /MusicPlayer2/RecentFolderAndPlaylist.cpp: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /MusicPlayer2/RecentFolderMgr.cpp: -------------------------------------------------------------------------------- 1 |  -------------------------------------------------------------------------------- /MusicPlayer2/RegFileRelate.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CRegFileRelate 3 | { 4 | public: 5 | CRegFileRelate(); 6 | ~CRegFileRelate(); 7 | 8 | void SetModelPath(LPCTSTR model_path); 9 | void SetAppName(LPCTSTR app_name); 10 | 11 | //添加一个文件类型的关联 12 | //file_ext: 要关联的文件扩展名 13 | bool AddFileTypeRelate(LPCTSTR file_ext, LPCTSTR ico_path = nullptr, bool default_icon = false, LPCTSTR description = NULL); 14 | bool AddFileTypeRelate(LPCTSTR file_ext, int ico_index, bool default_icon = false, LPCTSTR description = NULL); 15 | //判断一个文件类型是否已关联 16 | bool IsFileTypeRelated(LPCTSTR file_ext); 17 | //删除一个文件类型的关联 18 | bool DeleteFileTypeRelate(LPCTSTR file_ext); 19 | 20 | //获取所有已关联的类型扩展名 21 | bool GetAllRelatedExtensions(std::vector& extensions); 22 | 23 | private: 24 | bool OpenItem(CRegKey& key, LPCTSTR item_str); 25 | 26 | private: 27 | CString m_model_path; 28 | CString m_app_name = APP_NAME; 29 | }; 30 | 31 | -------------------------------------------------------------------------------- /MusicPlayer2/RenameDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "TagSelBaseDlg.h" 3 | 4 | // CRenameDlg 对话框 5 | 6 | class CRenameDlg : public CTagSelBaseDlg 7 | { 8 | DECLARE_DYNAMIC(CRenameDlg) 9 | public: 10 | CRenameDlg(int file_num, CWnd* pParent = nullptr); // 标准构造函数 11 | virtual ~CRenameDlg(); 12 | 13 | protected: 14 | virtual CString GetDialogName() const; 15 | virtual bool InitializeControls() override; 16 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 17 | 18 | private: 19 | int m_file_num; //要重命名的文件数,用于显示在标题栏中 20 | 21 | DECLARE_MESSAGE_MAP() 22 | public: 23 | virtual BOOL OnInitDialog(); 24 | }; 25 | 26 | -------------------------------------------------------------------------------- /MusicPlayer2/ReverbDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "TabDlg.h" 3 | 4 | // CReverbDlg 对话框 5 | 6 | class CReverbDlg : public CTabDlg 7 | { 8 | DECLARE_DYNAMIC(CReverbDlg) 9 | 10 | public: 11 | CReverbDlg(CWnd* pParent = NULL); // 标准构造函数 12 | virtual ~CReverbDlg(); 13 | 14 | // 对话框数据 15 | #ifdef AFX_DESIGN_TIME 16 | enum { IDD = IDD_REVERB_DIALOG }; 17 | #endif 18 | 19 | protected: 20 | CSliderCtrl m_reverb_mix_slider; 21 | CSliderCtrl m_reverb_time_slider; 22 | 23 | void EnableControls(bool enable); //启用或禁用控件 24 | void UpdateStaticText(int mix, int time); //更新静态控件上的文本 25 | 26 | virtual bool InitializeControls() override; 27 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 28 | 29 | DECLARE_MESSAGE_MAP() 30 | public: 31 | virtual BOOL OnInitDialog(); 32 | afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar); 33 | afx_msg void OnBnClickedEnableReverbCheck(); 34 | afx_msg void OnDestroy(); 35 | }; 36 | -------------------------------------------------------------------------------- /MusicPlayer2/SearchEditCtrl.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "ColorConvert.h" 3 | 4 | 5 | // CSearchEditCtrl 6 | #define WM_SEARCH_EDIT_BTN_CLICKED (WM_USER+125) 7 | 8 | class CSearchEditCtrl : public CMFCEditBrowseCtrl 9 | { 10 | DECLARE_DYNAMIC(CSearchEditCtrl) 11 | 12 | public: 13 | CSearchEditCtrl(); 14 | virtual ~CSearchEditCtrl(); 15 | 16 | virtual void OnBrowse() override; 17 | virtual void OnDrawBrowseButton(CDC* pDC, CRect rect, BOOL bIsButtonPressed, BOOL bIsButtonHot) override; 18 | virtual void OnChangeLayout()override; 19 | void SetBigIcon(bool big_icon); 20 | 21 | protected: 22 | void UpdateToolTipPosition(); //更新鼠标提示的位置 23 | 24 | DECLARE_MESSAGE_MAP() 25 | 26 | private: 27 | ColorTable& m_theme_color; 28 | CToolTipCtrl m_tool_tip; 29 | bool m_draw_clear_btn{}; //如果为true,则显示“清除搜索结果”按钮,否则,显示“搜索”按钮 30 | bool m_big_icon{}; 31 | 32 | private: 33 | virtual void PreSubclassWindow(); 34 | public: 35 | virtual BOOL PreTranslateMessage(MSG* pMsg); 36 | afx_msg void OnSize(UINT nType, int cx, int cy); 37 | afx_msg BOOL OnEnChange(); 38 | afx_msg void OnNcLButtonDown(UINT nHitTest, CPoint point); 39 | protected: 40 | afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 41 | }; 42 | 43 | 44 | -------------------------------------------------------------------------------- /MusicPlayer2/SelectItemDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "CListBoxEnhanced.h" 4 | 5 | // CSelectItemDlg 对话框 6 | 7 | class CSelectItemDlg : public CBaseDialog 8 | { 9 | DECLARE_DYNAMIC(CSelectItemDlg) 10 | 11 | public: 12 | CSelectItemDlg(const vector& items, CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CSelectItemDlg(); 14 | 15 | // 对话框数据 16 | #ifdef AFX_DESIGN_TIME 17 | enum { IDD = IDD_SELECT_ITEM_DIALOG }; 18 | #endif 19 | 20 | public: 21 | void SetTitle(LPCTSTR title); 22 | void SetDlgIcon(IconMgr::IconType icon_type); 23 | wstring GetSelectedItem() const; 24 | 25 | private: 26 | CListBoxEnhanced m_list_ctrl; 27 | CString m_title; 28 | const vector& m_items; 29 | int m_item_selected{ -1 }; 30 | IconMgr::IconType m_icon_type{ IconMgr::IconType::IT_NO_ICON }; 31 | 32 | protected: 33 | virtual CString GetDialogName() const override; 34 | virtual bool InitializeControls() override; 35 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 36 | 37 | DECLARE_MESSAGE_MAP() 38 | public: 39 | virtual BOOL OnInitDialog(); 40 | afx_msg void OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult); 41 | }; 42 | -------------------------------------------------------------------------------- /MusicPlayer2/SimplePropertiesDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "ListCtrlEx.h" 4 | 5 | 6 | // CSimplePropertiesDlg 对话框 7 | 8 | class CSimplePropertiesDlg : public CBaseDialog 9 | { 10 | DECLARE_DYNAMIC(CSimplePropertiesDlg) 11 | 12 | public: 13 | CSimplePropertiesDlg(CWnd* pParent = nullptr); // 标准构造函数 14 | virtual ~CSimplePropertiesDlg(); 15 | 16 | // 对话框数据 17 | #ifdef AFX_DESIGN_TIME 18 | enum { IDD = IDD_SELECT_ITEM_DIALOG }; 19 | #endif 20 | 21 | protected: 22 | //对话框中每一行的内容 23 | struct Item 24 | { 25 | std::wstring label; //标签的文本 26 | std::wstring value; //值的文本 27 | 28 | Item() {} 29 | Item(const std::wstring& _label, const std::wstring& _value) 30 | : label(_label), value(_value) 31 | {} 32 | }; 33 | 34 | std::vector m_items; 35 | 36 | //派生类中需要实现此函数,并向m_items中添加数据 37 | virtual void InitData() = 0; 38 | 39 | private: 40 | CListCtrlEx m_list_ctrl; 41 | 42 | virtual bool InitializeControls() override; 43 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 44 | 45 | DECLARE_MESSAGE_MAP() 46 | public: 47 | virtual BOOL OnInitDialog(); 48 | }; 49 | -------------------------------------------------------------------------------- /MusicPlayer2/SimpleXML.h: -------------------------------------------------------------------------------- 1 | //一个简易的XML解析的类 2 | #pragma once 3 | #include "Common.h" 4 | 5 | class CSimpleXML 6 | { 7 | public: 8 | CSimpleXML(const wstring& xml_path); 9 | CSimpleXML(); 10 | ~CSimpleXML(); 11 | 12 | void LoadXMLContentDirect(const wstring& xml_content) { m_xml_content = xml_content; } 13 | 14 | wstring GetNode(const wchar_t* node, const wchar_t* parent) const; 15 | wstring GetNode(const wchar_t* node) const; 16 | 17 | static wstring _GetNode(const wchar_t* node, const wstring& content); 18 | 19 | protected: 20 | wstring m_xml_content; 21 | 22 | }; 23 | 24 | -------------------------------------------------------------------------------- /MusicPlayer2/SliderCtrlEx.cpp: -------------------------------------------------------------------------------- 1 | // SliderCtrlEx.cpp: 实现文件 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "SliderCtrlEx.h" 6 | 7 | 8 | // CSliderCtrlEx 9 | 10 | IMPLEMENT_DYNAMIC(CSliderCtrlEx, CSliderCtrl) 11 | 12 | CSliderCtrlEx::CSliderCtrlEx() 13 | { 14 | 15 | } 16 | 17 | CSliderCtrlEx::~CSliderCtrlEx() 18 | { 19 | } 20 | 21 | 22 | void CSliderCtrlEx::SetMouseWheelEnable(bool enable) 23 | { 24 | m_mouse_wheel_enable = enable; 25 | } 26 | 27 | BEGIN_MESSAGE_MAP(CSliderCtrlEx, CSliderCtrl) 28 | END_MESSAGE_MAP() 29 | 30 | 31 | 32 | // CSliderCtrlEx 消息处理程序 33 | 34 | 35 | 36 | 37 | BOOL CSliderCtrlEx::PreTranslateMessage(MSG* pMsg) 38 | { 39 | // TODO: 在此添加专用代码和/或调用基类 40 | 41 | //如果m_mouse_wheel_enable为false,则不响应鼠标滚轮消息 42 | if (pMsg->message == WM_MOUSEWHEEL && !m_mouse_wheel_enable) 43 | { 44 | //将鼠标滚轮消息发送给父窗口 45 | CWnd* pParent = GetParent(); 46 | pParent->SendMessage(WM_MOUSEWHEEL, pMsg->wParam, pMsg->lParam); 47 | return true; 48 | } 49 | 50 | return CSliderCtrl::PreTranslateMessage(pMsg); 51 | } 52 | -------------------------------------------------------------------------------- /MusicPlayer2/SliderCtrlEx.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | 4 | // CSliderCtrlEx 5 | 6 | class CSliderCtrlEx : public CSliderCtrl 7 | { 8 | DECLARE_DYNAMIC(CSliderCtrlEx) 9 | 10 | public: 11 | CSliderCtrlEx(); 12 | virtual ~CSliderCtrlEx(); 13 | void SetMouseWheelEnable(bool enable); //设置是否允许响应鼠标滚轮 14 | 15 | protected: 16 | bool m_mouse_wheel_enable{ true }; 17 | 18 | protected: 19 | DECLARE_MESSAGE_MAP() 20 | public: 21 | virtual BOOL PreTranslateMessage(MSG* pMsg); 22 | }; 23 | 24 | 25 | -------------------------------------------------------------------------------- /MusicPlayer2/SongInfoHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "SongInfo.h" 3 | #include "CommonData.h" 4 | class CSongInfoHelper 5 | { 6 | public: 7 | static CString GetBitrateString(const SongInfo& song); 8 | static wstring GetChannelsString(BYTE channels); 9 | static CString GetFreqString(const SongInfo& song); 10 | static CString GetBitsString(const SongInfo& song); 11 | 12 | struct ChannelInfo 13 | { 14 | int bitrate{}; 15 | int freq{}; 16 | int bits{}; 17 | int channels{}; 18 | }; 19 | static void SetSongChannelInfo(SongInfo& song, const ChannelInfo& channel_info); 20 | static ChannelInfo GetSongChannelInfo(const SongInfo& song); 21 | static std::wstring GetDisplayStr(const SongInfo& song_info, DisplayFormat display_format); //根据display_format指定的显示格式,返回一首曲目显示的字符串 22 | static std::wstring GetPlaylistItemToolTip(const SongInfo& song_info, bool show_title, bool show_full_path); 23 | 24 | }; 25 | -------------------------------------------------------------------------------- /MusicPlayer2/SoundEffectDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "EqualizerDlg.h" 4 | #include "ReverbDlg.h" 5 | #include "CTabCtrlEx.h" 6 | 7 | // CSoundEffectDlg 对话框 8 | 9 | class CSoundEffectDlg : public CBaseDialog 10 | { 11 | DECLARE_DYNAMIC(CSoundEffectDlg) 12 | 13 | public: 14 | CSoundEffectDlg(CWnd* pParent = NULL); // 标准构造函数 15 | virtual ~CSoundEffectDlg(); 16 | 17 | // 对话框数据 18 | #ifdef AFX_DESIGN_TIME 19 | enum { IDD = IDD_SOUND_EFFECT_DIALOG }; 20 | #endif 21 | 22 | private: 23 | CEqualizerDlg m_equ_dlg; //均衡器对话框 24 | CReverbDlg m_reverb_dlg; //混响对话框 25 | 26 | int m_tab_selected{}; 27 | CTabCtrlEx m_tab; 28 | 29 | protected: 30 | virtual CString GetDialogName() const; 31 | virtual bool IsRememberDialogSizeEnable() const { return false; }; 32 | virtual bool InitializeControls() override; 33 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 34 | 35 | DECLARE_MESSAGE_MAP() 36 | public: 37 | virtual BOOL OnInitDialog(); 38 | virtual void OnCancel(); 39 | }; 40 | -------------------------------------------------------------------------------- /MusicPlayer2/SpectralDataHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CSpectralDataHelper 3 | { 4 | public: 5 | CSpectralDataHelper(); 6 | 7 | //使用线性的方式根据fft数据计算频谱的高度 8 | // @para[in]: 9 | // fft_data: fft数据 10 | // scale: 柱形放大的比例,调整这个值可以调整频谱分析柱形图整体的高度 11 | // @para[out]: 12 | // spectral_data: 频谱的高度 13 | static void SpectralDataMapOld(float fft_data[FFT_SAMPLE], float spectral_data[SPECTRUM_COL], int scale = 60); 14 | 15 | //使用线性+对数的方式根据fft数据计算频谱的高度(https://github.com/zhongyang219/MusicPlayer2/issues/169) 16 | // @para[in]: 17 | // fft_data: fft数据 18 | // scale: 柱形放大的比例,调整这个值可以调整频谱分析柱形图整体的高度 19 | // @para[out]: 20 | // spectral_data: 频谱的高度 21 | void SpectralDataMap(float fft_data[FFT_SAMPLE], float spectral_data[SPECTRUM_COL], int scale = 60); 22 | 23 | private: 24 | int spectrum_map[FFT_SAMPLE]{}; 25 | int spectrum_map_count[SPECTRUM_COL]{}; 26 | 27 | }; 28 | -------------------------------------------------------------------------------- /MusicPlayer2/SpinEdit.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | // 这是一个带微调按钮的Edit控件,在CEdit右侧附加一个微调按钮,请预留空间 3 | // CSpinEdit 4 | 5 | class CSpinEdit : public CEdit 6 | { 7 | DECLARE_DYNAMIC(CSpinEdit) 8 | 9 | public: 10 | CSpinEdit(); 11 | virtual ~CSpinEdit(); 12 | 13 | void SetRange(short lower, short upper, short step = 1); // 设置文本框中的数值范围 14 | void SetValue(int value); //设置文本框中的数值 15 | int GetValue(); //获取文本框中的数值 16 | void SetMouseWheelEnable(bool enable); //设置是否允许响应鼠标滚轮 17 | 18 | protected: 19 | CSpinButtonCtrl m_spin; //微调按钮控件 20 | int m_step{}; 21 | int m_spin_width{}; 22 | bool m_mouse_wheel_enable{ true }; 23 | 24 | DECLARE_MESSAGE_MAP() 25 | virtual void PreSubclassWindow(); 26 | public: 27 | virtual BOOL PreTranslateMessage(MSG* pMsg); 28 | protected: 29 | afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 30 | public: 31 | void OnDeltaposSpin(NMHDR* pNMHDR, LRESULT* pResult); 32 | afx_msg void OnKillFocus(CWnd* pNewWnd); 33 | afx_msg void OnEnable(BOOL bEnable); 34 | afx_msg void OnSize(UINT nType, int cx, int cy); 35 | }; 36 | 37 | 38 | -------------------------------------------------------------------------------- /MusicPlayer2/StaticEx.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "IconMgr.h" 3 | 4 | class CStaticEx : 5 | public CStatic 6 | { 7 | public: 8 | CStaticEx(); 9 | ~CStaticEx(); 10 | 11 | void SetTextColor(COLORREF text_color); 12 | void SetBackgroundColor(COLORREF back_color); 13 | void SetWindowText(LPCTSTR lpszString); 14 | CString GetWindowText() const; 15 | void SetIcon(IconMgr::IconType icon_type); //设置在文本前面的图标 16 | 17 | private: 18 | COLORREF m_text_color{ GRAY(0) }; 19 | COLORREF m_back_color{ GRAY(255) }; 20 | bool m_transparent{ true }; 21 | IconMgr::IconType m_icon_type = IconMgr::IconType::IT_NO_ICON; 22 | 23 | public: 24 | DECLARE_MESSAGE_MAP() 25 | afx_msg void OnPaint(); 26 | }; 27 | 28 | -------------------------------------------------------------------------------- /MusicPlayer2/SupportedFormatDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "ListCtrlEx.h" 4 | 5 | // CSupportedFormatDlg 对话框 6 | 7 | class CSupportedFormatDlg : public CBaseDialog 8 | { 9 | DECLARE_DYNAMIC(CSupportedFormatDlg) 10 | 11 | public: 12 | CSupportedFormatDlg(CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CSupportedFormatDlg(); 14 | 15 | // 对话框数据 16 | #ifdef AFX_DESIGN_TIME 17 | enum { IDD = IDD_SUPPORT_FORMAT_DIALOG }; 18 | #endif 19 | 20 | protected: 21 | CListCtrlEx m_format_list; 22 | 23 | virtual CString GetDialogName() const override; 24 | virtual bool InitializeControls() override; 25 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 26 | 27 | DECLARE_MESSAGE_MAP() 28 | public: 29 | virtual BOOL OnInitDialog(); 30 | }; 31 | -------------------------------------------------------------------------------- /MusicPlayer2/TagEditDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | 4 | // CTagEditDlg 对话框 5 | 6 | class CTagEditDlg : public CBaseDialog 7 | { 8 | DECLARE_DYNAMIC(CTagEditDlg) 9 | 10 | public: 11 | CTagEditDlg(vector& file_list, int index, CWnd* pParent = nullptr); // 标准构造函数 12 | virtual ~CTagEditDlg(); 13 | 14 | // 对话框数据 15 | #ifdef AFX_DESIGN_TIME 16 | enum { IDD = IDD_TAG_EDIT_DIALOG }; 17 | #endif 18 | 19 | protected: 20 | vector& m_file_list; 21 | int m_index; 22 | CComboBox m_genre_combo; 23 | 24 | void ShowInfo(); 25 | 26 | virtual CString GetDialogName() const override; 27 | virtual bool InitializeControls() override; 28 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 29 | 30 | DECLARE_MESSAGE_MAP() 31 | public: 32 | virtual BOOL OnInitDialog(); 33 | afx_msg void OnBnClickedPreviousButton(); 34 | afx_msg void OnBnClickedNextButton(); 35 | afx_msg void OnBnClickedSaveButton(); 36 | }; 37 | -------------------------------------------------------------------------------- /MusicPlayer2/TagFromNameDlg.cpp: -------------------------------------------------------------------------------- 1 | // TagFromNameDlg.cpp: 实现文件 2 | // 3 | 4 | #include "stdafx.h" 5 | #include "MusicPlayer2.h" 6 | #include "TagFromNameDlg.h" 7 | 8 | 9 | // CTagFromNameDlg 对话框 10 | 11 | IMPLEMENT_DYNAMIC(CTagFromNameDlg, CTagSelBaseDlg) 12 | 13 | CTagFromNameDlg::CTagFromNameDlg(CWnd* pParent) 14 | : CTagSelBaseDlg(true, pParent) 15 | { 16 | } 17 | 18 | CTagFromNameDlg::~CTagFromNameDlg() 19 | { 20 | } 21 | 22 | CString CTagFromNameDlg::GetDialogName() const 23 | { 24 | return L"TagFromNameDlg"; 25 | } 26 | 27 | bool CTagFromNameDlg::InitializeControls() 28 | { 29 | wstring temp; 30 | temp = theApp.m_str_table.LoadText(L"TITLE_TAG_FROM_NAME"); 31 | SetWindowTextW(temp.c_str()); 32 | temp = theApp.m_str_table.LoadText(L"TXT_TAG_FROM_NAME_INFO"); 33 | SetDlgItemTextW(IDC_INFO_STATIC, temp.c_str()); 34 | 35 | return CTagSelBaseDlg::InitializeControls(); 36 | } 37 | 38 | void CTagFromNameDlg::DoDataExchange(CDataExchange* pDX) 39 | { 40 | CTagSelBaseDlg::DoDataExchange(pDX); 41 | } 42 | 43 | BEGIN_MESSAGE_MAP(CTagFromNameDlg, CTagSelBaseDlg) 44 | END_MESSAGE_MAP() 45 | 46 | 47 | BOOL CTagFromNameDlg::OnInitDialog() 48 | { 49 | CTagSelBaseDlg::OnInitDialog(); 50 | 51 | // TODO: 在此添加额外的初始化 52 | SetIcon(IconMgr::IconType::IT_Info, FALSE); 53 | 54 | return TRUE; // return TRUE unless you set the focus to a control 55 | // 异常: OCX 属性页应返回 FALSE 56 | } 57 | -------------------------------------------------------------------------------- /MusicPlayer2/TagFromNameDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "TagSelBaseDlg.h" 3 | 4 | // CTagFromNameDlg 对话框 5 | 6 | class CTagFromNameDlg : public CTagSelBaseDlg 7 | { 8 | DECLARE_DYNAMIC(CTagFromNameDlg) 9 | public: 10 | CTagFromNameDlg(CWnd* pParent = nullptr); // 标准构造函数 11 | virtual ~CTagFromNameDlg(); 12 | 13 | protected: 14 | virtual CString GetDialogName() const; 15 | virtual bool InitializeControls() override; 16 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 17 | 18 | DECLARE_MESSAGE_MAP() 19 | public: 20 | virtual BOOL OnInitDialog(); 21 | }; 22 | 23 | -------------------------------------------------------------------------------- /MusicPlayer2/TestDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "PlayerToolBar.h" 4 | #include "PlayerProgressBar.h" 5 | #include "BrowseEdit.h" 6 | #include "ListCtrlEx.h" 7 | 8 | // CTestDlg 对话框 9 | 10 | class CTestDlg : public CBaseDialog 11 | { 12 | DECLARE_DYNAMIC(CTestDlg) 13 | 14 | public: 15 | CTestDlg(CWnd* pParent = nullptr); // 标准构造函数 16 | virtual ~CTestDlg(); 17 | 18 | // 对话框数据 19 | #ifdef AFX_DESIGN_TIME 20 | enum { IDD = IDD_TEST_DIALOG }; 21 | #endif 22 | 23 | 24 | protected: 25 | virtual CString GetDialogName() const override; 26 | virtual bool InitializeControls() override; 27 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 28 | 29 | DECLARE_MESSAGE_MAP() 30 | 31 | private: 32 | CPlayerToolBar m_toolbar; 33 | CPlayerProgressBar m_progress_bar; 34 | 35 | CImage m_image; 36 | Gdiplus::Image* m_pImage; 37 | 38 | int m_timer_cnt{}; 39 | 40 | CBitmap bitmap; 41 | CBitmap bitmap_copy; 42 | 43 | CListCtrlEx m_list_ctrl; 44 | 45 | public: 46 | virtual BOOL OnInitDialog(); 47 | afx_msg void OnTimer(UINT_PTR nIDEvent); 48 | CBrowseEdit m_browse_edit; 49 | afx_msg void OnPaint(); 50 | }; 51 | -------------------------------------------------------------------------------- /MusicPlayer2/TinyXml2Helper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "tinyxml2/tinyxml2.h" 3 | 4 | class CTinyXml2Helper 5 | { 6 | public: 7 | 8 | //从文件读取XML内容 9 | static bool LoadXmlFile(tinyxml2::XMLDocument& doc, const wchar_t* file_path); 10 | 11 | //遍历一个XML节点 12 | //fun: 一个函数对象,遍历到一个节点时被调用 13 | static void IterateChildNode(tinyxml2::XMLElement* ele, std::function fun); 14 | 15 | //获取一个节点的属性(返回值不会为空指针,如果找不到则返回空字符串) 16 | static const char* ElementAttribute(tinyxml2::XMLElement* ele, const char* attr); 17 | 18 | //获取一个节点的名称(返回值不会为空指针,如果找不到则返回空字符串) 19 | static const char* ElementName(tinyxml2::XMLElement* ele); 20 | 21 | //获取一个节点的文本(返回值不会为空指针,如果找不到则返回空字符串) 22 | static const char* ElementText(tinyxml2::XMLElement* ele); 23 | 24 | static bool StringToBool(const char* str); 25 | 26 | static void GetElementAttributeBool(tinyxml2::XMLElement* ele, const char* attr, bool& value); 27 | static void GetElementAttributeInt(tinyxml2::XMLElement* ele, const char* attr, int& value); 28 | }; 29 | -------------------------------------------------------------------------------- /MusicPlayer2/UIWindow.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "IPlayerUI.h" 3 | 4 | class CUIWindow : 5 | public CStatic 6 | { 7 | public: 8 | CUIWindow(IPlayerUI*& pUI) 9 | : m_pUI(pUI) 10 | {} 11 | 12 | ~CUIWindow() 13 | {} 14 | 15 | protected: 16 | IPlayerUI*& m_pUI; 17 | bool m_bTitlebarLButtonDown{}; 18 | CPoint m_ptLButtonDown{}; 19 | IPlayerUI* GetCurUi() const; 20 | 21 | virtual void PreSubclassWindow(); 22 | virtual BOOL PreTranslateMessage(MSG* pMsg); 23 | 24 | DECLARE_MESSAGE_MAP() 25 | afx_msg void OnLButtonUp(UINT nFlags, CPoint point); 26 | afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 27 | afx_msg void OnLButtonDblClk(UINT nFlags, CPoint point); 28 | // afx_msg void OnRButtonDblClk(UINT nFlags, CPoint point); 29 | afx_msg void OnMouseMove(UINT nFlags, CPoint point); 30 | public: 31 | afx_msg void OnRButtonUp(UINT nFlags, CPoint point); 32 | afx_msg void OnPaint(); 33 | afx_msg void OnSize(UINT nType, int cx, int cy); 34 | afx_msg void OnMouseLeave(); 35 | protected: 36 | afx_msg LRESULT OnTabletQuerysystemgesturestatus(WPARAM wParam, LPARAM lParam); 37 | public: 38 | afx_msg void OnRButtonDown(UINT nFlags, CPoint point); 39 | }; 40 | 41 | -------------------------------------------------------------------------------- /MusicPlayer2/UiSearchBox.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "afxdialogex.h" 3 | #include "SearchEditCtrl.h" 4 | 5 | // CUiSearchBox 对话框 6 | 7 | namespace UiElement 8 | { 9 | class SearchBox; 10 | } 11 | 12 | class CUiSearchBox : public CDialog 13 | { 14 | DECLARE_DYNAMIC(CUiSearchBox) 15 | 16 | public: 17 | CUiSearchBox(CWnd* pParent); // 标准构造函数 18 | void Create(); 19 | virtual ~CUiSearchBox(); 20 | void Show(UiElement::SearchBox* ui_search_box, bool big_icon); //显示搜索框。ui_search_box:对应的UI中的搜索框 21 | void Clear(); //清除搜索状态 22 | void UpdatePos(); //当父窗口大小或位置变化时调用此函数以同步搜索框的位置(暂时未使用) 23 | 24 | // 对话框数据 25 | #ifdef AFX_DESIGN_TIME 26 | enum { IDD = IDD_UI_SEARCH_BOX_DIALOG }; 27 | #endif 28 | 29 | protected: 30 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 31 | 32 | DECLARE_MESSAGE_MAP() 33 | public: 34 | virtual BOOL OnInitDialog(); 35 | afx_msg void OnSize(UINT nType, int cx, int cy); 36 | CSearchEditCtrl m_search_box; 37 | virtual void OnCancel(); 38 | 39 | private: 40 | UiElement::SearchBox* m_ui_search_box{}; 41 | 42 | public: 43 | afx_msg void OnEnKillfocusUiSearchBoxEdit(); 44 | protected: 45 | afx_msg LRESULT OnSearchEditBtnClicked(WPARAM wParam, LPARAM lParam); 46 | public: 47 | afx_msg void OnEnChangeUiSearchBoxEdit(); 48 | }; 49 | -------------------------------------------------------------------------------- /MusicPlayer2/UpdateHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | class CUpdateHelper 3 | { 4 | public: 5 | CUpdateHelper(); 6 | ~CUpdateHelper(); 7 | 8 | enum class UpdateSource 9 | { 10 | GitHubSource, 11 | GiteeSource 12 | }; 13 | 14 | void SetUpdateSource(UpdateSource update_source); 15 | 16 | bool CheckForUpdate(); 17 | 18 | const std::wstring& GetVersion() const; 19 | const std::wstring& GetLink() const; 20 | const std::wstring& GetLink64() const; 21 | const std::wstring& GetContentsEn() const; 22 | const std::wstring& GetContentsZhCn() const; 23 | bool IsRowData(); 24 | 25 | private: 26 | void ParseUpdateInfo(wstring version_info); 27 | 28 | private: 29 | std::wstring m_version; 30 | std::wstring m_link; 31 | std::wstring m_link64; 32 | std::wstring m_contents_en; 33 | std::wstring m_contents_zh_cn; 34 | bool m_row_data{ true }; 35 | UpdateSource m_update_source{ UpdateSource::GitHubSource }; 36 | }; 37 | -------------------------------------------------------------------------------- /MusicPlayer2/WinVersionHelper.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | struct WinVersion 4 | { 5 | public: 6 | WinVersion(); 7 | 8 | int m_major_version; 9 | int m_minor_version; 10 | int m_build_number; 11 | }; 12 | 13 | class CWinVersionHelper 14 | { 15 | public: 16 | ~CWinVersionHelper(); 17 | 18 | static bool IsWindows11OrLater(); //判断当前Windows版本是否为Win11或更新的版本 19 | static bool IsWindows10(); //判断Windows版本是否为Windows10 20 | static bool IsWindows10FallCreatorOrLater(); //判断当前Windows版本是否为Win10秋季创意者更新或更新的版本 21 | static bool IsWindowsVista(); 22 | static bool IsWindows7(); //判断Windows版本是否为Windows7 23 | static bool IsWindows7OrLater(); 24 | static bool IsWindows8Or8point1(); //判断Windows版本是否为Windows8或Windows8.1 25 | static bool IsWindows8OrLater(); 26 | static bool IsWindows81OrLater(); 27 | static bool IsWindows10OrLater(); 28 | static bool IsWindows10Version1809OrLater(); 29 | 30 | static int GetMajorVersion() { return m_version.m_major_version; } 31 | static int GetMinorVersion() { return m_version.m_minor_version; } 32 | static int GetBuildNumber() { return m_version.m_build_number; } 33 | 34 | static bool IsWindows10LightTheme(); 35 | static void CheckWindows10LightTheme(); 36 | 37 | private: 38 | CWinVersionHelper(); 39 | static LONG GetDWORDRegKeyData(HKEY hKey, const wstring& strValueName, DWORD& dwValueData); 40 | 41 | static WinVersion m_version; 42 | static bool m_windows10_light_theme; 43 | }; 44 | -------------------------------------------------------------------------------- /MusicPlayer2/WmaEncodeCfgDlg.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "BaseDialog.h" 3 | #include "IPlayerCore.h" 4 | 5 | // CWmaEncodeCfgDlg 对话框 6 | 7 | class CWmaEncodeCfgDlg : public CBaseDialog 8 | { 9 | DECLARE_DYNAMIC(CWmaEncodeCfgDlg) 10 | 11 | public: 12 | CWmaEncodeCfgDlg(CWnd* pParent = nullptr); // 标准构造函数 13 | virtual ~CWmaEncodeCfgDlg(); 14 | 15 | // 对话框数据 16 | #ifdef AFX_DESIGN_TIME 17 | enum { IDD = IDD_WMA_ENCODE_CFG_DIALOG }; 18 | #endif 19 | 20 | WmaEncodePara m_encode_para; 21 | 22 | protected: 23 | //控件变量 24 | CComboBox m_bitrate_combo; 25 | CComboBox m_vbr_quality_combo; 26 | 27 | vector>m_bitrate_list; 28 | vector>m_quality_list; 29 | 30 | void SetControlEnable(); 31 | 32 | virtual CString GetDialogName() const override; 33 | virtual bool IsRememberDialogSizeEnable() const override { return false; }; 34 | virtual bool InitializeControls() override; 35 | virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 36 | 37 | DECLARE_MESSAGE_MAP() 38 | public: 39 | virtual BOOL OnInitDialog(); 40 | afx_msg void OnCbnSelchangeBitrateCombo(); 41 | afx_msg void OnCbnSelchangeVbrQualityCombo(); 42 | afx_msg void OnBnClickedCbrRadio(); 43 | afx_msg void OnBnClickedCbrRadio2(); 44 | }; 45 | -------------------------------------------------------------------------------- /MusicPlayer2/bass.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/bass.lib -------------------------------------------------------------------------------- /MusicPlayer2/bass_fx.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/bass_fx.lib -------------------------------------------------------------------------------- /MusicPlayer2/bass_fx_x64.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/bass_fx_x64.lib -------------------------------------------------------------------------------- /MusicPlayer2/bass_x64.lib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/bass_x64.lib -------------------------------------------------------------------------------- /MusicPlayer2/crashtool.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | namespace CRASHREPORT 4 | { 5 | /**@brief 6 | 开启dmup模式 7 | 开启后,当程序崩溃时,会生成一个dump文件,该文件在C:\Users\<用户名>\AppData\Local\Temp目录 8 | 文件名格式:崩溃时间_程序名称.exe.dmp 9 | 如下 10 | 20150116174802_CrashShare.exe.dmp 11 | */ 12 | void StartCrashReport(); 13 | } -------------------------------------------------------------------------------- /MusicPlayer2/default_background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/default_background.jpg -------------------------------------------------------------------------------- /MusicPlayer2/md5.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include "Common.h" 7 | 8 | typedef struct { 9 | uint32_t state[4]; // Current accumulation of hash 10 | uint32_t temp[64]; 11 | uint8_t buffer[128]; // Input to be used in the next step 12 | uint16_t bufferLength; 13 | size_t bytesHashed; 14 | uint8_t digest[16]; // Result of algorithm 15 | }MD5Context; 16 | 17 | void md5Init(MD5Context* ctx); 18 | void md5Update(MD5Context* ctx, uint8_t* input, size_t input_len); 19 | void md5Finalize(MD5Context* ctx); 20 | 21 | uint32_t rotateLeft(uint32_t x, uint32_t n); 22 | 23 | class MD5 { 24 | public: 25 | MD5(); 26 | std::string Digest(); 27 | void Finalize(); 28 | std::string HexDigest(); 29 | void Update(std::string data); 30 | void Update(std::wstring data, CodeType code = CodeType::UTF8_NO_BOM, bool* char_cannot_convert = nullptr); 31 | private: 32 | MD5Context ctx; 33 | bool m_finalized; 34 | }; 35 | -------------------------------------------------------------------------------- /MusicPlayer2/print_compile_time.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal 3 | 4 | :: Get the local date and time 5 | for /f "tokens=2 delims==." %%i in ('wmic os get localdatetime /value') do set datetime=%%i 6 | :: Extract the parts (cmd is not case sensitive) 7 | set year=%datetime:~0,4% 8 | set month=%datetime:~4,2% 9 | set day=%datetime:~6,2% 10 | set hh=%datetime:~8,2% 11 | set mm=%datetime:~10,2% 12 | set ss=%datetime:~12,2% 13 | :: Formatted as yyyy-MM-dd HH:mm:ss 14 | set formatted_datetime=%year%-%month%-%day% %hh%:%mm%:%ss% 15 | :: Output to compile_time.txt file 16 | echo %formatted_datetime% > compile_time.txt 17 | 18 | :: Get the current Git commit hash (without showing error messages) 19 | for /f %%i in ('git rev-parse HEAD 2^>nul') do set commit_hash=%%i 20 | :: If the git command is executed successfully, the commit hash is appended to the compile_time.txt file. 21 | if not "%commit_hash%"=="" (echo %commit_hash% >> compile_time.txt) 22 | 23 | endlocal 24 | -------------------------------------------------------------------------------- /MusicPlayer2/res/Acknowledgement.txt: -------------------------------------------------------------------------------- 1 | @lrisora 2 | @lifegpc 3 | @VictoriousRaptor 4 | @hu3rror 5 | -------------------------------------------------------------------------------- /MusicPlayer2/res/AddTag.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/AddTag.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/Cortana_black.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/Cortana_black.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/Cortana_white.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/Cortana_white.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/DeleteTag.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/DeleteTag.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/Find.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/Find.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/MusicPlayer2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/MusicPlayer2.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/MusicPlayer2.rc2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/MusicPlayer2.rc2 -------------------------------------------------------------------------------- /MusicPlayer2/res/MusicPlayer2_dark.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/MusicPlayer2_dark.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/MusicPlayer2_debug.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/MusicPlayer2_debug.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/MusicPlayer2_light.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/MusicPlayer2_light.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/Replace.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/Replace.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/ReplaceTag.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/ReplaceTag.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/Save.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/Save.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/add.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/add.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/add_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/add_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/album.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/album.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/album_cover.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/album_cover.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/album_cover_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/album_cover_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/album_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/album_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/artist.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/artist.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/artist_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/artist_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/background_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/background_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/bitrate.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/bitrate.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/bitrate_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/bitrate_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/close.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/close.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/close_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/close_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/convert_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/convert_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/copy.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/copy.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/dark_mode.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/dark_mode.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/default_cover.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/default_cover.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/default_cover_new.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/default_cover_new.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/default_cover_new_not_played.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/default_cover_new_not_played.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/display_mode.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/display_mode.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/display_mode_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/display_mode_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/donate.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/donate.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/donate_wechat.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/donate_wechat.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/double_line_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/double_line_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/download1_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/download1_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/download_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/download_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/drag.cur: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/drag.cur -------------------------------------------------------------------------------- /MusicPlayer2/res/edit_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/edit_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/eq.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/eq.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/eq_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/eq_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/exit_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/exit_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/expand.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/expand.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/expand_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/expand_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/explorer_folder.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/explorer_folder.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/favourite.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/favourite.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/favourite_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/favourite_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/ff_new_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/ff_new_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/file_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/file_icon.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/file_playlist_icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/file_playlist_icon.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/file_relate.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/file_relate.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/file_relate_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/file_relate_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/fix_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/fix_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/folder_explore.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/folder_explore.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/folder_explore_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/folder_explore_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/genre.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/genre.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/genre_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/genre_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/heart.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/heart.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/help.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/help.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/help_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/help_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/hot_key.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/hot_key.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/internal_lyric_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/internal_lyric_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/karaoke.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/karaoke.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/karaoke_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/karaoke_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/light_mode.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/light_mode.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/link.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/link.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/link_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/link_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/locate.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/locate.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/locate_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/locate_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/lock_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/lock_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/lyric.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/lyric.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/lyric_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/lyric_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/lyric_delay.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/lyric_delay.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/lyric_forward.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/lyric_forward.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/maximize.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/maximize.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/maximize_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/maximize_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/media_lib.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/media_lib.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/media_lib_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/media_lib_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/menu.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/menu.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/menu_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/menu_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/mini.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/mini.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/mini_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/mini_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/mini_restore.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/mini_restore.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/mini_restore_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/mini_restore_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/minimize.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/minimize.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/minimize_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/minimize_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/more_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/more_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/music_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/music_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/new_folder.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/new_folder.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/new_folder_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/new_folder_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/next_dark.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/next_dark.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/next_white.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/next_white.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/notify_preview.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/notify_preview.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/notify_preview_light.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/notify_preview_light.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/now_playing.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/now_playing.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/now_playing_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/now_playing_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/ok.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/ok.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/online_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/online_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/owner_draw_titlebar_preview.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/owner_draw_titlebar_preview.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/pause_dark.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/pause_dark.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/pause_white.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/pause_white.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/pin_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/pin_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/play_as_next.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/play_as_next.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/play_dark.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/play_dark.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/play_in_folder.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/play_in_folder.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/play_in_playlist.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/play_in_playlist.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/play_in_playlist_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/play_in_playlist_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/play_pause_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/play_pause_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/play_white.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/play_white.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/playlist_dock.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/playlist_dock.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/playlist_dock_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/playlist_dock_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/playlist_float_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/playlist_float_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/previous_dark.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/previous_dark.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/previous_white.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/previous_white.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/recent_songs.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/recent_songs.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/recent_songs_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/recent_songs_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/refresh.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/refresh.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/refresh_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/refresh_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/rename_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/rename_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/restore.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/restore.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/restore_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/restore_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/reverb.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/reverb.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/reverb_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/reverb_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/rew_new_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/rew_new_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/save_as_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/save_as_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/save_new.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/save_new.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/setting.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/setting.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/setting_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/setting_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/shortcut_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/shortcut_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/skn.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/skn.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/skn_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/skn_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/slow_down_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/slow_down_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/sort.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/sort.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/sort_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/sort_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/speed_up_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/speed_up_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/star.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/star.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/star_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/star_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/statistics_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/statistics_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/stop_dark.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/stop_dark.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/stop_white.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/stop_white.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/switch.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/switch.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/switch_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/switch_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/system_titlebar_preview.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/system_titlebar_preview.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/tag.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/tag.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/toolbar1.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/toolbar1.bmp -------------------------------------------------------------------------------- /MusicPlayer2/res/tree_branch_collapsed.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/tree_branch_collapsed.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/tree_branch_collapsed_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/tree_branch_collapsed_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/tree_branch_expanded.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/tree_branch_expanded.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/tree_branch_expanded_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/tree_branch_expanded_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/unlink.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/unlink.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/unlink_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/unlink_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/up_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/up_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume0.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume0.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume0_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume0_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume1.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume1_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume1_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume2.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume2.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume2_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume2_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume3.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume3.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/volume3_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/volume3_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/year.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/year.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/year_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/year_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/上一曲.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/上一曲.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/下一曲.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/下一曲.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/停止.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/停止.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/全屏.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/全屏.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/全屏1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/全屏1.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/全屏1_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/全屏1_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/全屏_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/全屏_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/列表循环.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/列表循环.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/列表循环_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/列表循环_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/单曲循环.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/单曲循环.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/单曲循环_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/单曲循环_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/单曲播放.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/单曲播放.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/单曲播放_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/单曲播放_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/快进.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/快进.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/快退.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/快退.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/播放.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/播放.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/播放_暂停.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/播放_暂停.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/播放列表.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/播放列表.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/播放列表_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/播放列表_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/文件夹.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/文件夹.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/文件夹_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/文件夹_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/暂停.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/暂停.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/曲目信息.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/曲目信息.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/曲目信息_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/曲目信息_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/查找.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/查找.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/查找_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/查找_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/随机播放.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/随机播放.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/随机播放1.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/随机播放1.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/随机播放1_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/随机播放1_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/随机播放_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/随机播放_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/顺序播放.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/顺序播放.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/顺序播放_d.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/顺序播放_d.ico -------------------------------------------------------------------------------- /MusicPlayer2/res/黑色胶片.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/黑色胶片.png -------------------------------------------------------------------------------- /MusicPlayer2/res/黑色胶片_not_played.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zhongyang219/MusicPlayer2/e51d77514999ce70db10740029cbbfec98e7c854/MusicPlayer2/res/黑色胶片_not_played.png -------------------------------------------------------------------------------- /MusicPlayer2/skins/miniMode/miniMode00.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |