www.pudn.com > autolrc.rar > abao_lrc.cpp


 
////////////////////////////////////////////// 
/// @defgroup abaolrc 歌词显示维护类 
/// @author  abao++ 
/// @version 1.0 
/// @date    2006-9-24 9:54:12 
/// @{ 
////////////////////////////////////////////// 
// 有关配置的声明 
#include "abao_lrc.h" 
#include "wa_ipc.h" 
AbaoLrcWindow::AbaoLrcWindow() 
{ 
	this->Width = 288; // mod1 和 mod2 的宽高相等  
	this->Height = 80; // 但是 mod3 的与另外两个不同  
	this->WindowPosX=200; 
	this->WindowPosY=200; 
	this->AlphaValue=200; 
	this->AlphaFlag=0; 
	this->lrcfile.SearchHttpFlag=1; 
	this->lrcfile.SaveLrcFlag=0; 
	this->lrcfile.SearchAllFlag=0; 
	this->lrcfile.SearchFlag=0; 
	this->szAppName= "abao++'s 歌词显示"; 
	lrcfile.lrcwin=this; 
	this->AutoStartUp=1; 
	this->FilterLrcFlag=1; 
	this->RowLedge=10; 
	this->FontHeight=12; 
	time1=0; 
	time2=0; 
	this->Mp3ListIndex=0; 
	this->Mp3Name=""; 
	OldMp3ListIndex=-1; 
	AutoStartUp=0; 
	IniFile=NULL; 
} 
int AbaoLrcWindow::setfilter(char* filter) 
{ 
	string temp=filter; 
	this->FilterString=temp; 
	int tpos=0; 
	int oldpos=0; 
	while((tpos=temp.find(';',oldpos))>0) 
	{ 
		this->lrcfile.FilterList.push_back(temp.substr(oldpos,tpos-oldpos)); 
		oldpos=tpos+1; 
	} 
	if(oldposlrcfile.FilterList.push_back(temp.substr(oldpos,temp.size()-oldpos)); 
	return 1; 
} 
int AbaoLrcWindow::addoffset(int dmillseconds) 
{ 
	lrcfile.offset+=dmillseconds; 
	return 1; 
} 
AbaoLrcWindow::~AbaoLrcWindow() 
{ 
	DeleteObject(MemBitmap); 
	DeleteDC(BitDC); 
} 
 
int AbaoLrcWindow::init() 
{ 
	Mp3ListIndex= SendMessage(this->hWinampWnd, WM_USER, 0, IPC_GETLISTPOS);	 
	Mp3Name=(char*)SendMessage(this->hWinampWnd, WM_USER, Mp3ListIndex, IPC_GETPLAYLISTFILE); 
	char temp[256]; 
	SendMessage(hWinampWnd,WM_WA_IPC,(WPARAM)temp,IPC_GETSKIN); 
	skinpath=temp; 
	if(!Mp3Name.empty()) 
	{ 
		this->lrcfile.InitLrc(Mp3Name); 
		if(!this->lrcfile.lrcmap.empty())  
		{ 
			drawlrcbitmap(); 
			return 1; 
		} 
	} 
	HDC pDC=GetDC(this->hMainWnd); 
	int nHeight=this->Height; 
	int nWidth=this->Width; 
	DeleteObject(BitDC); 
	DeleteObject(MemBitmap); 
	BitDC=CreateCompatibleDC(pDC); 
	MemBitmap=CreateCompatibleBitmap(BitDC,nWidth,nHeight); 
	HBITMAP pOldBit=(HBITMAP)SelectObject(BitDC,MemBitmap); 
	Rectangle(BitDC,0,0,nWidth,nHeight); 
	RECT trect; 
	trect.left=0; 
	trect.top=0; 
	trect.right=nWidth; 
	trect.bottom=nHeight; 
	HBRUSH brush=CreateSolidBrush(RGB(0,0,0)); 
	FillRect(BitDC,&trect,brush); 
	trect.right=this->Width; 
	trect.bottom=this->Height; 
	FillRect(pDC,&trect,brush); 
	DeleteObject(brush); 
	ReleaseDC(hMainWnd,pDC);  
	return 0; 
} 
 
int AbaoLrcWindow::drawlrcbitmap() 
{ 
	if(this->lrcfile.lrcmap.empty()) return 0; 
	HDC pDC=GetDC(this->hMainWnd); 
	int nHeight=this->lrcfile.lrcmap.size()*(this->FontHeight+this->RowLedge)+300; 
	int nWidth=1024; 
	DeleteObject(BitDC); 
	DeleteObject(MemBitmap); 
	BitDC=CreateCompatibleDC(pDC); 
	MemBitmap=CreateCompatibleBitmap(BitDC,nWidth,nHeight); 
	HBITMAP pOldBit=(HBITMAP)SelectObject(BitDC,MemBitmap); 
	Rectangle(BitDC,0,0,nWidth,nHeight); 
	RECT trect; 
	trect.left=0; 
	trect.top=0; 
	trect.right=nWidth; 
	trect.bottom=nHeight; 
	HBRUSH brush=CreateSolidBrush(RGB(0,0,0)); 
	FillRect(BitDC,&trect,brush); 
	trect.right=this->Width; 
	trect.bottom=this->Height; 
	FillRect(pDC,&trect,brush); 
	DeleteObject(brush); 
	int i=0; 
	char buf[256]; 
 
	LOGFONT lf; 
	memset(&lf, 0, sizeof(LOGFONT));  
	lf.lfHeight =this->FontHeight;  
	lf.lfWeight = FW_NORMAL; 
	lf.lfCharSet = GB2312_CHARSET;		 
	strcpy((LPSTR)&(lf.lfFaceName), "新宋体"); 
	HFONT font = CreateFontIndirect(&lf); 
	SelectObject (BitDC, font);  
 
	if(lrcfile.id3v2title!="")  
	{ 
		sprintf(buf,"%s - %s - %s",lrcfile.id3v2title.c_str(),lrcfile.id3v2artist.c_str(),lrcfile.id3v2album.c_str()); 
	} 
	else if(lrcfile.id3v1title!="") 
	{ 
		sprintf(buf,"%s - %s - %s",lrcfile.id3v1title.c_str(),lrcfile.id3v1artist.c_str(),lrcfile.id3v1album.c_str()); 
	} 
	else 
	{ 
		sprintf(buf,"%s",lrcfile.Mp3Name.c_str()); 
	} 
 
	SetBkMode(BitDC,TRANSPARENT); 
	SetTextColor(BitDC,RGB(255,255,255)); 
	GetStockObject(SYSTEM_FIXED_FONT); 
 
	TextOut(BitDC,30,30,buf,strlen(buf)); 
	for(LrcMap::iterator it=this->lrcfile.lrcmap.begin();it!=this->lrcfile.lrcmap.end();it++,i++) 
	{ 
		TextOut(BitDC,20,(i+1)*(this->FontHeight+this->RowLedge)+30,(*it).second.c_str(),(*it).second.length()); 
	} 
	time1=0; 
	time2=0; 
	DeleteObject(font); 
	ReleaseDC(hMainWnd,pDC);  
 
 
	return 1; 
} 
int AbaoLrcWindow::ShowLrc() 
{ 
	Mp3ListIndex= SendMessage(this->hWinampWnd, WM_USER, 0, IPC_GETLISTPOS); 
	if(OldMp3ListIndex!=Mp3ListIndex) 
	{ 
		OldMp3ListIndex=Mp3ListIndex; 
		init(); 
	} 
	HDC hdc = GetDC(hMainWnd);  
	RECT trect; 
	trect.left=0; 
	trect.top=0; 
	trect.right=this->Width; 
	trect.bottom=this->Height; 
	HBRUSH brush=CreateSolidBrush(RGB(0,0,0)); 
	FillRect(memDC,&trect,brush); 
	DeleteObject(brush); 
	if(lrcfile.lrcmap.empty()) 
	{ 
		LOGFONT lf; 
		memset(&lf, 0, sizeof(LOGFONT));  
		lf.lfHeight =this->FontHeight;  
		lf.lfWeight = FW_NORMAL; 
		lf.lfCharSet = GB2312_CHARSET;		 
		strcpy((LPSTR)&(lf.lfFaceName), "新宋体"); 
		HFONT font = CreateFontIndirect(&lf); 
		HFONT oldfont=(HFONT)SelectObject (hdc, font); 
 
		SetBkMode(hdc,TRANSPARENT); 
		SetTextColor(hdc,RGB(255,255,255)); 
		GetStockObject(SYSTEM_FIXED_FONT); 
		TextOut(hdc,30,this->Height/2-(this->FontHeight+this->RowLedge)/2,lrcfile.empty.c_str(),lrcfile.empty.size()); 
		SelectObject(hdc,oldfont); 
		DeleteObject(font); 
	} 
	else 
	{ 
		long lrctime=SendMessage(this->hWinampWnd, WM_USER, 0, IPC_GETOUTPUTTIME); 
		time1=lrcfile.GetLrcTime(lrctime); 
		time2=lrcfile.GetLrcUpTime(lrctime); 
		int index=lrcfile.indexmap[time1]; 
		if(time2==time1)  
		{ 
			time2=1000000L; 
		} 
		//BitBlt(hdc,0,0,width ,height ,memDC,0,i*30+30,SRCCOPY);  
		BitBlt(hdc,0,0,this->Width,this->Height,BitDC,10,30+(index+1+1.0*(lrctime-time1)/(time2-time1))*(this->RowLedge+this->FontHeight)-this->Height/2,SRCCOPY);  
	} 
	ReleaseDC(hMainWnd,hdc);  
	return  0; 
} 
// 生成一个 \plugin.ini 形式的 .ini 文件名  
 
 
 
void AbaoLrcWindow::ReadConfig() 
{ 
	IniFile=(char*)SendMessage(this->hWinampWnd,WM_USER,0,334); 
	if ((unsigned int)IniFile < 65536) IniFile="winamp.ini"; 
	AutoStartUp = GetPrivateProfileInt(PLUGIN_DESC,"AutoStartUp",AutoStartUp,IniFile);	 
	WindowPosX = GetPrivateProfileInt(PLUGIN_DESC,"ScreenX",WindowPosX,IniFile);  
	WindowPosY = GetPrivateProfileInt(PLUGIN_DESC,"ScreenY",WindowPosY,IniFile);  
	this->Width = GetPrivateProfileInt(PLUGIN_DESC,"ScreenWidth",this->Width,IniFile);  
	this->FontHeight= GetPrivateProfileInt(PLUGIN_DESC,"FontHeight",this->FontHeight,IniFile); 
	this->RowLedge = GetPrivateProfileInt(PLUGIN_DESC,"RowLedge",this->RowLedge,IniFile); 
	//this->width-=28; 
	this->Height = GetPrivateProfileInt(PLUGIN_DESC,"ScreenHeight",this->Height,IniFile);  
	this->Height-=27; 
	this->FilterLrcFlag = GetPrivateProfileInt(PLUGIN_DESC,"LrcFilter",this->FilterLrcFlag,IniFile);  
	this->lrcfile.FilterFlag=this->FilterLrcFlag; 
	char buf[512]; 
	GetPrivateProfileString(PLUGIN_DESC,"FilterString","QQ;qq;www;http;net;com;作者;版权;正版;",buf,512,IniFile);		 
	this->setfilter(buf); 
	GetPrivateProfileString(PLUGIN_DESC,"SearchPath","",buf,512,IniFile);	 
	this->lrcfile.SearchFlag = GetPrivateProfileInt(PLUGIN_DESC,"SearchFlag",this->lrcfile.SearchFlag,IniFile);  
	this->lrcfile.SaveLrcFlag = GetPrivateProfileInt(PLUGIN_DESC,"SaveLrcFlag",this->lrcfile.SaveLrcFlag,IniFile);  
	this->AlphaFlag = GetPrivateProfileInt(PLUGIN_DESC,"AlphaFlag",this->AlphaFlag,IniFile);  
	this->AlphaValue = GetPrivateProfileInt(PLUGIN_DESC,"AlphaValue",this->AlphaValue,IniFile);  
	this->lrcfile.SaveLrcFlag = GetPrivateProfileInt(PLUGIN_DESC,"SearchHttpFlag",this->lrcfile.SearchHttpFlag,IniFile);  
	this->lrcfile.SearchPath=buf; 
 
} 
 
void AbaoLrcWindow::WriteConfig() 
{ 
	char string[32]; 
	sprintf(string,"%d",AutoStartUp); 
	WritePrivateProfileString(PLUGIN_DESC,"AutoStartUp",string,IniFile);	 
	sprintf(string,"%d",WindowPosX);  
	WritePrivateProfileString(PLUGIN_DESC,"ScreenX",string,IniFile);  
	sprintf(string,"%d",WindowPosY);  
	WritePrivateProfileString(PLUGIN_DESC,"ScreenY",string,IniFile); 
	sprintf(string,"%d",this->Width-8);  
	WritePrivateProfileString(PLUGIN_DESC,"ScreenWidth",string,IniFile);  
	sprintf(string,"%d",this->Height);  
	WritePrivateProfileString(PLUGIN_DESC,"ScreenHeight",string,IniFile);  
	sprintf(string,"%d",this->FontHeight);  
	WritePrivateProfileString(PLUGIN_DESC,"FontHeight",string,IniFile);  
	sprintf(string,"%d",this->RowLedge);  
	WritePrivateProfileString(PLUGIN_DESC,"RowLedge",string,IniFile);  
	sprintf(string,"%d",this->FilterLrcFlag);  
	WritePrivateProfileString(PLUGIN_DESC,"LrcFilter",string,IniFile);  
	WritePrivateProfileString(PLUGIN_DESC,"FilterString",this->FilterString.c_str(),IniFile);  
	sprintf(string,"%d",this->lrcfile.SaveLrcFlag);  
	WritePrivateProfileString(PLUGIN_DESC,"SaveLrcFlag",string,IniFile);  
	sprintf(string,"%d",this->AlphaFlag);  
	WritePrivateProfileString(PLUGIN_DESC,"AlphaFlag",string,IniFile);  
	sprintf(string,"%d",this->AlphaValue);  
	WritePrivateProfileString(PLUGIN_DESC,"AlphaValue",string,IniFile);  
	sprintf(string,"%d",this->lrcfile.SearchHttpFlag);  
	WritePrivateProfileString(PLUGIN_DESC,"SearchHttpFlag",string,IniFile);  
	sprintf(string,"%d",this->lrcfile.SearchFlag);  
	WritePrivateProfileString(PLUGIN_DESC,"SearchFlag",string,IniFile);  
	WritePrivateProfileString(PLUGIN_DESC,"SearchPath",this->lrcfile.SearchPath.c_str(),IniFile);  
} 
 
/// @}  文件注释完毕