xref: /MusicPlayer2/MusicPlayer2/LyricsWindow.cpp (revision a517e787a438bd62bd39473478edf82642d6edf7)
1b1f2b024SZhong Yang // LyricsWindow.cpp : ʵ���ļ�
2b1f2b024SZhong Yang //
3b1f2b024SZhong Yang 
4b1f2b024SZhong Yang #include "stdafx.h"
5b1f2b024SZhong Yang #include "LyricsWindow.h"
6c45e940bSzhongyang #include "Resource.h"
7b1f2b024SZhong Yang 
8b1f2b024SZhong Yang 
9b1f2b024SZhong Yang // CLyricsWindow
10b1f2b024SZhong Yang 
112256f4d4SZhong Yang const Gdiplus::REAL TRANSLATE_FONT_SIZE_FACTOR = 0.88f;		//��ʷ����ı���Сռ����ı���С�ı���
122256f4d4SZhong Yang 
13b1f2b024SZhong Yang IMPLEMENT_DYNAMIC(CLyricsWindow, CWnd)
14b1f2b024SZhong Yang 
15b1f2b024SZhong Yang CLyricsWindow::CLyricsWindow()
16b1f2b024SZhong Yang {
17b1f2b024SZhong Yang 	HDC hDC=::GetDC(NULL);
18b1f2b024SZhong Yang 	m_hCacheDC=::CreateCompatibleDC(hDC);
19b1f2b024SZhong Yang 	::ReleaseDC(NULL,hDC);
20b1f2b024SZhong Yang 	//---------------------------------
21b1f2b024SZhong Yang 	m_nHighlight=NULL ; //������ʵİٷֱ� 0--100
22b1f2b024SZhong Yang 	m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ
23b1f2b024SZhong Yang 	m_pTextPen=NULL ; //��ͨ��ʱ߿���
24b1f2b024SZhong Yang 	m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ
25b1f2b024SZhong Yang 	m_pHighlightPen=NULL ; //������ʱ߿���
26b1f2b024SZhong Yang 	m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ
2754359200SZhong Yang 	m_nShadowOffset=1 ; //��Ӱƫ��
28b1f2b024SZhong Yang 	m_pFont=NULL ; //GDIPlus����
29b1f2b024SZhong Yang 	m_FontStyle=NULL ;
30b1f2b024SZhong Yang 	m_FontSize=NULL ;
31b1f2b024SZhong Yang 	m_pTextFormat=NULL;
32b1f2b024SZhong Yang 	//---------------------------------
33b1f2b024SZhong Yang 	m_pFontFamily=new Gdiplus::FontFamily();
34b1f2b024SZhong Yang 	m_pTextFormat=new Gdiplus::StringFormat();
35b1f2b024SZhong Yang 	m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������
36b1f2b024SZhong Yang 	m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ
37b1f2b024SZhong Yang 	m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ
38b1f2b024SZhong Yang 	//---------------------------------
3954359200SZhong Yang 	//SetLyricsFont(L"΢���ź�", 40, Gdiplus::FontStyle::FontStyleRegular);
4054359200SZhong Yang 	//SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three);
41b1f2b024SZhong Yang 	//SetLyricsBorder(Gdiplus::Color::Black,1);
4254359200SZhong Yang 	SetLyricsShadow(Gdiplus::Color(150,0,0,0),1);
4354359200SZhong Yang 	//SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three);
44b1f2b024SZhong Yang 	//SetHighlightBorder(Gdiplus::Color::Black,1);
45b1f2b024SZhong Yang 
46b1f2b024SZhong Yang }
47b1f2b024SZhong Yang 
48b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow()
49b1f2b024SZhong Yang {
50b1f2b024SZhong Yang 	if(m_pTextPen){
51b1f2b024SZhong Yang 		delete m_pTextPen;
52b1f2b024SZhong Yang 		m_pTextPen=NULL;
53b1f2b024SZhong Yang 	}
54b1f2b024SZhong Yang 	if(m_pHighlightPen){
55b1f2b024SZhong Yang 		delete m_pHighlightPen;
56b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
57b1f2b024SZhong Yang 	}
58b1f2b024SZhong Yang 	if(m_pShadowBrush){
59b1f2b024SZhong Yang 		delete m_pShadowBrush;
60b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
61b1f2b024SZhong Yang 	}
62b1f2b024SZhong Yang 	if(m_pFontFamily){
63b1f2b024SZhong Yang 		delete m_pFontFamily;
64b1f2b024SZhong Yang 		m_pFontFamily=NULL;
65b1f2b024SZhong Yang 	}
66b1f2b024SZhong Yang 	if(m_pTextFormat){
67b1f2b024SZhong Yang 		delete m_pTextFormat;
68b1f2b024SZhong Yang 		m_pTextFormat=NULL;
69b1f2b024SZhong Yang 	}
70b1f2b024SZhong Yang 	if(m_pFont){
71b1f2b024SZhong Yang 		delete m_pFont;
72b1f2b024SZhong Yang 		m_pFont=NULL;
73b1f2b024SZhong Yang 	}
74b1f2b024SZhong Yang }
75b1f2b024SZhong Yang 
76b1f2b024SZhong Yang 
77b1f2b024SZhong Yang BEGIN_MESSAGE_MAP(CLyricsWindow, CWnd)
78b1f2b024SZhong Yang 	ON_WM_LBUTTONDOWN()
79b1f2b024SZhong Yang END_MESSAGE_MAP()
80b1f2b024SZhong Yang 
81b1f2b024SZhong Yang 
82b1f2b024SZhong Yang 
832256f4d4SZhong Yang BOOL CLyricsWindow::Create(int nHeight)
84b1f2b024SZhong Yang {
852256f4d4SZhong Yang 	return CLyricsWindow::Create(_T("CometLyricsWindow"), -1, nHeight);
86b1f2b024SZhong Yang }
87b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName)
88b1f2b024SZhong Yang {
89b1f2b024SZhong Yang 	return CLyricsWindow::Create(lpszClassName,-1,-1);
90b1f2b024SZhong Yang }
91b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight)
92b1f2b024SZhong Yang {
93b1f2b024SZhong Yang 	if(!RegisterWndClass(lpszClassName))
94b1f2b024SZhong Yang 	{
95b1f2b024SZhong Yang 		TRACE("Class��Registration��Failedn");
96b1f2b024SZhong Yang 	}
97c45e940bSzhongyang 
98b1f2b024SZhong Yang 	//--------------------------------------------
99b1f2b024SZhong Yang 	//ȡ�����湤������
100b1f2b024SZhong Yang 	RECT rcWork;
101b1f2b024SZhong Yang 	SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL);
102b1f2b024SZhong Yang 	int nWorkWidth=rcWork.right-rcWork.left;
103b1f2b024SZhong Yang 	int nWorkHeight=rcWork.bottom-rcWork.top;
104b1f2b024SZhong Yang 	//δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ
105c7bf0801Szhongyang 	if(nWidth<0)nWidth=nWorkWidth*2/3;      //Ĭ�Ͽ��Ϊ�����ȵ�2/3
106b1f2b024SZhong Yang 	if(nHeight<0)nHeight=150;
107b1f2b024SZhong Yang 	//������ߡ�����λ��,�ô�������Ļ�·�
108b1f2b024SZhong Yang 	int x=rcWork.left+( (nWorkWidth-nWidth)/2 );
109b1f2b024SZhong Yang 	int y=rcWork.bottom-nHeight;
110b1f2b024SZhong Yang 	//--------------------------------------------
111c7bf0801Szhongyang 	DWORD dwStyle=WS_POPUP|WS_VISIBLE|WS_THICKFRAME;
112b1f2b024SZhong Yang 	DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED;
1138735f040SZhong Yang     BOOL rtn = CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL);
114a8b024cfSZhong Yang 
1158735f040SZhong Yang     return rtn;
116b1f2b024SZhong Yang }
117b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName)
118b1f2b024SZhong Yang {
119b1f2b024SZhong Yang 	HINSTANCE hInstance=AfxGetInstanceHandle();
120b1f2b024SZhong Yang 	WNDCLASSEX wndcls;
121b1f2b024SZhong Yang 	memset(&wndcls,0,sizeof(WNDCLASSEX));
122b1f2b024SZhong Yang 	wndcls.cbSize=sizeof(WNDCLASSEX);
123b1f2b024SZhong Yang 	if(GetClassInfoEx(hInstance,lpszClassName,&wndcls))
124b1f2b024SZhong Yang 	{
125b1f2b024SZhong Yang 		return TRUE;
126b1f2b024SZhong Yang 	}
127b1f2b024SZhong Yang 	if(GetClassInfoEx(NULL,lpszClassName,&wndcls))
128b1f2b024SZhong Yang 	{
129b1f2b024SZhong Yang 		return TRUE;
130b1f2b024SZhong Yang 	}
131b1f2b024SZhong Yang 
132b1f2b024SZhong Yang 	wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
133b1f2b024SZhong Yang 	wndcls.lpfnWndProc=::DefWindowProc;
134b1f2b024SZhong Yang 	wndcls.hInstance=hInstance;
135b1f2b024SZhong Yang 	wndcls.hIcon=NULL;
136b1f2b024SZhong Yang 	wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);
137b1f2b024SZhong Yang 	wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
138b1f2b024SZhong Yang 	wndcls.lpszMenuName=NULL;
139b1f2b024SZhong Yang 	wndcls.lpszClassName=lpszClassName;
140b1f2b024SZhong Yang 	if(!RegisterClassEx(&wndcls))
141b1f2b024SZhong Yang 	{
142b1f2b024SZhong Yang 		return FALSE;
143b1f2b024SZhong Yang 	}
144b1f2b024SZhong Yang 	return TRUE;
145b1f2b024SZhong Yang }
146b1f2b024SZhong Yang 
147b1f2b024SZhong Yang 
148b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�)
149be1c6be2Szhongyang void CLyricsWindow::UpdateLyrics(LPCTSTR lpszLyrics,int nHighlight)
150b1f2b024SZhong Yang {
151be1c6be2Szhongyang     m_lpszLyrics = lpszLyrics;
152b1f2b024SZhong Yang     UpdateLyrics(nHighlight);
153b1f2b024SZhong Yang }
154b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�)
155b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight)
156b1f2b024SZhong Yang {
157b1f2b024SZhong Yang 	m_nHighlight=nHighlight;
158b1f2b024SZhong Yang 	if(m_nHighlight<0)
159b1f2b024SZhong Yang 		m_nHighlight=0;
160b1f2b024SZhong Yang 	if(m_nHighlight>1000)
161b1f2b024SZhong Yang 		m_nHighlight=1000;
162b1f2b024SZhong Yang 	Draw();
163b1f2b024SZhong Yang }
1642256f4d4SZhong Yang 
1652256f4d4SZhong Yang void CLyricsWindow::UpdateLyricTranslate(LPCTSTR lpszLyricTranslate)
1662256f4d4SZhong Yang {
1672256f4d4SZhong Yang 	m_strTranslate = lpszLyricTranslate;
1682256f4d4SZhong Yang }
1692256f4d4SZhong Yang 
170b1f2b024SZhong Yang //�ػ���ʴ���
171b1f2b024SZhong Yang void CLyricsWindow::Draw()
172b1f2b024SZhong Yang {
1738735f040SZhong Yang 	//CRect rcWindow;
1748735f040SZhong Yang 	GetWindowRect(m_rcWindow);
1758735f040SZhong Yang 	m_nWidth= m_rcWindow.Width();
1768735f040SZhong Yang 	m_nHeight= m_rcWindow.Height();
177b1f2b024SZhong Yang     CRect rcClient;
178a8b024cfSZhong Yang     GetClientRect(rcClient);
1798735f040SZhong Yang     m_frameSize.cx = (m_rcWindow.Width() - rcClient.Width()) / 2;
1808735f040SZhong Yang     m_frameSize.cy = (m_rcWindow.Height() - rcClient.Height()) / 2;
181a8b024cfSZhong Yang 
182b1f2b024SZhong Yang 	//----------------------------------
183b1f2b024SZhong Yang 	BITMAPINFO bitmapinfo;
184b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
185b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biBitCount = 32;
186b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biHeight = m_nHeight;
187b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biWidth = m_nWidth;
188b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biPlanes = 1;
189b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biCompression=BI_RGB;
190b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biXPelsPerMeter=0;
191b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biYPelsPerMeter=0;
192b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrUsed=0;
193b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrImportant=0;
194b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;
195b1f2b024SZhong Yang 	HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0);
196b1f2b024SZhong Yang 	HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap);
197b1f2b024SZhong Yang 	//----------------------------------
198b1f2b024SZhong Yang 	Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC);
199b1f2b024SZhong Yang 	pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias);
200b1f2b024SZhong Yang 	pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias);
20132f06d7fSZhong Yang 
202873885c9Szhongyang     PreDrawLyric(pGraphics);
20345faed50SZhong Yang     if (m_bDoubleLine && !m_strNextLyric.IsEmpty())
204b6d5f9dcSzhongyang         DrawLyricsDoubleLine(pGraphics);
205b6d5f9dcSzhongyang     else
206b1f2b024SZhong Yang         DrawLyrics(pGraphics);
207873885c9Szhongyang     AfterDrawLyric(pGraphics);
208b7f299bfSzhongyang 
209b1f2b024SZhong Yang 	delete pGraphics;
210b1f2b024SZhong Yang 	//----------------------------------
211b1f2b024SZhong Yang 	//����͸������
212b1f2b024SZhong Yang 	CPoint DestPt(0,0);
213b1f2b024SZhong Yang 	CSize psize(m_nWidth,m_nHeight);
214b1f2b024SZhong Yang 	BLENDFUNCTION blendFunc32bpp;
215b1f2b024SZhong Yang 	blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;
216b1f2b024SZhong Yang 	blendFunc32bpp.BlendFlags = 0;
217b1f2b024SZhong Yang 	blendFunc32bpp.BlendOp = AC_SRC_OVER;
218be1c6be2Szhongyang 	blendFunc32bpp.SourceConstantAlpha = m_alpha;
219b1f2b024SZhong Yang 	HDC hDC=::GetDC(m_hWnd);
220b1f2b024SZhong Yang 	::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA);
221b1f2b024SZhong Yang 	//----------------------------------
222b1f2b024SZhong Yang 	//�ͷ���Դ
223b1f2b024SZhong Yang 	::SelectObject (m_hCacheDC,hOldBitmap);
224b1f2b024SZhong Yang 	::DeleteObject(hBitmap);
225b1f2b024SZhong Yang 	::ReleaseDC(m_hWnd,hDC);
226b1f2b024SZhong Yang }
2272256f4d4SZhong Yang 
228b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool bDrawHighlight, bool bDrawTranslate)
2292256f4d4SZhong Yang {
2302256f4d4SZhong Yang 	Gdiplus::REAL fontSize = bDrawTranslate ? m_FontSize * TRANSLATE_FONT_SIZE_FACTOR : m_FontSize;
2312256f4d4SZhong Yang 	if (fontSize < 1)
2322256f4d4SZhong Yang 		fontSize = m_FontSize;
2332256f4d4SZhong Yang 
234e3d88825Szhongyang     Gdiplus::REAL textWidth = rect.Width;
235e3d88825Szhongyang     Gdiplus::REAL highlighWidth = rect.Width * m_nHighlight / 1000;
236b6d5f9dcSzhongyang 
237b6d5f9dcSzhongyang     if (!bDrawHighlight && !bDrawTranslate)
238b6d5f9dcSzhongyang     {
239b6d5f9dcSzhongyang         if (rect.X < 0)
240b6d5f9dcSzhongyang             rect.X = 0;
241b6d5f9dcSzhongyang     }
242b6d5f9dcSzhongyang     else
243b6d5f9dcSzhongyang     {
244e3d88825Szhongyang         //����ı���ȴ��ڿؼ���ȣ���Ҫ���ݷָ��λ�ù����ı�
245e3d88825Szhongyang         if (textWidth > m_nWidth)
246e3d88825Szhongyang         {
247e3d88825Szhongyang             //����ָ��λ�ã���ʽ��ȣ�ʣ�µĿ���Ѿ�С�ڿؼ���ȵ�һ�룬��ʱʹ�ı��Ҳ�Ϳؼ��Ҳ����
248e3d88825Szhongyang             if (textWidth - highlighWidth < m_nWidth / 2)
249e3d88825Szhongyang             {
250e3d88825Szhongyang                 rect.X = m_nWidth - textWidth;
251e3d88825Szhongyang             }
252e3d88825Szhongyang             //�ָ�λ��ʣ�µĿ�Ȼ�û�е�С�ڿؼ���ȵ�һ�룬���Ƿָ�λ�õĿ���Ѿ����ڿؼ���ȵ�һ��ʱ����Ҫ�ƶ��ı�ʹ�ָ�λ�������ڿؼ����м�
253e3d88825Szhongyang             else if (highlighWidth > m_nWidth / 2)
254e3d88825Szhongyang             {
255e3d88825Szhongyang                 rect.X = m_nWidth / 2 - highlighWidth;
256e3d88825Szhongyang             }
257e3d88825Szhongyang             //�ָ�λ�û������ؼ���ȵ�һ��ʱ��ʹ�ı����Ϳؼ�������
258e3d88825Szhongyang             else
259e3d88825Szhongyang             {
260e3d88825Szhongyang                 rect.X = 0;
261e3d88825Szhongyang             }
262e3d88825Szhongyang         }
263b6d5f9dcSzhongyang     }
264e3d88825Szhongyang 
2652256f4d4SZhong Yang 	//-----------------------------------------------------------
2662256f4d4SZhong Yang 	//������Ӱ
2672256f4d4SZhong Yang 	if (m_pShadowBrush) {
2682256f4d4SZhong Yang 		Gdiplus::RectF layoutRect(0, 0, 0, 0);
2692256f4d4SZhong Yang 		layoutRect = rect;
2702256f4d4SZhong Yang 		layoutRect.X = layoutRect.X + m_nShadowOffset;
2712256f4d4SZhong Yang 		layoutRect.Y = layoutRect.Y + m_nShadowOffset;
2722256f4d4SZhong Yang 		Gdiplus::GraphicsPath* pShadowPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
2732256f4d4SZhong Yang 		pShadowPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, layoutRect, m_pTextFormat); //�����ּ���·��
2742256f4d4SZhong Yang 		pGraphics->FillPath(m_pShadowBrush, pShadowPath);//���·��
2752256f4d4SZhong Yang 		delete pShadowPath; //����·��
2762256f4d4SZhong Yang 	}
2772256f4d4SZhong Yang 
2782256f4d4SZhong Yang 	//-----------------------------------------------------------
2792256f4d4SZhong Yang 	//�������
2802256f4d4SZhong Yang 	Gdiplus::GraphicsPath* pStringPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
2812256f4d4SZhong Yang 	pStringPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, rect, m_pTextFormat); //�����ּ���·��
2822256f4d4SZhong Yang 	if (m_pTextPen) {
2832256f4d4SZhong Yang 		pGraphics->DrawPath(m_pTextPen, pStringPath);//��·��,���ֱ߿�
2842256f4d4SZhong Yang 	}
2852256f4d4SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1, m_TextColor2, rect);
2862256f4d4SZhong Yang 	pGraphics->FillPath(pBrush, pStringPath);//���·��
2872256f4d4SZhong Yang 	delete pBrush;//���ٻ�ˢ
288b6d5f9dcSzhongyang 	if(bDrawHighlight)
2892256f4d4SZhong Yang 		DrawHighlightLyrics(pGraphics, pStringPath, rect);
2902256f4d4SZhong Yang 	delete pStringPath; //����·��
2912256f4d4SZhong Yang }
2922256f4d4SZhong Yang 
293b1f2b024SZhong Yang //���Ƹ��
294b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics)
295b1f2b024SZhong Yang {
29617b049b7Szhongyang     int lyricHeight = m_nHeight - m_toobar_height;
297b1f2b024SZhong Yang 	//��ȡ�����ֿ�Ⱥ͸߶�
298b1f2b024SZhong Yang 	Gdiplus::RectF layoutRect(0,0,0,0);
299b1f2b024SZhong Yang 	Gdiplus::RectF boundingBox;
300b1f2b024SZhong Yang 	pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0);
301b1f2b024SZhong Yang 	//�����ʻ�����λ��
3022256f4d4SZhong Yang 	Gdiplus::RectF dstRect;		//���ֵľ���
3032256f4d4SZhong Yang 	Gdiplus::RectF transRect;	//�����ı��ľ���
304b6d5f9dcSzhongyang     bool bDrawTranslate = m_bShowTranslate && !m_strTranslate.IsEmpty();
305b6d5f9dcSzhongyang 	if(!bDrawTranslate)
306f5ba4de7SZhong Yang 	{
30717b049b7Szhongyang 		dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, m_toobar_height + (lyricHeight - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height);
308f5ba4de7SZhong Yang 	}
309f5ba4de7SZhong Yang 	else
3102256f4d4SZhong Yang 	{
3112256f4d4SZhong Yang 		Gdiplus::RectF transBoundingBox;
3122256f4d4SZhong Yang 		pGraphics->MeasureString(m_strTranslate, -1, m_pFont, layoutRect, m_pTextFormat, &transBoundingBox, 0, 0);
313*a517e787Szhongyang 		Gdiplus::REAL translateHeight = transBoundingBox.Height * TRANSLATE_FONT_SIZE_FACTOR;
314*a517e787Szhongyang 		Gdiplus::REAL translateWidth = transBoundingBox.Width * TRANSLATE_FONT_SIZE_FACTOR;
3152256f4d4SZhong Yang 		Gdiplus::REAL gapHeight = boundingBox.Height * 0.2f;	//��ʺͷ���֮��ļ�϶
3162256f4d4SZhong Yang 		Gdiplus::REAL height = boundingBox.Height + gapHeight + translateHeight;
317*a517e787Szhongyang 		dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, m_toobar_height + (lyricHeight - height) / 2, boundingBox.Width, boundingBox.Height);
318*a517e787Szhongyang 		transRect = Gdiplus::RectF((m_nWidth - translateWidth) / 2, dstRect.GetBottom() + gapHeight, translateWidth, translateHeight);
3192256f4d4SZhong Yang 	}
320b1f2b024SZhong Yang 
321b6d5f9dcSzhongyang 	DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true);
322b6d5f9dcSzhongyang 	if (bDrawTranslate)
323b6d5f9dcSzhongyang 		DrawLyricText(pGraphics, m_strTranslate, transRect, false, true);
324b1f2b024SZhong Yang }
325b6d5f9dcSzhongyang 
326b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricsDoubleLine(Gdiplus::Graphics* pGraphics)
327b6d5f9dcSzhongyang {
32817b049b7Szhongyang     int lyricHeight = m_nHeight - m_toobar_height;
329b6d5f9dcSzhongyang     static bool bSwap = false;
330b6d5f9dcSzhongyang     if (m_lyricChangeFlag)      //�����ʷ����˸ı䣬������ǰ��ʺ���һ���ʵ�λ��
331b6d5f9dcSzhongyang         bSwap = !bSwap;
332b6d5f9dcSzhongyang     //��ȡ�����ֿ�Ⱥ͸߶�
333b6d5f9dcSzhongyang     Gdiplus::RectF layoutRect(0, 0, 0, 0);
334b6d5f9dcSzhongyang     Gdiplus::RectF boundingBox;
335b6d5f9dcSzhongyang     pGraphics->MeasureString(m_lpszLyrics, -1, m_pFont, layoutRect, m_pTextFormat, &boundingBox, 0, 0);
336b6d5f9dcSzhongyang     Gdiplus::RectF nextBoundingBox;
337b6d5f9dcSzhongyang     pGraphics->MeasureString(m_strNextLyric, -1, m_pFont, layoutRect, m_pTextFormat, &nextBoundingBox, 0, 0);
338b6d5f9dcSzhongyang     //�����ʻ�����λ��
339b6d5f9dcSzhongyang     Gdiplus::RectF dstRect;		//���ֵľ���
340b6d5f9dcSzhongyang     Gdiplus::RectF nextRect;	//��һ���ı��ľ���
341b6d5f9dcSzhongyang 
34217b049b7Szhongyang     dstRect = Gdiplus::RectF(0, m_toobar_height + (lyricHeight / 2 - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height);
343a8b024cfSZhong Yang     nextRect = Gdiplus::RectF(m_nWidth - nextBoundingBox.Width, dstRect.Y + lyricHeight / 2, nextBoundingBox.Width, nextBoundingBox.Height);
344b6d5f9dcSzhongyang 
345b6d5f9dcSzhongyang     if (bSwap)
346b6d5f9dcSzhongyang     {
347b6d5f9dcSzhongyang         std::swap(dstRect.Y, nextRect.Y);
348b6d5f9dcSzhongyang         nextRect.X = 0;
349b6d5f9dcSzhongyang         dstRect.X = m_nWidth - dstRect.Width;
350b6d5f9dcSzhongyang     }
351b6d5f9dcSzhongyang 
352b6d5f9dcSzhongyang     DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true);
353b6d5f9dcSzhongyang     DrawLyricText(pGraphics, m_strNextLyric, nextRect, false);
354b6d5f9dcSzhongyang }
355b6d5f9dcSzhongyang 
356b1f2b024SZhong Yang //���Ƹ������
357b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect)
358b1f2b024SZhong Yang {
359b1f2b024SZhong Yang 	if(m_nHighlight<=0)return;
360b1f2b024SZhong Yang 	Gdiplus::Region* pRegion=NULL;
361b1f2b024SZhong Yang 	if(m_nHighlight<1000){
362b1f2b024SZhong Yang 		Gdiplus::RectF CliptRect(dstRect);
363b1f2b024SZhong Yang 		CliptRect.Width=CliptRect.Width * m_nHighlight / 1000;
364b1f2b024SZhong Yang 		pRegion=new Gdiplus::Region(CliptRect);
365b1f2b024SZhong Yang 		pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace);
366b1f2b024SZhong Yang 	}
367b1f2b024SZhong Yang 	//--------------------------------------------
368b1f2b024SZhong Yang 	if(m_pHighlightPen){
369b1f2b024SZhong Yang 		pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿�
370b1f2b024SZhong Yang 	}
371b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect);
372b1f2b024SZhong Yang 	pGraphics->FillPath (pBrush,pPath);//���·��
373b1f2b024SZhong Yang 	delete pBrush;//���ٻ�ˢ
374b1f2b024SZhong Yang 	//--------------------------------------------
375b1f2b024SZhong Yang 	if(pRegion){
376b1f2b024SZhong Yang 		pGraphics->ResetClip();
377b1f2b024SZhong Yang 		delete pRegion;
378b1f2b024SZhong Yang 	}
379b1f2b024SZhong Yang }
380b7f299bfSzhongyang 
381b1f2b024SZhong Yang //�������仭ˢ
382b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect)
383b1f2b024SZhong Yang {
384b1f2b024SZhong Yang 	Gdiplus::PointF pt1;
385b1f2b024SZhong Yang 	Gdiplus::PointF pt2;
386b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush=NULL;
387b1f2b024SZhong Yang 	switch (TextGradientMode)
388b1f2b024SZhong Yang 	{
389b1f2b024SZhong Yang 	case LyricsGradientMode_Two://��ɫ����
390b1f2b024SZhong Yang 		{
391b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
392b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height);
393b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
394b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
395b1f2b024SZhong Yang 			break;
396b1f2b024SZhong Yang 		}
397b1f2b024SZhong Yang 
398b1f2b024SZhong Yang 	case LyricsGradientMode_Three://��ɫ����
399b1f2b024SZhong Yang 		{
400b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
401b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2);
402b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
403b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
404b1f2b024SZhong Yang 			break;
405b1f2b024SZhong Yang 		}
406b1f2b024SZhong Yang 
407b1f2b024SZhong Yang 	default://�޽���
408b1f2b024SZhong Yang 		{
409b1f2b024SZhong Yang 			pBrush=new Gdiplus::SolidBrush(Color1);
410b1f2b024SZhong Yang 			break;
411b1f2b024SZhong Yang 		}
412b1f2b024SZhong Yang 	}
413b1f2b024SZhong Yang 	return pBrush;
414b1f2b024SZhong Yang }
415b1f2b024SZhong Yang 
416b1f2b024SZhong Yang //���ø����ɫ
417b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1)
418b1f2b024SZhong Yang {
419b1f2b024SZhong Yang 	CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
420b1f2b024SZhong Yang }
421b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
422b1f2b024SZhong Yang {
423b1f2b024SZhong Yang 	m_TextColor1=TextColor1;
424b1f2b024SZhong Yang 	m_TextColor2=TextColor2;
425b1f2b024SZhong Yang 	m_TextGradientMode=TextGradientMode;
426b1f2b024SZhong Yang 
427b1f2b024SZhong Yang }
428b1f2b024SZhong Yang //���ø�ʱ߿�
429b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
430b1f2b024SZhong Yang {
431b1f2b024SZhong Yang 	if(m_pTextPen){
432b1f2b024SZhong Yang 		delete m_pTextPen;
433b1f2b024SZhong Yang 		m_pTextPen=NULL;
434b1f2b024SZhong Yang 	}
435b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
436b1f2b024SZhong Yang 		m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth);
437b1f2b024SZhong Yang }
438b1f2b024SZhong Yang //���ø��������ɫ
439b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1)
440b1f2b024SZhong Yang {
441b1f2b024SZhong Yang 	CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
442b1f2b024SZhong Yang }
443b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
444b1f2b024SZhong Yang {
445b1f2b024SZhong Yang 	m_HighlightColor1=TextColor1;
446b1f2b024SZhong Yang 	m_HighlightColor2=TextColor2;
447b1f2b024SZhong Yang 	m_HighlightGradientMode=TextGradientMode;
448b1f2b024SZhong Yang 
449b1f2b024SZhong Yang }
450b1f2b024SZhong Yang //���ø�����ʱ߿�
451b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
452b1f2b024SZhong Yang {
453b1f2b024SZhong Yang 	if(m_pHighlightPen){
454b1f2b024SZhong Yang 		delete m_pHighlightPen;
455b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
456b1f2b024SZhong Yang 	}
457b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
458b1f2b024SZhong Yang 		m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth);
459b1f2b024SZhong Yang }
460b1f2b024SZhong Yang //���ø����Ӱ
461b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset)
462b1f2b024SZhong Yang {
463b1f2b024SZhong Yang 	if(m_pShadowBrush){
464b1f2b024SZhong Yang 		delete m_pShadowBrush;
465b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
466b1f2b024SZhong Yang 	}
467b1f2b024SZhong Yang 	if(ShadowColor.GetA()>0 && nShadowOffset>0){
468b1f2b024SZhong Yang 		m_nShadowOffset=nShadowOffset;
469b1f2b024SZhong Yang 		m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor);
470b1f2b024SZhong Yang 	}else{
471b1f2b024SZhong Yang 		m_nShadowOffset=0;
472b1f2b024SZhong Yang 	}
473b1f2b024SZhong Yang }
474b1f2b024SZhong Yang //���ø������
475b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit)
476b1f2b024SZhong Yang {
477b1f2b024SZhong Yang 	if(m_pFont){
478b1f2b024SZhong Yang 		delete m_pFont;
479b1f2b024SZhong Yang 		m_pFont=NULL;
480b1f2b024SZhong Yang 	}
481b1f2b024SZhong Yang 	Gdiplus::FontFamily family(familyName,NULL);
482b1f2b024SZhong Yang 	Gdiplus::Status lastResult = family.GetLastStatus();
483b1f2b024SZhong Yang 	if (lastResult != Gdiplus::Ok)
484b1f2b024SZhong Yang 	{
485b1f2b024SZhong Yang 		HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
486b1f2b024SZhong Yang 		LOGFONTW lf;
487b1f2b024SZhong Yang 		ZeroMemory(&lf,sizeof(LOGFONTW));
488b1f2b024SZhong Yang 		GetObjectW(hFont,sizeof(LOGFONTW),&lf);
489b1f2b024SZhong Yang 		Gdiplus::FontFamily family2(lf.lfFaceName,NULL);
490b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family2,emSize,style,unit);
491b1f2b024SZhong Yang 	}else{
492b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family,emSize,style,unit);
493b1f2b024SZhong Yang 	}
494b1f2b024SZhong Yang 	 //----------------
495b1f2b024SZhong Yang 	//����һЩ��������,����·��ʱҪ�õ�
496b1f2b024SZhong Yang 	m_pFont->GetFamily (m_pFontFamily);
497b1f2b024SZhong Yang 	m_FontSize=m_pFont->GetSize ();
498b1f2b024SZhong Yang 	m_FontStyle=m_pFont->GetStyle ();
499b1f2b024SZhong Yang 
500b1f2b024SZhong Yang 
501b1f2b024SZhong Yang 
502b1f2b024SZhong Yang }
503b1f2b024SZhong Yang 
5042256f4d4SZhong Yang void CLyricsWindow::SetLyricDoubleLine(bool doubleLine)
5052256f4d4SZhong Yang {
5062256f4d4SZhong Yang 	m_bDoubleLine = doubleLine;
5072256f4d4SZhong Yang }
5082256f4d4SZhong Yang 
5092256f4d4SZhong Yang void CLyricsWindow::SetNextLyric(LPCTSTR lpszNextLyric)
5102256f4d4SZhong Yang {
5112256f4d4SZhong Yang 	m_strNextLyric = lpszNextLyric;
5122256f4d4SZhong Yang }
5132256f4d4SZhong Yang 
514b6d5f9dcSzhongyang void CLyricsWindow::SetShowTranslate(bool showTranslate)
515b6d5f9dcSzhongyang {
516b6d5f9dcSzhongyang     m_bShowTranslate = showTranslate;
517b6d5f9dcSzhongyang }
518b6d5f9dcSzhongyang 
519be1c6be2Szhongyang void CLyricsWindow::SetAlpha(int alpha)
520be1c6be2Szhongyang {
521be1c6be2Szhongyang     m_alpha = alpha;
522be1c6be2Szhongyang }
523be1c6be2Szhongyang 
524e32f802dSZhong Yang const CString& CLyricsWindow::GetLyricStr() const
525e32f802dSZhong Yang {
526e32f802dSZhong Yang     return m_lpszLyrics;
527e32f802dSZhong Yang }
528e32f802dSZhong Yang 
529b6d5f9dcSzhongyang void CLyricsWindow::SetLyricChangeFlag(bool bFlag)
530b6d5f9dcSzhongyang {
531b6d5f9dcSzhongyang     m_lyricChangeFlag = bFlag;
532b6d5f9dcSzhongyang }
533b6d5f9dcSzhongyang 
534b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point)
535b1f2b024SZhong Yang {
536b7f299bfSzhongyang 
537b1f2b024SZhong Yang 	CWnd::OnLButtonDown(nFlags, point);
538a8b024cfSZhong Yang 	//ReleaseCapture();
539a8b024cfSZhong Yang 	//SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL);
540b1f2b024SZhong Yang }
541b1f2b024SZhong Yang 
542