1 #pragma once 2 //自定义包含文件 3 #include <vector> 4 #include <io.h> 5 #include <string> 6 #include <algorithm> 7 #include <fstream> 8 #include <sstream> 9 #include <iomanip> 10 #include <map> 11 #include <set> 12 #include <unordered_map> 13 #include <unordered_set> 14 #include <deque> 15 #include <list> 16 #include <mutex> 17 #include <shared_mutex> 18 #include <cmath> 19 #include <memory> 20 #include <functional> 21 #include <array> 22 using std::ofstream; 23 using std::ifstream; 24 using std::string; 25 using std::wstring; 26 using std::vector; 27 using std::deque; 28 using std::map; 29 using std::pair; 30 31 //用于BASS音频库的支持 32 #include "bass.h" 33 #include "bass_fx.h" 34 //#ifdef _M_X64 35 //#pragma comment(lib,"bass_x64.lib") 36 //#else 37 //#pragma comment(lib,"bass.lib") 38 //#endif 39 40 //引用taglib库 41 #ifdef _M_X64 42 #pragma comment(lib,"tag_x64.lib") 43 #else 44 #pragma comment(lib,"tag.lib") 45 #endif 46 47 48 //如果需要为Windows XP编译,请去掉下面一行代码的注释 49 //#define COMPILE_IN_WIN_XP 50 51 //如果要禁用MediaTransControls,请去掉下面一行代码的注释以启用DISABLE_MEDIA_TRANS_CONTROLS宏 52 //如果在Win7下编译时提示找不到api-ms-win-*.dll,可以尝试启用DISABLE_MEDIA_TRANS_CONTROLS宏 53 //#define DISABLE_MEDIA_TRANS_CONTROLS 54 55 #ifndef COMPILE_IN_WIN_XP 56 //用于获取系统主题颜色 57 #pragma comment(lib,"Dwmapi.lib") 58 #endif 59 60 #include <afxinet.h> //用于支持使用网络相关的类 61 62 //自定义的宏 63 64 #ifdef UNICODE 65 using _tstring = std::wstring; 66 #else 67 using _tstring = std::string; 68 #endif // !UNICODE 69 70 //CPlayer类中用到的常量 71 #define NEXT (-999) //定义“下一曲”常量 72 #define PREVIOUS (-998) //定义“上一曲”常量 73 74 //#define MAX_NUM_LENGTH 5000 //定义获取音频文件信息数量的最大值 75 #define MAX_SONG_NUM 99999 //播放列表中文件数量的最大值 76 77 #define APP_VERSION L"2.77.1" //程序版本 78 #define COPY_RIGHT_YEAR L"2024" 79 80 //任务栏图按钮 81 #define IDT_PLAY_PAUSE 1321 //任务栏缩略图“播放/暂停”按钮的ID 82 #define IDT_PREVIOUS 1322 //任务栏缩略图“上一曲”按钮的ID 83 #define IDT_NEXT 1323 //任务栏缩略图“下一曲”按钮的ID 84 85 86 //定时器 87 #define TIMER_ID 1234 //定义定时器的ID 88 #define TIMER_ELAPSE 80 //定义定时器响应的时间间隔(毫秒) 89 #define TIMER_ID_MINI 1235 //迷你模式中的定时器ID 90 #define TIMER_ID_MINI2 1236 //迷你模式中的定时器ID,用于显示频谱分析 91 #define TIMER_ELAPSE_MINI 200 //定义迷你模式中的定时器响应的时间间隔(毫秒) 92 #define TIMER_1_SEC 1237 93 #define TIMER_DESKTOP_LYRIC 1238 94 #define TIMER_DESKTOP_LYRIC_2 1239 95 #define TIMER_CMD_OPEN_FILES_DELAY 1240 96 97 #define UI_INTERVAL_DEFAULT 50 //定义界面刷新时间的默认时间间隔(毫秒) 98 #define MIN_UI_INTERVAL 10 //界面刷新时间间隔最小值 99 #define MAX_UI_INTERVAL 300 //界面刷新时间间隔最大值 100 #define UI_INTERVAL_STEP 10 //调整界面刷新时间间隔的步长 101 #define LYRIC_BLANK_IGNORE_TIME 3000 //歌词双行显示、桌面歌词中忽略空白歌词的时间 102 #define MIN_PLAYLIST_ITEM_HEIGHT 20 103 #define MAX_PLAYLIST_ITEM_HEIGHT 64 104 105 //#define TIMER_ID_SPECTRAL 106 //#define TIMER_ID_EXIT 1237 107 108 //频谱分析 109 #define FFT_SAMPLE 256 //频谱分析采样点数 110 //#define FFT_NUM 128 //要使用的频谱的点数 111 #define SPECTRUM_COL 64 //频谱分析柱形的条数(必须为2的整数次方且小于或等于FFT_SAMPLE) 112 113 #define IDC_SAVE_COMBO_BOX 1990 //定义添加到“另存为”对话框中的组合框的ID 114 #define IDC_OPEN_CHECKBOX 1991 //定义添加到“添加文件夹”对话框中的复选框的ID 115 116 //均衡器 117 #define EQU_CH_NUM 10 //均衡器通道的数量 118 const int EQU_STYLE_TABLE[9][EQU_CH_NUM] //均衡器预设 119 { 120 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, //无 121 { 4, 3, 3, 2, 2, 1, 0, -1, -2, -2 }, //古典 122 { 3, 2, 0, -1, -2, -2, -1, 0, 2, 3 }, //流行 123 { 2, 1, 0, -1, -1, 1, 3, 5, 3 }, //爵士 124 { -2, 0, 2, 4, -1, -1, 0, 0, 2, 3 }, //摇滚 125 { 1, 0, 0, 1, 2, 1, -1, -2, -2, -2 }, //柔和 126 { 4, 6, 6, -2, -1, 0, 0, 0, 0, 0 }, //重低音 127 { -5, -5, -3, -2, -2, 0, 0, 0, 0, 0 }, //消除低音 128 { 0, 0, 0, 0, 0, -1, -3, -5, -5, -4 } //弱化高音 129 }; 130 131 #define GRAY(x) RGB(x,x,x) 132 133 #define ALBUM_COVER_NAME L"CurrentAlbumCover-MusicPlayer2-jMZB7TMf" 134 #define ALBUM_COVER_TEMP_NAME L"TempAlbumCover-MusicPlayer2-nKWfQeJo" 135 #define ALBUM_COVER_TEMP_NAME2 L"TempAlbumCover-MusicPlayer2-ogNdd65B" 136 #define ALBUM_COVER_TEMP_NAME_FOR_PROPERTIES L"TempAlbumCover-MusicPlayer2-6vQ0kGpV" 137 //#define DEFAULT_ALBUM_NAME L"cover" 138 139 //#define BACKGROUND_ALPHA 200 //界面背景的透明度0~255 140 #define ALPHA_CHG(alpha) ((alpha)*255/100) //将透明度从0~100映射到0~255 141 142 #define LOCAL_DIR_STR L"%localdir%" 143 #define PLAYLIST_EXTENSION L".playlist" 144 #define PLAYLIST_EXTENSION_2 L"playlist" 145 #define APP_NAME L"MusicPlayer2" 146 #define NO_LYRIC_STR L"NoLyric" 147 #define DEFAULT_BACKGROUND_NAME L"default_background.jpg" 148 149 #define WM_OPEN_FILE_COMMAND_LINE (WM_USER+110) //通过命令行打开文件时向已有实例窗口发送的消息 150 #define MY_WM_NOTIFYICON (WM_USER+115) 151 #define WM_PLAY_SELECTED_BTN_ENABLE (WM_USER+120) 152 #define WM_SET_MENU_STATE (WM_USER+122) 153 #define WM_COLOR_SELECTED (WM_USER+123) 154 #define WM_CUR_PLAYLIST_RENAMED (WM_USER+124) 155 #define WM_INIT_ADD_TO_MENU (WM_USER+127) //重新初始化右键菜单中的“添加到播放列表”子菜单 156 #define WM_OPTION_SETTINGS (WM_USER+128) //打开选项设置 157 #define WM_RECENT_PLAYED_LIST_CLEARED (WM_USER+130) //执行了“清空最近播放曲目列表” 158 //#define WM_TIMER_INTERVAL_CHANGED (WM_USER+131) //主定时器时间间隔改变 159 #define WM_MAIN_WINDOW_ACTIVATED (WM_USER+132) //主窗口被激活 160 #define WM_GET_MUSIC_CURRENT_POSITION (WM_USER+133) //获取当前音乐播放的进度 161 #define WM_PROPERTY_DIALOG_MODIFIED (WM_USER+134) //属性对话框中进行了编辑 162 #define WM_CURRENT_FILE_ALBUM_COVER_CHANGED (WM_USER+135) 163 #define WM_PORPERTY_ONLINE_INFO_ACQUIRED (WM_USER+136) 164 #define WM_RE_INIT_BASS_CONTINUE_PLAY (WM_USER+138) // BASS内核出问题时post此消息到主窗口重启内核 165 #define WM_VOLUME_CHANGED (WM_USER+139) //音量变化时发送的消息 166 #define WM_RECENT_FOLDER_OR_PLAYLIST_CHANGED (WM_USER+140) //最近打开的文件夹或播放列表发生了改变 167 #define WM_SET_UI_FORCE_FRESH_FLAG (WM_USER+141) // 通知主窗口设置UI强制刷新标志m_ui_thread_para.ui_force_refresh 168 169 //通知主窗口清除UI中搜索框中搜索结果,其中wPara为搜索框关联列表元素的类型,在下面几行定义 170 //仅当列表元素的内容发生了改变但是总行数未变的情况下需要发送此消息,行数变化的情况已经在UiElement::ListElement::OnRowCountChanged中处理 171 #define WM_CLEAR_UI_SERCH_BOX ((WM_USER+142)) 172 #define UI_LIST_TYPE_RECENT_PLAYED 0 173 #define UI_LIST_TYPE_FOLDER 1 174 #define UI_LIST_TYPE_PLAYLIST 2 175 176 #define WM_NEXT_USER_MSG (WM_USER+143) 177 178 #ifdef _DEBUG 179 #define ADD_TO_PLAYLIST_MAX_SIZE 10 //“添加到播放列表”子菜单中项目的最大数量(不能超过40) 180 #else 181 #define ADD_TO_PLAYLIST_MAX_SIZE 20 //“添加到播放列表”子菜单中项目的最大数量(不能超过40) 182 #endif 183 184 #define RECENT_FOLDER_PLAYLIST_MAX_SIZE 20 //文件夹/播放列表右侧按钮菜单中的最大值 185 186 #define SELECT_UI_MAX_SIZE 100 //“切换界面”中支持的最大界面数量 187 188 #define MAX_NOTIFY_ICON 3 //可选的通知区图标数量 189 190 #define SAFE_DELETE(p) do \ 191 {\ 192 if(p != nullptr) \ 193 { \ 194 delete p; \ 195 p = nullptr; \ 196 } \ 197 } while (false) 198 199 //定义通过WM_COPYDATA消息传输数据的类型 200 #define COPY_DATA_OPEN_FILE 1 //打开文件 201 #define COPY_DATA_ADD_FILE 2 //添加文件 202