用到歌词显示就写了一个歌词解析类,与大家共同分享。 贴出头文件: /******************************************************************** created: 2009/10/30 created: 30:10:2009 10:17 filename: f:/工作_ZWF(090511)/TCC89X/PT4321/mylrcfile/BnvLrcHanderW.h file path: f:/工作_ZWF(090511)/TCC89X/PT4321/mylrcfile file base: BnvLrcHander file ext: h author: zhangwf purpose: 从原先代码中提取出歌词分析读取的类,使得结构更加清晰,便于 以后的修改与维护 修改: 修改为支持UNICODE格式的 使用方法: 1、设置歌词路径名SetFilePathName,或者设置音乐文件路径名(默认为歌词和歌曲同目录且名字相同) 2、根据当前播放时间值通过GetLyricLineItem接口获得当前需要显示的歌词项 3、如果还需要显示该行前的或后的行的歌词,则可以通过上述函数带出的索引值index, 向前或向后通过GetLyricLineItem函数获取歌词项,来显示。 4、当然也可以通过GetLyricLineCounts获取所有歌词项,通过GetLyricLineItem获取每一项进行比较显示歌词。 *********************************************************************/ #ifndef _BNV_LRC_HANDER_W_H_ #define _BNV_LRC_HANDER_W_H_ // #include <iostream> #include <fstream> #include <algorithm> #include <string> #include <vector> using namespace std; // // 定义歌词中的一项结构 typedef struct _LRC_ITEM_ { wstring Time; wstring Context; }LRCITEM; // class BnvLrcHanderW { public: // 接口函数 // 设置音乐文件路径名(默认为歌词与歌曲同名且在同一个路径下) BOOL SetMusicFilePathName(const wchar_t *filePathName); // 设置歌词文件路径名 BOOL SetLrcFilePathName(const wchar_t *filePathName); // 得到歌词行数 int GetLyricLineCounts(); // 得到具体行的歌词项,lineIndex从0开始(歌词已经按时间由小到大排列) BOOL GetLyricLineItem(LRCITEM &lineItem, int lineIndex); // 根据时间值得到歌词项(时间格式分钟、秒、毫秒) BOOL GetLyricLineItem(LRCITEM &lineItem, int *itemIndex, int minutes, int seconds=0, int millisecond=0); // playTime的格式必须为mm:ss.fff,也就是(分钟:秒.毫秒) BOOL GetLyricLineItem(LRCITEM &lineItem, int *itemIndex, wstring playTime); // 是否得到歌词信息 BOOL GetLrcSuccess(); // 得到歌曲的其他信息 wstring GetArtist(); wstring GetTitle(); wstring GetAlbum(); wstring GetByBody(); int GetTimeOffset(); // 时间偏移值暂时没有使用 public: BnvLrcHanderW(); ~BnvLrcHanderW(); private: // 私有函数 // 解析歌词文件 BOOL PerseLrcFile(const wchar_t *filePathName); // 清空上次记录 void ClearLrcInfo(); // 操作列表的函数 void AddToList(const LRCITEM &curLrcItem); void ClearList(); int GetListSize(); // 清除一项里的内容 void ClearLrcItem(LRCITEM &curItem); private: wstring m