www.pudn.com > winnap.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);
}
/// @} 文件注释完毕