简单歌词控件

#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(']'); 
	 }
}

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值