#include <vector>
using namespace std;
typedef struct _LrcInfo
{
CString szGeci;
UINT startTime;
} LrcInfo,*Lrc;
class CLrc
{
public:
CLrc();
virtual ~CLrc();
protected:
vector<LrcInfo> lrc_vector; //歌词
vector<LrcInfo> info_vctor; //作者信息等
HWND m_hWnd;
CRect m_rRect;
int m_LrcHeight;//每行歌词的高度
int m_TopIndex; //最上一句歌词
int m_CurIndex; //dangqian歌词
HFONT m_hFont;//
public:
void CreateCtrl(HWND hwnd,CRect rect);
void LoadLrcFile(CString lrcName);
bool GetLrcInfo(CString lrc);
void InsertLrc(CString lrc);
void GetLrc(vector<LrcInfo> &lrcvector);
void Paint(HDC hdc,CRect rtRect);
void UpdateLrc(UINT time); //更新显示歌词,传毫秒
};
Lrc.cpp
CLrc::CLrc()
{
lrc_vector.clear();
info_vctor.clear();
m_TopIndex = 0;
m_CurIndex =7;
m_hWnd = NULL;
m_LrcHeight = 20;
m_rRect = CRect(0,0,0,0);
m_hFont = NULL;
LOGFONT tmpfont= { 25, 0, 0, 0, FW_BOLD , //黑体还是正常
FALSE, 0, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS, CLEARTYPE_QUALITY,
DEFAULT_PITCH,_T("Tahoma") };/*隶体*/
m_hFont = CreateFontIndirect(&tmpfont);
}
CLrc::~CLrc()
{
if (lrc_vector.size())
lrc_vector.clear();
if (info_vctor.size())
info_vctor.clear();
if (m_hFont)
{
DeleteObject(m_hFont);
m_hFont = NULL;
}
}
void CLrc::CreateCtrl(HWND hwnd,CRect rect)
{
if (hwnd)
{
m_hWnd = hwnd;
m_rRect = rect;
}
}
void CLrc::LoadLrcFile(CString lrcName)
{
if (lrc_vector.size())
lrc_vector.clear();
if (info_vctor.size())
info_vctor.clear();
m_TopIndex = 0;
m_CurIndex =0;
FILE *file = NULL;
file = _wfopen(lrcName,L"r");
while(!feof(file)) //文件打开成功
{
char strtmp[200];
fgets(strtmp,200,file); //从file读取一行放在strtmp
if (!GetLrcInfo(strtmp))
{
CString lrc = strtmp;
InsertLrc(lrc);
}
}
fclose(file);
if (info_vctor.size()&&lrc_vector.size()) //存在歌词信息
{
UINT StartTime = lrc_vector[0].startTime; //第一句歌词时间
UINT MidTime = StartTime/info_vctor.size(); //每条歌词信息开始的时间
int i;
for (i=0;i<info_vctor.size();i++) //获取信息头显示的时间
{
info_vctor[i].startTime = i*MidTime;
int Size = lrc_vector.size(); //插入到歌词列表
for (int j=0;j<Size;j++) //按时间插入
{
if (lrc_vector[j].startTime > info_vctor[i].startTime)
{
vector<LrcInfo>::iterator begin = lrc_vector.begin();
lrc_vector.insert(begin + j,info_vctor[i]);
break;
}
else if (j == Size-1)
{
lrc_vector.push_back(info_vctor[i]);
}
}
}
}
}
bool CLrc::GetLrcInfo(CString lrc)
{
CString info = lrc.Mid(lrc.Find(':')+1,lrc.Find(']')-lrc.Find(':')-1);
LrcInfo lrcinfo;
if (lrc.Find(L"ti:") != -1)
{
lrcinfo.szGeci = info;
info_vctor.push_back(lrcinfo);
return true;
}
else if (lrc.Find(L"al:") != -1)
{
lrcinfo.szGeci = info;
info_vctor.push_back(lrcinfo);
return true;
}
else if (lrc.Find(L"ar:") != -1)
{
lrcinfo.szGeci = info;
info_vctor.push_back(lrcinfo);
return true;
}
else if (lrc.Find(L"by:") != -1)
{
lrcinfo.szGeci = info;
info_vctor.push_back(lrcinfo);
return true;
}
return false;
}
void CLrc::InsertLrc(CString lrc)
{
int start,end;
start = lrc.Find('[');
end = lrc.Find(']');
CString geci = lrc.Mid(lrc.ReverseFind(']')+1,lrc.GetLength()-lrc.ReverseFind(']')-2);
while((start != -1)&&(end != 0)&&(end > start))
{
//时间
CString timeStr = lrc.Mid(lrc.Find('[')+1,lrc.Find(']')-1);
CString timedd = timeStr;
//分
CString mStr = timeStr.Left(2);
timeStr = timeStr.Right(timeStr.GetLength() - timeStr.Find(':')-1);
//秒
CString sStr = timeStr.Left(2);
timeStr = timeStr.Right(timeStr.GetLength() - timeStr.Find('.')-1);
//毫秒
CString msStr = timeStr;
UINT Time = _ttoi(mStr)*60*1000+_ttoi(sStr)*1000+_ttoi(msStr);
CString str;
str.Format(L"%d",Time);
LrcInfo lrci;
lrci.startTime = Time;
lrci.szGeci = geci;
int Size = lrc_vector.size();
int Size = lrc_vector.size();
for (int i=0;i<Size;i++) //按时间插入相应的歌词
{
if (lrc_vector[i].startTime > Time)
{
vector<LrcInfo>::iterator begin = lrc_vector.begin();
lrc_vector.insert(begin + i,lrci);
break;
}
else if (i == Size-1)
{
lrc_vector.push_back(lrci);
}
}
if (lrc_vector.size() == 0)
{
lrc_vector.push_back(lrci);
}
lrc = lrc.Right(lrc.GetLength() - lrc.Find(']')-1);
start = lrc.Find('[');
end = lrc.Find(']');
}
}
简单歌词控件
最新推荐文章于 2021-11-30 17:26:02 发布