顯示歌詞的控件 歌詞文件是.lrc格式的 請下載我在CSDN里上傳的酷狗音樂源碼幫你更好理解
一。條用時請先在主程序里初始化GDI+:
1.在stdafx.h里添加
//----------------------------------------------------
#include "gdiplus.h" ////請修改為你的頭文件路徑 using namespace Gdiplus; #pragma comment(lib, "gdiplus.lib") ////請修改為你的.lib文件路徑 //----------------------------------------------------------- 2.在××App里的初始化函數(shù):InitInstance()里添加
初始化時
//---------------------------------------
GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL); //-------------------------------------- 關(guān)閉時
//---------------------------------------
GdiplusShutdown(gdiplusToken); //------------------------------------- 二。初始化控件
geciwenj=new CGecikongjian;
geciwenj->Create(NULL, _T("歌詞控件"), WS_CHILD, CRect(0,0,700,730), GetDesktopWindow(), 124); geciwenj->ShowWindow(SW_SHOW); geciwenj->OpenGeCiFile(存在在程序里的歌詞文件名/在別處的帶路徑的歌詞文件名);//打開歌詞文件
三。歌詞控件代碼
/*******************************************************************************
文件名稱 : Gecikongjian.h 頭文件 作 者 : 楊治忠 創(chuàng)建時間 : 2010-12-20 15:45:17 文件描述 : 顯示歌詞控件 版權(quán)聲明 : Copyright (C) 2010-2012 揚名科技 修改歷史 : 楊治忠 2010-12-20 1.00 初始版本 *******************************************************************************/ #pragma once class CGecikongjian : public CWnd { DECLARE_DYNAMIC(CGecikongjian) public: void OpenGeCiFile(CString filename);//打開歌詞文件 protected: typedef BOOL (WINAPI* lpfnUpdateLayeredWindow)(HWND hwnd,HDC hdcDst,POINT *pptDst,SIZE *psize,HDC hdcSrc,POINT *pptSrc,COLORREF crKey,BLENDFUNCTION *pblend,DWORD dwFlags); lpfnUpdateLayeredWindow UpdateLayeredWindow;//指針函數(shù)類型聲明 void DrawGeCi(void);//顯示歌詞 CString texout;//歌詞類容 double q;//一行歌詞走動占整行的比例1 double m;//----------------2 int l;//-------------------3 CStdioFile file;//文件類對象 CString a[100];//存儲打開歌詞文件后的每行文字 int sum;//歌詞文件的行數(shù) void GetTimeAndGeci();//獲取每個時間段和時間段對應(yīng)的歌詞 CString c[100];//每行歌詞 int b[100];//每行時間 void TimeAndGeciPaiXu();//時間歌詞排序 int sum1;//時間的段數(shù) void YouHaGeCi();//把歌詞里沒用的符號去掉 DWORD readlen; BLENDFUNCTION m_Blend;//G++ public: CGecikongjian(); virtual ~CGecikongjian(); protected: DECLARE_MESSAGE_MAP() public: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); public: afx_msg void OnTimer(UINT_PTR nIDEvent); public: };
/*******************************************************************************
文件名稱 : Gecikongjian.cpp 實現(xiàn)文件 作 者 : 楊治忠 創(chuàng)建時間 : 2010-12-20 16:29:56 文件描述 : QQ號:940446982 VC技術(shù)QQ群:92790715歡迎加入 版權(quán)聲明 : Copyright (C) 2010-2012 感謝技術(shù)支持 YZM 修改歷史 : 楊治忠 2010-12-20 1.00 初始版本 *******************************************************************************/ #include "stdafx.h" #include "MyMp3Play.h" #include "Gecikongjian.h" extern int MusicTime;
IMPLEMENT_DYNAMIC(CGecikongjian, CWnd) CGecikongjian::CGecikongjian()
{ q = 0.0; m = 0.0; l = 0; texout = ""; } CGecikongjian::~CGecikongjian()
{ } BEGIN_MESSAGE_MAP(CGecikongjian, CWnd) ON_WM_CREATE() ON_WM_TIMER() END_MESSAGE_MAP() int CGecikongjian::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ if (CWnd::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您專用的創(chuàng)建代碼
/***************************************************
/********導(dǎo)出透明函數(shù) *************************** /**************************************************/ HMODULE hMoudle=::GetModuleHandle(_T("user32.dll"));
if(hMoudle) { #ifndef WS_EX_LAYERED #define WS_EX_LAYERED 0x00080000 #endif SetWindowLong(GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_LAYERED); UpdateLayeredWindow=(lpfnUpdateLayeredWindow)GetProcAddress(hMoudle,_T("UpdateLayeredWindow")); } //GDI+ //--------------------------------------------------- m_Blend.BlendOp=0; //theonlyBlendOpdefinedinWindows2000 m_Blend.BlendFlags=0; //nothingelseisspecial... m_Blend.AlphaFormat=1; //... m_Blend.SourceConstantAlpha=255;//AC_SRC_ALPHA //---------------------------------------------- SetTimer(0,1000,NULL);//設(shè)置定時器 return 0; } /******************************************************************** 函數(shù)名稱 ::DrawGeCi(void) 函數(shù)描述 :顯示歌詞 輸入?yún)?shù) : void 輸出參數(shù) : void 備注 : QQ號:940446982 VC技術(shù)QQ群:92790715歡迎加入 *********************************************************************/ void CGecikongjian::DrawGeCi(void) { RECT rct; GetWindowRect(&rct); HDC hdcTemp=GetDC()->m_hDC; HDC m_hdcMemory=CreateCompatibleDC(hdcTemp); HBITMAP hBitMap=CreateCompatibleBitmap(hdcTemp,rct.right - rct.left, rct.bottom - rct.top ); SelectObject(m_hdcMemory,hBitMap); m_Blend.SourceConstantAlpha=60; Graphics graphics(m_hdcMemory);
FontFamily fontFamily(L"宋體"); Font font(&fontFamily, 45, FontStyleBold, UnitPixel); SolidBrush solidBrush(Color(255, 0, 0, 255)); graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel); graphics.DrawString( texout.AllocSysString(), (INT)wcslen(texout.AllocSysString()), &font, PointF(10, 10), &solidBrush); int b; b=(INT)wcslen(texout.AllocSysString())*q; SolidBrush solidBrush1(Color(255, 255, 0,0)); graphics.SetTextRenderingHint(TextRenderingHintSingleBitPerPixel); graphics.DrawString( texout.AllocSysString(),b , &font, PointF(10, 10), &solidBrush1); HDC hdcScreen=::GetDC (m_hWnd); POINT ptWinPos={rct.left,rct.top}; POINT ptSrc={0,0};
SIZE sizeWindow={rct.right - rct.left, rct.bottom - rct.top}; BOOL bRet=FALSE; bRet= UpdateLayeredWindow( m_hWnd,hdcScreen,&ptWinPos, &sizeWindow,m_hdcMemory,&ptSrc,0,&m_Blend,2); graphics.ReleaseHDC(m_hdcMemory);
::ReleaseDC(m_hWnd,hdcScreen); hdcScreen=NULL; ::ReleaseDC(m_hWnd,hdcTemp); hdcTemp=NULL; DeleteObject(hBitMap); DeleteDC(m_hdcMemory); m_hdcMemory=NULL; } /******************************************************************** 函數(shù)名稱 : OpenGeCiFile(CString filename) 函數(shù)描述 :打開歌詞文件 備注 : QQ號:940446982 VC技術(shù)QQ群:92790715歡迎加入 *********************************************************************/ void CGecikongjian::OpenGeCiFile(CString filename) { try
{ file.Open(filename,CFile::modeRead); }catch(CFileException* e) { TCHAR szBuf[256]; e->GetErrorMessage(szBuf,256,NULL); MessageBox(szBuf,_T("錯誤")); e->Delete(); } CString readstring; if(file) { if (readlen==file.GetLength()) return; int i = 0; while(file.ReadString(readstring))
{ a[i]=readstring;
i++; }
file.Close(); sum=i; } GetTimeAndGeci(); TimeAndGeciPaiXu(); YouHaGeCi(); } /******************************************************************** 函數(shù)名稱 : GetTimeAndGeci() 函數(shù)描述 : 獲取時間和時間對應(yīng)的歌詞 備注 : QQ號:940446982 VC技術(shù)QQ群:92790715歡迎加入 *********************************************************************/ void CGecikongjian::GetTimeAndGeci() { int k=0; for(int j=0;j<sum;j++) { CString strGet; int nMinute; int nSecond; TCHAR szMinute[10]; TCHAR szSecond[10]; lstrcpy(szMinute,""); lstrcpy(szSecond,""); int point=0;
point= a[j].Find(":",0); if(point==-1) { b[k]=0; c[k]=a[j]; k++; } else { //分 strGet=a[j].Left(point); strGet=strGet.Right(2); lstrcpy(szMinute,strGet); nMinute=atoi(szMinute); //秒 strGet=a[j].Right(a[j].GetLength()-point-1); if(strGet.GetLength()==1) strGet=strGet.Left(1); else if(strGet.GetLength()>=2) strGet=strGet.Left(2); lstrcpy(szSecond,strGet); nSecond=atoi(szSecond); b[k]=nMinute*60+nSecond; c[k]=a[j]; k++; point= a[j].Find(":",10); if (point!=-1) { strGet=a[j].Left(point); strGet=strGet.Right(2); lstrcpy(szMinute,strGet); nMinute=atoi(szMinute); //秒 strGet=a[j].Right(a[j].GetLength()-point-1); if(strGet.GetLength()==1) strGet=strGet.Left(1); else if(strGet.GetLength()>=2) strGet=strGet.Left(2); lstrcpy(szSecond,strGet); nSecond=atoi(szSecond); b[k]=nMinute*60+nSecond; c[k]=a[j]; k++; } } } sum1=k; }
/******************************************************************** 函數(shù)名稱 : TimeAndGeciPaiXu() 函數(shù)描述 : 對時間和時間對應(yīng)的歌詞排序 備注 : QQ號:940446982 VC技術(shù)QQ群:92790715歡迎加入 *********************************************************************/ void CGecikongjian::TimeAndGeciPaiXu() { for (int j=0;j<sum1;j++) for(int i=0;i<sum1-j;i++) if (b[i]>b[i+1]) { int t; CString s; t=b[i]; s=c[i]; b[i]=b[i+1]; c[i]=c[i+1]; b[i+1]=t; c[i+1]=s; } }
/******************************************************************** 函數(shù)名稱 : YouHaGeCi() 函數(shù)描述 : 把歌詞里沒用的符號去掉 備注 : QQ號:940446982 VC技術(shù)QQ群:92790715歡迎加入 *********************************************************************/ void CGecikongjian::YouHaGeCi() { for (int i=0;i<100;i++) { if (b[i]!=0) { DWORD o=0; DWORD j=0; DWORD h=0; j=c[i].GetLength();//獲取該行長度
o=c[i].Find("]",0);//找到"]"的位置 h=j-o-1; c[i]=c[i].Right(h);//去掉"]"前的類容 //重復(fù)一遍,因為有的行有兩個時間 j=c[i].GetLength();//獲取該行長度 o=c[i].Find("]",0);//找到"]"的位置 h=j-o-1; c[i]=c[i].Right(h);//去掉"]"前的類容 }
} } void CGecikongjian::OnTimer(UINT_PTR nIDEvent) { // TODO: 在此添加消息處理程序代碼和/或調(diào)用默認(rèn)值 if (MusicTime<1)
{ texout=c[0]+c[1]; } for (int i=0;i<100;i++)
{ if(b[i]==(MusicTime+1))
{ texout=c[i]; l=b[i+1]-b[i]; if (l<0) { l=b[i]-b[i-1]; } m=1.0/l; q=0.0; }
} q+=m; if (q>1) { q=m; } DrawGeCi(); Invalidate(); CWnd::OnTimer(nIDEvent); } |
|