xref: /MusicPlayer2/MusicPlayer2/LyricsWindow.cpp (revision e3d88825e99a4acf01a45ede12ef3910912dc454)
1b1f2b024SZhong Yang // LyricsWindow.cpp : ʵ���ļ�
2b1f2b024SZhong Yang //
3b1f2b024SZhong Yang 
4b1f2b024SZhong Yang #include "stdafx.h"
5b1f2b024SZhong Yang #include "LyricsWindow.h"
6b1f2b024SZhong Yang 
7b1f2b024SZhong Yang 
8b1f2b024SZhong Yang // CLyricsWindow
9b1f2b024SZhong Yang 
102256f4d4SZhong Yang const Gdiplus::REAL TRANSLATE_FONT_SIZE_FACTOR = 0.88f;		//��ʷ����ı���Сռ����ı���С�ı���
112256f4d4SZhong Yang 
12b1f2b024SZhong Yang IMPLEMENT_DYNAMIC(CLyricsWindow, CWnd)
13b1f2b024SZhong Yang 
14b1f2b024SZhong Yang CLyricsWindow::CLyricsWindow()
15b1f2b024SZhong Yang {
16b1f2b024SZhong Yang 	HDC hDC=::GetDC(NULL);
17b1f2b024SZhong Yang 	m_hCacheDC=::CreateCompatibleDC(hDC);
18b1f2b024SZhong Yang 	::ReleaseDC(NULL,hDC);
19b1f2b024SZhong Yang 	//---------------------------------
20b1f2b024SZhong Yang 	m_nHighlight=NULL ; //������ʵİٷֱ� 0--100
21b1f2b024SZhong Yang 	m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ
22b1f2b024SZhong Yang 	m_pTextPen=NULL ; //��ͨ��ʱ߿���
23b1f2b024SZhong Yang 	m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ
24b1f2b024SZhong Yang 	m_pHighlightPen=NULL ; //������ʱ߿���
25b1f2b024SZhong Yang 	m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ
2654359200SZhong Yang 	m_nShadowOffset=1 ; //��Ӱƫ��
27b1f2b024SZhong Yang 	m_pFont=NULL ; //GDIPlus����
28b1f2b024SZhong Yang 	m_FontStyle=NULL ;
29b1f2b024SZhong Yang 	m_FontSize=NULL ;
30b1f2b024SZhong Yang 	m_pTextFormat=NULL;
31b1f2b024SZhong Yang 	//---------------------------------
32b1f2b024SZhong Yang 	m_pFontFamily=new Gdiplus::FontFamily();
33b1f2b024SZhong Yang 	m_pTextFormat=new Gdiplus::StringFormat();
34b1f2b024SZhong Yang 	m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������
35b1f2b024SZhong Yang 	m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ
36b1f2b024SZhong Yang 	m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ
37b1f2b024SZhong Yang 	//---------------------------------
3854359200SZhong Yang 	//SetLyricsFont(L"΢���ź�", 40, Gdiplus::FontStyle::FontStyleRegular);
3954359200SZhong Yang 	//SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three);
40b1f2b024SZhong Yang 	//SetLyricsBorder(Gdiplus::Color::Black,1);
4154359200SZhong Yang 	SetLyricsShadow(Gdiplus::Color(150,0,0,0),1);
4254359200SZhong Yang 	//SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three);
43b1f2b024SZhong Yang 	//SetHighlightBorder(Gdiplus::Color::Black,1);
44b1f2b024SZhong Yang 
45b1f2b024SZhong Yang }
46b1f2b024SZhong Yang 
47b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow()
48b1f2b024SZhong Yang {
49b1f2b024SZhong Yang 	if(m_pTextPen){
50b1f2b024SZhong Yang 		delete m_pTextPen;
51b1f2b024SZhong Yang 		m_pTextPen=NULL;
52b1f2b024SZhong Yang 	}
53b1f2b024SZhong Yang 	if(m_pHighlightPen){
54b1f2b024SZhong Yang 		delete m_pHighlightPen;
55b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
56b1f2b024SZhong Yang 	}
57b1f2b024SZhong Yang 	if(m_pShadowBrush){
58b1f2b024SZhong Yang 		delete m_pShadowBrush;
59b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
60b1f2b024SZhong Yang 	}
61b1f2b024SZhong Yang 	if(m_pFontFamily){
62b1f2b024SZhong Yang 		delete m_pFontFamily;
63b1f2b024SZhong Yang 		m_pFontFamily=NULL;
64b1f2b024SZhong Yang 	}
65b1f2b024SZhong Yang 	if(m_pTextFormat){
66b1f2b024SZhong Yang 		delete m_pTextFormat;
67b1f2b024SZhong Yang 		m_pTextFormat=NULL;
68b1f2b024SZhong Yang 	}
69b1f2b024SZhong Yang 	if(m_pFont){
70b1f2b024SZhong Yang 		delete m_pFont;
71b1f2b024SZhong Yang 		m_pFont=NULL;
72b1f2b024SZhong Yang 	}
73b1f2b024SZhong Yang }
74b1f2b024SZhong Yang 
75b1f2b024SZhong Yang 
76b1f2b024SZhong Yang BEGIN_MESSAGE_MAP(CLyricsWindow, CWnd)
77b1f2b024SZhong Yang 
78b1f2b024SZhong Yang 	ON_WM_LBUTTONDOWN()
79b1f2b024SZhong Yang 	ON_WM_LBUTTONUP()
809dc20028Szhongyang     ON_WM_MOUSEMOVE()
819dc20028Szhongyang     ON_WM_MOUSEHOVER()
829dc20028Szhongyang     ON_WM_MOUSELEAVE()
83c7bf0801Szhongyang     ON_WM_SIZING()
84b1f2b024SZhong Yang END_MESSAGE_MAP()
85b1f2b024SZhong Yang 
86b1f2b024SZhong Yang 
87b1f2b024SZhong Yang 
882256f4d4SZhong Yang BOOL CLyricsWindow::Create(int nHeight)
89b1f2b024SZhong Yang {
902256f4d4SZhong Yang 	return CLyricsWindow::Create(_T("CometLyricsWindow"), -1, nHeight);
91b1f2b024SZhong Yang }
92b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName)
93b1f2b024SZhong Yang {
94b1f2b024SZhong Yang 	return CLyricsWindow::Create(lpszClassName,-1,-1);
95b1f2b024SZhong Yang }
96b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight)
97b1f2b024SZhong Yang {
98b1f2b024SZhong Yang 	if(!RegisterWndClass(lpszClassName))
99b1f2b024SZhong Yang 	{
100b1f2b024SZhong Yang 		TRACE("Class��Registration��Failedn");
101b1f2b024SZhong Yang 	}
102b1f2b024SZhong Yang 	//--------------------------------------------
103b1f2b024SZhong Yang 	//ȡ�����湤������
104b1f2b024SZhong Yang 	RECT rcWork;
105b1f2b024SZhong Yang 	SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL);
106b1f2b024SZhong Yang 	int nWorkWidth=rcWork.right-rcWork.left;
107b1f2b024SZhong Yang 	int nWorkHeight=rcWork.bottom-rcWork.top;
108b1f2b024SZhong Yang 	//δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ
109c7bf0801Szhongyang 	if(nWidth<0)nWidth=nWorkWidth*2/3;      //Ĭ�Ͽ��Ϊ�����ȵ�2/3
110b1f2b024SZhong Yang 	if(nHeight<0)nHeight=150;
111b1f2b024SZhong Yang 	//������ߡ�����λ��,�ô�������Ļ�·�
112b1f2b024SZhong Yang 	int x=rcWork.left+( (nWorkWidth-nWidth)/2 );
113b1f2b024SZhong Yang 	int y=rcWork.bottom-nHeight;
114b1f2b024SZhong Yang 	//--------------------------------------------
115c7bf0801Szhongyang 	DWORD dwStyle=WS_POPUP|WS_VISIBLE|WS_THICKFRAME;
116b1f2b024SZhong Yang 	DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED;
117b1f2b024SZhong Yang 	return CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL);
118b1f2b024SZhong Yang }
119b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName)
120b1f2b024SZhong Yang {
121b1f2b024SZhong Yang 	HINSTANCE hInstance=AfxGetInstanceHandle();
122b1f2b024SZhong Yang 	WNDCLASSEX wndcls;
123b1f2b024SZhong Yang 	memset(&wndcls,0,sizeof(WNDCLASSEX));
124b1f2b024SZhong Yang 	wndcls.cbSize=sizeof(WNDCLASSEX);
125b1f2b024SZhong Yang 	if(GetClassInfoEx(hInstance,lpszClassName,&wndcls))
126b1f2b024SZhong Yang 	{
127b1f2b024SZhong Yang 		return TRUE;
128b1f2b024SZhong Yang 	}
129b1f2b024SZhong Yang 	if(GetClassInfoEx(NULL,lpszClassName,&wndcls))
130b1f2b024SZhong Yang 	{
131b1f2b024SZhong Yang 		return TRUE;
132b1f2b024SZhong Yang 	}
133b1f2b024SZhong Yang 
134b1f2b024SZhong Yang 	wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
135b1f2b024SZhong Yang 	wndcls.lpfnWndProc=::DefWindowProc;
136b1f2b024SZhong Yang 	wndcls.hInstance=hInstance;
137b1f2b024SZhong Yang 	wndcls.hIcon=NULL;
138b1f2b024SZhong Yang 	wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);
139b1f2b024SZhong Yang 	wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
140b1f2b024SZhong Yang 	wndcls.lpszMenuName=NULL;
141b1f2b024SZhong Yang 	wndcls.lpszClassName=lpszClassName;
142b1f2b024SZhong Yang 	if(!RegisterClassEx(&wndcls))
143b1f2b024SZhong Yang 	{
144b1f2b024SZhong Yang 		return FALSE;
145b1f2b024SZhong Yang 	}
146b1f2b024SZhong Yang 	return TRUE;
147b1f2b024SZhong Yang }
148b1f2b024SZhong Yang 
149b1f2b024SZhong Yang 
150b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�)
151be1c6be2Szhongyang void CLyricsWindow::UpdateLyrics(LPCTSTR lpszLyrics,int nHighlight)
152b1f2b024SZhong Yang {
153be1c6be2Szhongyang     m_lpszLyrics = lpszLyrics;
154b1f2b024SZhong Yang     UpdateLyrics(nHighlight);
155b1f2b024SZhong Yang }
156b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�)
157b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight)
158b1f2b024SZhong Yang {
159b1f2b024SZhong Yang 	m_nHighlight=nHighlight;
160b1f2b024SZhong Yang 	if(m_nHighlight<0)
161b1f2b024SZhong Yang 		m_nHighlight=0;
162b1f2b024SZhong Yang 	if(m_nHighlight>1000)
163b1f2b024SZhong Yang 		m_nHighlight=1000;
164b1f2b024SZhong Yang 	Draw();
165b1f2b024SZhong Yang }
1662256f4d4SZhong Yang 
1672256f4d4SZhong Yang void CLyricsWindow::UpdateLyricTranslate(LPCTSTR lpszLyricTranslate)
1682256f4d4SZhong Yang {
1692256f4d4SZhong Yang 	m_strTranslate = lpszLyricTranslate;
1702256f4d4SZhong Yang }
1712256f4d4SZhong Yang 
172b1f2b024SZhong Yang //�ػ���ʴ���
173b1f2b024SZhong Yang void CLyricsWindow::Draw()
174b1f2b024SZhong Yang {
175b1f2b024SZhong Yang 	CRect rcClient;
176c7bf0801Szhongyang 	GetWindowRect(rcClient);
177b1f2b024SZhong Yang 	m_nWidth=rcClient.Width();
178b1f2b024SZhong Yang 	m_nHeight=rcClient.Height();
179b1f2b024SZhong Yang 	//----------------------------------
180b1f2b024SZhong Yang 	BITMAPINFO bitmapinfo;
181b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
182b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biBitCount = 32;
183b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biHeight = m_nHeight;
184b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biWidth = m_nWidth;
185b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biPlanes = 1;
186b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biCompression=BI_RGB;
187b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biXPelsPerMeter=0;
188b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biYPelsPerMeter=0;
189b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrUsed=0;
190b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrImportant=0;
191b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;
192b1f2b024SZhong Yang 	HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0);
193b1f2b024SZhong Yang 	HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap);
194b1f2b024SZhong Yang 	//----------------------------------
195b1f2b024SZhong Yang 	Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC);
196b1f2b024SZhong Yang 	pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias);
197b1f2b024SZhong Yang 	pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias);
19832f06d7fSZhong Yang 
19932f06d7fSZhong Yang 	//���ư�͸������
200c7bf0801Szhongyang 	if(m_bDrawBackground)
20132f06d7fSZhong Yang 	{
202c7bf0801Szhongyang         BYTE alpha = m_bHot ? 80 : 2;
203c7bf0801Szhongyang 		Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(Gdiplus::Color(alpha, 255, 255, 255));
204c7bf0801Szhongyang 		pGraphics->FillRectangle(pBrush, 0, 0, rcClient.Width(), rcClient.Height());
20532f06d7fSZhong Yang 		delete pBrush;
20632f06d7fSZhong Yang 	}
207b1f2b024SZhong Yang 	DrawLyrics(pGraphics);
208b1f2b024SZhong Yang 	delete pGraphics;
209b1f2b024SZhong Yang 	//----------------------------------
210b1f2b024SZhong Yang 	//����͸������
211b1f2b024SZhong Yang 	CPoint DestPt(0,0);
212b1f2b024SZhong Yang 	CSize psize(m_nWidth,m_nHeight);
213b1f2b024SZhong Yang 	BLENDFUNCTION blendFunc32bpp;
214b1f2b024SZhong Yang 	blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;
215b1f2b024SZhong Yang 	blendFunc32bpp.BlendFlags = 0;
216b1f2b024SZhong Yang 	blendFunc32bpp.BlendOp = AC_SRC_OVER;
217be1c6be2Szhongyang 	blendFunc32bpp.SourceConstantAlpha = m_alpha;
218b1f2b024SZhong Yang 	HDC hDC=::GetDC(m_hWnd);
219b1f2b024SZhong Yang 	::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA);
220b1f2b024SZhong Yang 	//----------------------------------
221b1f2b024SZhong Yang 	//�ͷ���Դ
222b1f2b024SZhong Yang 	::SelectObject (m_hCacheDC,hOldBitmap);
223b1f2b024SZhong Yang 	::DeleteObject(hBitmap);
224b1f2b024SZhong Yang 	::ReleaseDC(m_hWnd,hDC);
225b1f2b024SZhong Yang }
2262256f4d4SZhong Yang 
2272256f4d4SZhong Yang void CLyricsWindow::DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool bDrawTranslate)
2282256f4d4SZhong Yang {
2292256f4d4SZhong Yang 	Gdiplus::REAL fontSize = bDrawTranslate ? m_FontSize * TRANSLATE_FONT_SIZE_FACTOR : m_FontSize;
2302256f4d4SZhong Yang 	if (fontSize < 1)
2312256f4d4SZhong Yang 		fontSize = m_FontSize;
2322256f4d4SZhong Yang 
233*e3d88825Szhongyang     Gdiplus::REAL textWidth = rect.Width;
234*e3d88825Szhongyang     Gdiplus::REAL highlighWidth = rect.Width * m_nHighlight / 1000;
235*e3d88825Szhongyang     //����ı���ȴ��ڿؼ���ȣ���Ҫ���ݷָ��λ�ù����ı�
236*e3d88825Szhongyang     if (textWidth > m_nWidth)
237*e3d88825Szhongyang     {
238*e3d88825Szhongyang         //����ָ��λ�ã���ʽ��ȣ�ʣ�µĿ���Ѿ�С�ڿؼ���ȵ�һ�룬��ʱʹ�ı��Ҳ�Ϳؼ��Ҳ����
239*e3d88825Szhongyang         if (textWidth - highlighWidth < m_nWidth / 2)
240*e3d88825Szhongyang         {
241*e3d88825Szhongyang             rect.X = m_nWidth - textWidth;
242*e3d88825Szhongyang         }
243*e3d88825Szhongyang         //�ָ�λ��ʣ�µĿ�Ȼ�û�е�С�ڿؼ���ȵ�һ�룬���Ƿָ�λ�õĿ���Ѿ����ڿؼ���ȵ�һ��ʱ����Ҫ�ƶ��ı�ʹ�ָ�λ�������ڿؼ����м�
244*e3d88825Szhongyang         else if (highlighWidth > m_nWidth / 2)
245*e3d88825Szhongyang         {
246*e3d88825Szhongyang             rect.X = m_nWidth / 2 - highlighWidth;
247*e3d88825Szhongyang         }
248*e3d88825Szhongyang         //�ָ�λ�û������ؼ���ȵ�һ��ʱ��ʹ�ı����Ϳؼ�������
249*e3d88825Szhongyang         else
250*e3d88825Szhongyang         {
251*e3d88825Szhongyang             rect.X = 0;
252*e3d88825Szhongyang         }
253*e3d88825Szhongyang     }
254*e3d88825Szhongyang 
2552256f4d4SZhong Yang 	//-----------------------------------------------------------
2562256f4d4SZhong Yang 	//������Ӱ
2572256f4d4SZhong Yang 	if (m_pShadowBrush) {
2582256f4d4SZhong Yang 		Gdiplus::RectF layoutRect(0, 0, 0, 0);
2592256f4d4SZhong Yang 		layoutRect = rect;
2602256f4d4SZhong Yang 		layoutRect.X = layoutRect.X + m_nShadowOffset;
2612256f4d4SZhong Yang 		layoutRect.Y = layoutRect.Y + m_nShadowOffset;
2622256f4d4SZhong Yang 		Gdiplus::GraphicsPath* pShadowPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
2632256f4d4SZhong Yang 		pShadowPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, layoutRect, m_pTextFormat); //�����ּ���·��
2642256f4d4SZhong Yang 		pGraphics->FillPath(m_pShadowBrush, pShadowPath);//���·��
2652256f4d4SZhong Yang 		delete pShadowPath; //����·��
2662256f4d4SZhong Yang 	}
2672256f4d4SZhong Yang 
2682256f4d4SZhong Yang 	//-----------------------------------------------------------
2692256f4d4SZhong Yang 	//�������
2702256f4d4SZhong Yang 	Gdiplus::GraphicsPath* pStringPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
2712256f4d4SZhong Yang 	pStringPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, rect, m_pTextFormat); //�����ּ���·��
2722256f4d4SZhong Yang 	if (m_pTextPen) {
2732256f4d4SZhong Yang 		pGraphics->DrawPath(m_pTextPen, pStringPath);//��·��,���ֱ߿�
2742256f4d4SZhong Yang 	}
2752256f4d4SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1, m_TextColor2, rect);
2762256f4d4SZhong Yang 	pGraphics->FillPath(pBrush, pStringPath);//���·��
2772256f4d4SZhong Yang 	delete pBrush;//���ٻ�ˢ
2782256f4d4SZhong Yang 	if(!bDrawTranslate)
2792256f4d4SZhong Yang 		DrawHighlightLyrics(pGraphics, pStringPath, rect);
2802256f4d4SZhong Yang 	delete pStringPath; //����·��
2812256f4d4SZhong Yang }
2822256f4d4SZhong Yang 
283b1f2b024SZhong Yang //���Ƹ��
284b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics)
285b1f2b024SZhong Yang {
286b1f2b024SZhong Yang 	//��ȡ�����ֿ�Ⱥ͸߶�
287b1f2b024SZhong Yang 	Gdiplus::RectF layoutRect(0,0,0,0);
288b1f2b024SZhong Yang 	Gdiplus::RectF boundingBox;
289b1f2b024SZhong Yang 	pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0);
290b1f2b024SZhong Yang 	//�����ʻ�����λ��
2912256f4d4SZhong Yang 	Gdiplus::RectF dstRect;		//���ֵľ���
2922256f4d4SZhong Yang 	Gdiplus::RectF transRect;	//�����ı��ľ���
293f5ba4de7SZhong Yang 	if(m_strTranslate.IsEmpty())
294f5ba4de7SZhong Yang 	{
2952256f4d4SZhong Yang 		dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, (m_nHeight - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height);
296f5ba4de7SZhong Yang 	}
297f5ba4de7SZhong Yang 	else
2982256f4d4SZhong Yang 	{
2992256f4d4SZhong Yang 		Gdiplus::RectF transBoundingBox;
3002256f4d4SZhong Yang 		pGraphics->MeasureString(m_strTranslate, -1, m_pFont, layoutRect, m_pTextFormat, &transBoundingBox, 0, 0);
3012256f4d4SZhong Yang 		Gdiplus::REAL translateHeight = boundingBox.Height * TRANSLATE_FONT_SIZE_FACTOR;
3022256f4d4SZhong Yang 		Gdiplus::REAL maxWidth = max(boundingBox.Width, transBoundingBox.Width);
3032256f4d4SZhong Yang 		Gdiplus::REAL gapHeight = boundingBox.Height * 0.2f;	//��ʺͷ���֮��ļ�϶
3042256f4d4SZhong Yang 		Gdiplus::REAL height = boundingBox.Height + gapHeight + translateHeight;
305f5ba4de7SZhong Yang 		Gdiplus::RectF textRect((m_nWidth - maxWidth) / 2, (m_nHeight - height) / 2, maxWidth, height);
3062256f4d4SZhong Yang 		dstRect = textRect;
3072256f4d4SZhong Yang 		dstRect.Height = boundingBox.Height;
3082256f4d4SZhong Yang 		transRect = textRect;
3092256f4d4SZhong Yang 		transRect.Y += (boundingBox.Height + gapHeight);
3102256f4d4SZhong Yang 		transRect.Height = translateHeight;
3112256f4d4SZhong Yang 	}
312*e3d88825Szhongyang 	//if(dstRect.X<0)dstRect.X=0;
313*e3d88825Szhongyang 	//if(dstRect.Width>m_nWidth)dstRect.Width=m_nWidth;
314*e3d88825Szhongyang 	//if (transRect.X < 0)transRect.X = 0;
315*e3d88825Szhongyang 	//if (transRect.Width > m_nWidth)transRect.Width = m_nWidth;
316b1f2b024SZhong Yang 
3172256f4d4SZhong Yang 	DrawLyricText(pGraphics, m_lpszLyrics, dstRect, false);
3182256f4d4SZhong Yang 	if (!m_strTranslate.IsEmpty())
3192256f4d4SZhong Yang 		DrawLyricText(pGraphics, m_strTranslate, transRect, true);
320b1f2b024SZhong Yang }
321b1f2b024SZhong Yang //���Ƹ������
322b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect)
323b1f2b024SZhong Yang {
324b1f2b024SZhong Yang 	if(m_nHighlight<=0)return;
325b1f2b024SZhong Yang 	Gdiplus::Region* pRegion=NULL;
326b1f2b024SZhong Yang 	if(m_nHighlight<1000){
327b1f2b024SZhong Yang 		Gdiplus::RectF CliptRect(dstRect);
328b1f2b024SZhong Yang 		CliptRect.Width=CliptRect.Width * m_nHighlight / 1000;
329b1f2b024SZhong Yang 		pRegion=new Gdiplus::Region(CliptRect);
330b1f2b024SZhong Yang 		pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace);
331b1f2b024SZhong Yang 	}
332b1f2b024SZhong Yang 	//--------------------------------------------
333b1f2b024SZhong Yang 	if(m_pHighlightPen){
334b1f2b024SZhong Yang 		pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿�
335b1f2b024SZhong Yang 	}
336b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect);
337b1f2b024SZhong Yang 	pGraphics->FillPath (pBrush,pPath);//���·��
338b1f2b024SZhong Yang 	delete pBrush;//���ٻ�ˢ
339b1f2b024SZhong Yang 	//--------------------------------------------
340b1f2b024SZhong Yang 	if(pRegion){
341b1f2b024SZhong Yang 		pGraphics->ResetClip();
342b1f2b024SZhong Yang 		delete pRegion;
343b1f2b024SZhong Yang 	}
344b1f2b024SZhong Yang }
345b1f2b024SZhong Yang //�������仭ˢ
346b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect)
347b1f2b024SZhong Yang {
348b1f2b024SZhong Yang 	Gdiplus::PointF pt1;
349b1f2b024SZhong Yang 	Gdiplus::PointF pt2;
350b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush=NULL;
351b1f2b024SZhong Yang 	switch (TextGradientMode)
352b1f2b024SZhong Yang 	{
353b1f2b024SZhong Yang 	case LyricsGradientMode_Two://��ɫ����
354b1f2b024SZhong Yang 		{
355b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
356b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height);
357b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
358b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
359b1f2b024SZhong Yang 			break;
360b1f2b024SZhong Yang 		}
361b1f2b024SZhong Yang 
362b1f2b024SZhong Yang 	case LyricsGradientMode_Three://��ɫ����
363b1f2b024SZhong Yang 		{
364b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
365b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2);
366b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
367b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
368b1f2b024SZhong Yang 			break;
369b1f2b024SZhong Yang 		}
370b1f2b024SZhong Yang 
371b1f2b024SZhong Yang 	default://�޽���
372b1f2b024SZhong Yang 		{
373b1f2b024SZhong Yang 			pBrush=new Gdiplus::SolidBrush(Color1);
374b1f2b024SZhong Yang 			break;
375b1f2b024SZhong Yang 		}
376b1f2b024SZhong Yang 	}
377b1f2b024SZhong Yang 	return pBrush;
378b1f2b024SZhong Yang }
379b1f2b024SZhong Yang 
380b1f2b024SZhong Yang //���ø����ɫ
381b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1)
382b1f2b024SZhong Yang {
383b1f2b024SZhong Yang 	CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
384b1f2b024SZhong Yang }
385b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
386b1f2b024SZhong Yang {
387b1f2b024SZhong Yang 	m_TextColor1=TextColor1;
388b1f2b024SZhong Yang 	m_TextColor2=TextColor2;
389b1f2b024SZhong Yang 	m_TextGradientMode=TextGradientMode;
390b1f2b024SZhong Yang 
391b1f2b024SZhong Yang }
392b1f2b024SZhong Yang //���ø�ʱ߿�
393b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
394b1f2b024SZhong Yang {
395b1f2b024SZhong Yang 	if(m_pTextPen){
396b1f2b024SZhong Yang 		delete m_pTextPen;
397b1f2b024SZhong Yang 		m_pTextPen=NULL;
398b1f2b024SZhong Yang 	}
399b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
400b1f2b024SZhong Yang 		m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth);
401b1f2b024SZhong Yang }
402b1f2b024SZhong Yang //���ø��������ɫ
403b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1)
404b1f2b024SZhong Yang {
405b1f2b024SZhong Yang 	CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
406b1f2b024SZhong Yang }
407b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
408b1f2b024SZhong Yang {
409b1f2b024SZhong Yang 	m_HighlightColor1=TextColor1;
410b1f2b024SZhong Yang 	m_HighlightColor2=TextColor2;
411b1f2b024SZhong Yang 	m_HighlightGradientMode=TextGradientMode;
412b1f2b024SZhong Yang 
413b1f2b024SZhong Yang }
414b1f2b024SZhong Yang //���ø�����ʱ߿�
415b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
416b1f2b024SZhong Yang {
417b1f2b024SZhong Yang 	if(m_pHighlightPen){
418b1f2b024SZhong Yang 		delete m_pHighlightPen;
419b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
420b1f2b024SZhong Yang 	}
421b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
422b1f2b024SZhong Yang 		m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth);
423b1f2b024SZhong Yang }
424b1f2b024SZhong Yang //���ø����Ӱ
425b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset)
426b1f2b024SZhong Yang {
427b1f2b024SZhong Yang 	if(m_pShadowBrush){
428b1f2b024SZhong Yang 		delete m_pShadowBrush;
429b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
430b1f2b024SZhong Yang 	}
431b1f2b024SZhong Yang 	if(ShadowColor.GetA()>0 && nShadowOffset>0){
432b1f2b024SZhong Yang 		m_nShadowOffset=nShadowOffset;
433b1f2b024SZhong Yang 		m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor);
434b1f2b024SZhong Yang 	}else{
435b1f2b024SZhong Yang 		m_nShadowOffset=0;
436b1f2b024SZhong Yang 	}
437b1f2b024SZhong Yang }
438b1f2b024SZhong Yang //���ø������
439b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit)
440b1f2b024SZhong Yang {
441b1f2b024SZhong Yang 	if(m_pFont){
442b1f2b024SZhong Yang 		delete m_pFont;
443b1f2b024SZhong Yang 		m_pFont=NULL;
444b1f2b024SZhong Yang 	}
445b1f2b024SZhong Yang 	Gdiplus::FontFamily family(familyName,NULL);
446b1f2b024SZhong Yang 	Gdiplus::Status lastResult = family.GetLastStatus();
447b1f2b024SZhong Yang 	if (lastResult != Gdiplus::Ok)
448b1f2b024SZhong Yang 	{
449b1f2b024SZhong Yang 		HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
450b1f2b024SZhong Yang 		LOGFONTW lf;
451b1f2b024SZhong Yang 		ZeroMemory(&lf,sizeof(LOGFONTW));
452b1f2b024SZhong Yang 		GetObjectW(hFont,sizeof(LOGFONTW),&lf);
453b1f2b024SZhong Yang 		Gdiplus::FontFamily family2(lf.lfFaceName,NULL);
454b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family2,emSize,style,unit);
455b1f2b024SZhong Yang 	}else{
456b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family,emSize,style,unit);
457b1f2b024SZhong Yang 	}
458b1f2b024SZhong Yang 	 //----------------
459b1f2b024SZhong Yang 	//����һЩ��������,����·��ʱҪ�õ�
460b1f2b024SZhong Yang 	m_pFont->GetFamily (m_pFontFamily);
461b1f2b024SZhong Yang 	m_FontSize=m_pFont->GetSize ();
462b1f2b024SZhong Yang 	m_FontStyle=m_pFont->GetStyle ();
463b1f2b024SZhong Yang 
464b1f2b024SZhong Yang 
465b1f2b024SZhong Yang 
466b1f2b024SZhong Yang }
467b1f2b024SZhong Yang 
4682256f4d4SZhong Yang void CLyricsWindow::SetLyricDoubleLine(bool doubleLine)
4692256f4d4SZhong Yang {
4702256f4d4SZhong Yang 	m_bDoubleLine = doubleLine;
4712256f4d4SZhong Yang }
4722256f4d4SZhong Yang 
4732256f4d4SZhong Yang void CLyricsWindow::SetNextLyric(LPCTSTR lpszNextLyric)
4742256f4d4SZhong Yang {
4752256f4d4SZhong Yang 	m_strNextLyric = lpszNextLyric;
4762256f4d4SZhong Yang }
4772256f4d4SZhong Yang 
47832f06d7fSZhong Yang void CLyricsWindow::SetDrawBackground(bool drawBackground)
47932f06d7fSZhong Yang {
48032f06d7fSZhong Yang 	m_bDrawBackground = drawBackground;
48132f06d7fSZhong Yang }
48232f06d7fSZhong Yang 
483be1c6be2Szhongyang void CLyricsWindow::SetAlpha(int alpha)
484be1c6be2Szhongyang {
485be1c6be2Szhongyang     m_alpha = alpha;
486be1c6be2Szhongyang }
487be1c6be2Szhongyang 
488e32f802dSZhong Yang const CString& CLyricsWindow::GetLyricStr() const
489e32f802dSZhong Yang {
490e32f802dSZhong Yang     return m_lpszLyrics;
491e32f802dSZhong Yang }
492e32f802dSZhong Yang 
493b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point)
494b1f2b024SZhong Yang {
495b1f2b024SZhong Yang 	CWnd::OnLButtonDown(nFlags, point);
496b1f2b024SZhong Yang 	ReleaseCapture();
497b1f2b024SZhong Yang 	SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL);
498b1f2b024SZhong Yang }
499b1f2b024SZhong Yang 
500b1f2b024SZhong Yang void CLyricsWindow::OnLButtonUp(UINT nFlags, CPoint point)
501b1f2b024SZhong Yang {
502b1f2b024SZhong Yang 	// TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
503b1f2b024SZhong Yang 
504b1f2b024SZhong Yang 	CWnd::OnLButtonUp(nFlags, point);
505b1f2b024SZhong Yang }
5069dc20028Szhongyang 
5079dc20028Szhongyang 
5089dc20028Szhongyang void CLyricsWindow::OnMouseMove(UINT nFlags, CPoint point)
5099dc20028Szhongyang {
5109dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
5119dc20028Szhongyang     TRACKMOUSEEVENT tme;
5129dc20028Szhongyang     tme.cbSize = sizeof(tme);
5139dc20028Szhongyang     tme.hwndTrack = m_hWnd;
5149dc20028Szhongyang     tme.dwFlags = TME_LEAVE | TME_HOVER;
5159dc20028Szhongyang     tme.dwHoverTime = 1;
5169dc20028Szhongyang     _TrackMouseEvent(&tme);
5179dc20028Szhongyang 
5189dc20028Szhongyang     CWnd::OnMouseMove(nFlags, point);
5199dc20028Szhongyang }
5209dc20028Szhongyang 
5219dc20028Szhongyang 
5229dc20028Szhongyang void CLyricsWindow::OnMouseHover(UINT nFlags, CPoint point)
5239dc20028Szhongyang {
5249dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
5259dc20028Szhongyang     if (!m_bHot)
5269dc20028Szhongyang     {
5279dc20028Szhongyang         m_bHot = true;
5289dc20028Szhongyang         //Invalidate();
5299dc20028Szhongyang     }
5309dc20028Szhongyang     else
5319dc20028Szhongyang     {
5329dc20028Szhongyang         CWnd::OnMouseHover(nFlags, point);
5339dc20028Szhongyang     }
5349dc20028Szhongyang }
5359dc20028Szhongyang 
5369dc20028Szhongyang 
5379dc20028Szhongyang void CLyricsWindow::OnMouseLeave()
5389dc20028Szhongyang {
5399dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
5409dc20028Szhongyang     m_bHot = false;
5419dc20028Szhongyang     //Invalidate();
5429dc20028Szhongyang 
5439dc20028Szhongyang     CWnd::OnMouseLeave();
5449dc20028Szhongyang }
545c7bf0801Szhongyang 
546c7bf0801Szhongyang 
547c7bf0801Szhongyang void CLyricsWindow::OnSizing(UINT fwSide, LPRECT pRect)
548c7bf0801Szhongyang {
549c7bf0801Szhongyang     CWnd::OnSizing(fwSide, pRect);
550c7bf0801Szhongyang 
551c7bf0801Szhongyang     // TODO: �ڴ˴������Ϣ����������
552c7bf0801Szhongyang     m_bHot = true;
553c7bf0801Szhongyang }
554