xref: /MusicPlayer2/MusicPlayer2/LyricsWindow.cpp (revision b7f299bf7797055a3f44ca7d985e16af54f9d0fe)
1b1f2b024SZhong Yang // LyricsWindow.cpp : ʵ���ļ�
2b1f2b024SZhong Yang //
3b1f2b024SZhong Yang 
4b1f2b024SZhong Yang #include "stdafx.h"
5b1f2b024SZhong Yang #include "LyricsWindow.h"
6c45e940bSzhongyang #include "Resource.h"
7c45e940bSzhongyang #include "Common.h"
87815ece2Szhongyang #include "MusicPlayer2.h"
9*b7f299bfSzhongyang #include "GdiPlusTool.h"
10b1f2b024SZhong Yang 
11b1f2b024SZhong Yang 
12b1f2b024SZhong Yang // CLyricsWindow
13b1f2b024SZhong Yang 
142256f4d4SZhong Yang const Gdiplus::REAL TRANSLATE_FONT_SIZE_FACTOR = 0.88f;		//��ʷ����ı���Сռ����ı���С�ı���
152256f4d4SZhong Yang 
16b1f2b024SZhong Yang IMPLEMENT_DYNAMIC(CLyricsWindow, CWnd)
17b1f2b024SZhong Yang 
18b1f2b024SZhong Yang CLyricsWindow::CLyricsWindow()
19b1f2b024SZhong Yang {
20b1f2b024SZhong Yang 	HDC hDC=::GetDC(NULL);
21b1f2b024SZhong Yang 	m_hCacheDC=::CreateCompatibleDC(hDC);
22b1f2b024SZhong Yang 	::ReleaseDC(NULL,hDC);
23b1f2b024SZhong Yang 	//---------------------------------
24b1f2b024SZhong Yang 	m_nHighlight=NULL ; //������ʵİٷֱ� 0--100
25b1f2b024SZhong Yang 	m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ
26b1f2b024SZhong Yang 	m_pTextPen=NULL ; //��ͨ��ʱ߿���
27b1f2b024SZhong Yang 	m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ
28b1f2b024SZhong Yang 	m_pHighlightPen=NULL ; //������ʱ߿���
29b1f2b024SZhong Yang 	m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ
3054359200SZhong Yang 	m_nShadowOffset=1 ; //��Ӱƫ��
31b1f2b024SZhong Yang 	m_pFont=NULL ; //GDIPlus����
32b1f2b024SZhong Yang 	m_FontStyle=NULL ;
33b1f2b024SZhong Yang 	m_FontSize=NULL ;
34b1f2b024SZhong Yang 	m_pTextFormat=NULL;
35b1f2b024SZhong Yang 	//---------------------------------
36b1f2b024SZhong Yang 	m_pFontFamily=new Gdiplus::FontFamily();
37b1f2b024SZhong Yang 	m_pTextFormat=new Gdiplus::StringFormat();
38b1f2b024SZhong Yang 	m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������
39b1f2b024SZhong Yang 	m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ
40b1f2b024SZhong Yang 	m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ
41b1f2b024SZhong Yang 	//---------------------------------
4254359200SZhong Yang 	//SetLyricsFont(L"΢���ź�", 40, Gdiplus::FontStyle::FontStyleRegular);
4354359200SZhong Yang 	//SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three);
44b1f2b024SZhong Yang 	//SetLyricsBorder(Gdiplus::Color::Black,1);
4554359200SZhong Yang 	SetLyricsShadow(Gdiplus::Color(150,0,0,0),1);
4654359200SZhong Yang 	//SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three);
47b1f2b024SZhong Yang 	//SetHighlightBorder(Gdiplus::Color::Black,1);
48b1f2b024SZhong Yang 
49b1f2b024SZhong Yang }
50b1f2b024SZhong Yang 
51b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow()
52b1f2b024SZhong Yang {
53b1f2b024SZhong Yang 	if(m_pTextPen){
54b1f2b024SZhong Yang 		delete m_pTextPen;
55b1f2b024SZhong Yang 		m_pTextPen=NULL;
56b1f2b024SZhong Yang 	}
57b1f2b024SZhong Yang 	if(m_pHighlightPen){
58b1f2b024SZhong Yang 		delete m_pHighlightPen;
59b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
60b1f2b024SZhong Yang 	}
61b1f2b024SZhong Yang 	if(m_pShadowBrush){
62b1f2b024SZhong Yang 		delete m_pShadowBrush;
63b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
64b1f2b024SZhong Yang 	}
65b1f2b024SZhong Yang 	if(m_pFontFamily){
66b1f2b024SZhong Yang 		delete m_pFontFamily;
67b1f2b024SZhong Yang 		m_pFontFamily=NULL;
68b1f2b024SZhong Yang 	}
69b1f2b024SZhong Yang 	if(m_pTextFormat){
70b1f2b024SZhong Yang 		delete m_pTextFormat;
71b1f2b024SZhong Yang 		m_pTextFormat=NULL;
72b1f2b024SZhong Yang 	}
73b1f2b024SZhong Yang 	if(m_pFont){
74b1f2b024SZhong Yang 		delete m_pFont;
75b1f2b024SZhong Yang 		m_pFont=NULL;
76b1f2b024SZhong Yang 	}
77b1f2b024SZhong Yang }
78b1f2b024SZhong Yang 
79b1f2b024SZhong Yang 
80b1f2b024SZhong Yang BEGIN_MESSAGE_MAP(CLyricsWindow, CWnd)
81b1f2b024SZhong Yang 
82b1f2b024SZhong Yang 	ON_WM_LBUTTONDOWN()
83b1f2b024SZhong Yang 	ON_WM_LBUTTONUP()
849dc20028Szhongyang     ON_WM_MOUSEMOVE()
859dc20028Szhongyang     ON_WM_MOUSEHOVER()
869dc20028Szhongyang     ON_WM_MOUSELEAVE()
87c7bf0801Szhongyang     ON_WM_SIZING()
88c45e940bSzhongyang     ON_WM_RBUTTONUP()
897815ece2Szhongyang     ON_WM_GETMINMAXINFO()
907815ece2Szhongyang     ON_MESSAGE(WM_INITMENU, &CLyricsWindow::OnInitmenu)
91b1f2b024SZhong Yang END_MESSAGE_MAP()
92b1f2b024SZhong Yang 
93b1f2b024SZhong Yang 
94b1f2b024SZhong Yang 
952256f4d4SZhong Yang BOOL CLyricsWindow::Create(int nHeight)
96b1f2b024SZhong Yang {
972256f4d4SZhong Yang 	return CLyricsWindow::Create(_T("CometLyricsWindow"), -1, nHeight);
98b1f2b024SZhong Yang }
99b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName)
100b1f2b024SZhong Yang {
101b1f2b024SZhong Yang 	return CLyricsWindow::Create(lpszClassName,-1,-1);
102b1f2b024SZhong Yang }
103b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight)
104b1f2b024SZhong Yang {
105b1f2b024SZhong Yang 	if(!RegisterWndClass(lpszClassName))
106b1f2b024SZhong Yang 	{
107b1f2b024SZhong Yang 		TRACE("Class��Registration��Failedn");
108b1f2b024SZhong Yang 	}
109c45e940bSzhongyang 
110c45e940bSzhongyang     m_popupMenu.LoadMenu(IDR_DESKTOP_LYRIC_POPUP_MENU);
111c45e940bSzhongyang 
112b1f2b024SZhong Yang 	//--------------------------------------------
113b1f2b024SZhong Yang 	//ȡ�����湤������
114b1f2b024SZhong Yang 	RECT rcWork;
115b1f2b024SZhong Yang 	SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL);
116b1f2b024SZhong Yang 	int nWorkWidth=rcWork.right-rcWork.left;
117b1f2b024SZhong Yang 	int nWorkHeight=rcWork.bottom-rcWork.top;
118b1f2b024SZhong Yang 	//δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ
119c7bf0801Szhongyang 	if(nWidth<0)nWidth=nWorkWidth*2/3;      //Ĭ�Ͽ��Ϊ�����ȵ�2/3
120b1f2b024SZhong Yang 	if(nHeight<0)nHeight=150;
121b1f2b024SZhong Yang 	//������ߡ�����λ��,�ô�������Ļ�·�
122b1f2b024SZhong Yang 	int x=rcWork.left+( (nWorkWidth-nWidth)/2 );
123b1f2b024SZhong Yang 	int y=rcWork.bottom-nHeight;
124b1f2b024SZhong Yang 	//--------------------------------------------
125c7bf0801Szhongyang 	DWORD dwStyle=WS_POPUP|WS_VISIBLE|WS_THICKFRAME;
126b1f2b024SZhong Yang 	DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED;
127b1f2b024SZhong Yang 	return CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL);
128b1f2b024SZhong Yang }
129b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName)
130b1f2b024SZhong Yang {
131b1f2b024SZhong Yang 	HINSTANCE hInstance=AfxGetInstanceHandle();
132b1f2b024SZhong Yang 	WNDCLASSEX wndcls;
133b1f2b024SZhong Yang 	memset(&wndcls,0,sizeof(WNDCLASSEX));
134b1f2b024SZhong Yang 	wndcls.cbSize=sizeof(WNDCLASSEX);
135b1f2b024SZhong Yang 	if(GetClassInfoEx(hInstance,lpszClassName,&wndcls))
136b1f2b024SZhong Yang 	{
137b1f2b024SZhong Yang 		return TRUE;
138b1f2b024SZhong Yang 	}
139b1f2b024SZhong Yang 	if(GetClassInfoEx(NULL,lpszClassName,&wndcls))
140b1f2b024SZhong Yang 	{
141b1f2b024SZhong Yang 		return TRUE;
142b1f2b024SZhong Yang 	}
143b1f2b024SZhong Yang 
144b1f2b024SZhong Yang 	wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
145b1f2b024SZhong Yang 	wndcls.lpfnWndProc=::DefWindowProc;
146b1f2b024SZhong Yang 	wndcls.hInstance=hInstance;
147b1f2b024SZhong Yang 	wndcls.hIcon=NULL;
148b1f2b024SZhong Yang 	wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);
149b1f2b024SZhong Yang 	wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
150b1f2b024SZhong Yang 	wndcls.lpszMenuName=NULL;
151b1f2b024SZhong Yang 	wndcls.lpszClassName=lpszClassName;
152b1f2b024SZhong Yang 	if(!RegisterClassEx(&wndcls))
153b1f2b024SZhong Yang 	{
154b1f2b024SZhong Yang 		return FALSE;
155b1f2b024SZhong Yang 	}
156b1f2b024SZhong Yang 	return TRUE;
157b1f2b024SZhong Yang }
158b1f2b024SZhong Yang 
159b1f2b024SZhong Yang 
160b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�)
161be1c6be2Szhongyang void CLyricsWindow::UpdateLyrics(LPCTSTR lpszLyrics,int nHighlight)
162b1f2b024SZhong Yang {
163be1c6be2Szhongyang     m_lpszLyrics = lpszLyrics;
164b1f2b024SZhong Yang     UpdateLyrics(nHighlight);
165b1f2b024SZhong Yang }
166b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�)
167b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight)
168b1f2b024SZhong Yang {
169b1f2b024SZhong Yang 	m_nHighlight=nHighlight;
170b1f2b024SZhong Yang 	if(m_nHighlight<0)
171b1f2b024SZhong Yang 		m_nHighlight=0;
172b1f2b024SZhong Yang 	if(m_nHighlight>1000)
173b1f2b024SZhong Yang 		m_nHighlight=1000;
174b1f2b024SZhong Yang 	Draw();
175b1f2b024SZhong Yang }
1762256f4d4SZhong Yang 
1772256f4d4SZhong Yang void CLyricsWindow::UpdateLyricTranslate(LPCTSTR lpszLyricTranslate)
1782256f4d4SZhong Yang {
1792256f4d4SZhong Yang 	m_strTranslate = lpszLyricTranslate;
1802256f4d4SZhong Yang }
1812256f4d4SZhong Yang 
182b1f2b024SZhong Yang //�ػ���ʴ���
183b1f2b024SZhong Yang void CLyricsWindow::Draw()
184b1f2b024SZhong Yang {
185b1f2b024SZhong Yang 	CRect rcClient;
186c7bf0801Szhongyang 	GetWindowRect(rcClient);
187b1f2b024SZhong Yang 	m_nWidth=rcClient.Width();
188b1f2b024SZhong Yang 	m_nHeight=rcClient.Height();
189b1f2b024SZhong Yang 	//----------------------------------
190b1f2b024SZhong Yang 	BITMAPINFO bitmapinfo;
191b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
192b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biBitCount = 32;
193b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biHeight = m_nHeight;
194b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biWidth = m_nWidth;
195b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biPlanes = 1;
196b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biCompression=BI_RGB;
197b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biXPelsPerMeter=0;
198b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biYPelsPerMeter=0;
199b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrUsed=0;
200b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrImportant=0;
201b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;
202b1f2b024SZhong Yang 	HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0);
203b1f2b024SZhong Yang 	HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap);
204b1f2b024SZhong Yang 	//----------------------------------
205b1f2b024SZhong Yang 	Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC);
206b1f2b024SZhong Yang 	pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias);
207b1f2b024SZhong Yang 	pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias);
20832f06d7fSZhong Yang 
20932f06d7fSZhong Yang 	//���ư�͸������
210c7bf0801Szhongyang 	if(m_bDrawBackground)
21132f06d7fSZhong Yang 	{
212c7bf0801Szhongyang         BYTE alpha = m_bHot ? 80 : 2;
213c7bf0801Szhongyang 		Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(Gdiplus::Color(alpha, 255, 255, 255));
214c7bf0801Szhongyang 		pGraphics->FillRectangle(pBrush, 0, 0, rcClient.Width(), rcClient.Height());
21532f06d7fSZhong Yang 		delete pBrush;
21632f06d7fSZhong Yang 	}
217b6d5f9dcSzhongyang     if (m_bDoubleLine)
218b6d5f9dcSzhongyang         DrawLyricsDoubleLine(pGraphics);
219b6d5f9dcSzhongyang     else
220b1f2b024SZhong Yang         DrawLyrics(pGraphics);
221*b7f299bfSzhongyang 
222*b7f299bfSzhongyang     //���ƹ�����
223*b7f299bfSzhongyang     if (m_bDrawBackground && m_bHot)
224*b7f299bfSzhongyang         DrawToolbar(pGraphics);
225*b7f299bfSzhongyang 
226b1f2b024SZhong Yang 	delete pGraphics;
227b1f2b024SZhong Yang 	//----------------------------------
228b1f2b024SZhong Yang 	//����͸������
229b1f2b024SZhong Yang 	CPoint DestPt(0,0);
230b1f2b024SZhong Yang 	CSize psize(m_nWidth,m_nHeight);
231b1f2b024SZhong Yang 	BLENDFUNCTION blendFunc32bpp;
232b1f2b024SZhong Yang 	blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;
233b1f2b024SZhong Yang 	blendFunc32bpp.BlendFlags = 0;
234b1f2b024SZhong Yang 	blendFunc32bpp.BlendOp = AC_SRC_OVER;
235be1c6be2Szhongyang 	blendFunc32bpp.SourceConstantAlpha = m_alpha;
236b1f2b024SZhong Yang 	HDC hDC=::GetDC(m_hWnd);
237b1f2b024SZhong Yang 	::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA);
238b1f2b024SZhong Yang 	//----------------------------------
239b1f2b024SZhong Yang 	//�ͷ���Դ
240b1f2b024SZhong Yang 	::SelectObject (m_hCacheDC,hOldBitmap);
241b1f2b024SZhong Yang 	::DeleteObject(hBitmap);
242b1f2b024SZhong Yang 	::ReleaseDC(m_hWnd,hDC);
243b1f2b024SZhong Yang }
2442256f4d4SZhong Yang 
245b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool bDrawHighlight, bool bDrawTranslate)
2462256f4d4SZhong Yang {
2472256f4d4SZhong Yang 	Gdiplus::REAL fontSize = bDrawTranslate ? m_FontSize * TRANSLATE_FONT_SIZE_FACTOR : m_FontSize;
2482256f4d4SZhong Yang 	if (fontSize < 1)
2492256f4d4SZhong Yang 		fontSize = m_FontSize;
2502256f4d4SZhong Yang 
251e3d88825Szhongyang     Gdiplus::REAL textWidth = rect.Width;
252e3d88825Szhongyang     Gdiplus::REAL highlighWidth = rect.Width * m_nHighlight / 1000;
253b6d5f9dcSzhongyang 
254b6d5f9dcSzhongyang     if (!bDrawHighlight && !bDrawTranslate)
255b6d5f9dcSzhongyang     {
256b6d5f9dcSzhongyang         if (rect.X < 0)
257b6d5f9dcSzhongyang             rect.X = 0;
258b6d5f9dcSzhongyang     }
259b6d5f9dcSzhongyang     else
260b6d5f9dcSzhongyang     {
261e3d88825Szhongyang         //����ı���ȴ��ڿؼ���ȣ���Ҫ���ݷָ��λ�ù����ı�
262e3d88825Szhongyang         if (textWidth > m_nWidth)
263e3d88825Szhongyang         {
264e3d88825Szhongyang             //����ָ��λ�ã���ʽ��ȣ�ʣ�µĿ���Ѿ�С�ڿؼ���ȵ�һ�룬��ʱʹ�ı��Ҳ�Ϳؼ��Ҳ����
265e3d88825Szhongyang             if (textWidth - highlighWidth < m_nWidth / 2)
266e3d88825Szhongyang             {
267e3d88825Szhongyang                 rect.X = m_nWidth - textWidth;
268e3d88825Szhongyang             }
269e3d88825Szhongyang             //�ָ�λ��ʣ�µĿ�Ȼ�û�е�С�ڿؼ���ȵ�һ�룬���Ƿָ�λ�õĿ���Ѿ����ڿؼ���ȵ�һ��ʱ����Ҫ�ƶ��ı�ʹ�ָ�λ�������ڿؼ����м�
270e3d88825Szhongyang             else if (highlighWidth > m_nWidth / 2)
271e3d88825Szhongyang             {
272e3d88825Szhongyang                 rect.X = m_nWidth / 2 - highlighWidth;
273e3d88825Szhongyang             }
274e3d88825Szhongyang             //�ָ�λ�û������ؼ���ȵ�һ��ʱ��ʹ�ı����Ϳؼ�������
275e3d88825Szhongyang             else
276e3d88825Szhongyang             {
277e3d88825Szhongyang                 rect.X = 0;
278e3d88825Szhongyang             }
279e3d88825Szhongyang         }
280b6d5f9dcSzhongyang     }
281e3d88825Szhongyang 
2822256f4d4SZhong Yang 	//-----------------------------------------------------------
2832256f4d4SZhong Yang 	//������Ӱ
2842256f4d4SZhong Yang 	if (m_pShadowBrush) {
2852256f4d4SZhong Yang 		Gdiplus::RectF layoutRect(0, 0, 0, 0);
2862256f4d4SZhong Yang 		layoutRect = rect;
2872256f4d4SZhong Yang 		layoutRect.X = layoutRect.X + m_nShadowOffset;
2882256f4d4SZhong Yang 		layoutRect.Y = layoutRect.Y + m_nShadowOffset;
2892256f4d4SZhong Yang 		Gdiplus::GraphicsPath* pShadowPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
2902256f4d4SZhong Yang 		pShadowPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, layoutRect, m_pTextFormat); //�����ּ���·��
2912256f4d4SZhong Yang 		pGraphics->FillPath(m_pShadowBrush, pShadowPath);//���·��
2922256f4d4SZhong Yang 		delete pShadowPath; //����·��
2932256f4d4SZhong Yang 	}
2942256f4d4SZhong Yang 
2952256f4d4SZhong Yang 	//-----------------------------------------------------------
2962256f4d4SZhong Yang 	//�������
2972256f4d4SZhong Yang 	Gdiplus::GraphicsPath* pStringPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
2982256f4d4SZhong Yang 	pStringPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, rect, m_pTextFormat); //�����ּ���·��
2992256f4d4SZhong Yang 	if (m_pTextPen) {
3002256f4d4SZhong Yang 		pGraphics->DrawPath(m_pTextPen, pStringPath);//��·��,���ֱ߿�
3012256f4d4SZhong Yang 	}
3022256f4d4SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1, m_TextColor2, rect);
3032256f4d4SZhong Yang 	pGraphics->FillPath(pBrush, pStringPath);//���·��
3042256f4d4SZhong Yang 	delete pBrush;//���ٻ�ˢ
305b6d5f9dcSzhongyang 	if(bDrawHighlight)
3062256f4d4SZhong Yang 		DrawHighlightLyrics(pGraphics, pStringPath, rect);
3072256f4d4SZhong Yang 	delete pStringPath; //����·��
3082256f4d4SZhong Yang }
3092256f4d4SZhong Yang 
310b1f2b024SZhong Yang //���Ƹ��
311b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics)
312b1f2b024SZhong Yang {
313b1f2b024SZhong Yang 	//��ȡ�����ֿ�Ⱥ͸߶�
314b1f2b024SZhong Yang 	Gdiplus::RectF layoutRect(0,0,0,0);
315b1f2b024SZhong Yang 	Gdiplus::RectF boundingBox;
316b1f2b024SZhong Yang 	pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0);
317b1f2b024SZhong Yang 	//�����ʻ�����λ��
3182256f4d4SZhong Yang 	Gdiplus::RectF dstRect;		//���ֵľ���
3192256f4d4SZhong Yang 	Gdiplus::RectF transRect;	//�����ı��ľ���
320b6d5f9dcSzhongyang     bool bDrawTranslate = m_bShowTranslate && !m_strTranslate.IsEmpty();
321b6d5f9dcSzhongyang 	if(!bDrawTranslate)
322f5ba4de7SZhong Yang 	{
3232256f4d4SZhong Yang 		dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, (m_nHeight - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height);
324f5ba4de7SZhong Yang 	}
325f5ba4de7SZhong Yang 	else
3262256f4d4SZhong Yang 	{
3272256f4d4SZhong Yang 		Gdiplus::RectF transBoundingBox;
3282256f4d4SZhong Yang 		pGraphics->MeasureString(m_strTranslate, -1, m_pFont, layoutRect, m_pTextFormat, &transBoundingBox, 0, 0);
3292256f4d4SZhong Yang 		Gdiplus::REAL translateHeight = boundingBox.Height * TRANSLATE_FONT_SIZE_FACTOR;
3302256f4d4SZhong Yang 		Gdiplus::REAL maxWidth = max(boundingBox.Width, transBoundingBox.Width);
3312256f4d4SZhong Yang 		Gdiplus::REAL gapHeight = boundingBox.Height * 0.2f;	//��ʺͷ���֮��ļ�϶
3322256f4d4SZhong Yang 		Gdiplus::REAL height = boundingBox.Height + gapHeight + translateHeight;
333f5ba4de7SZhong Yang 		Gdiplus::RectF textRect((m_nWidth - maxWidth) / 2, (m_nHeight - height) / 2, maxWidth, height);
3342256f4d4SZhong Yang 		dstRect = textRect;
3352256f4d4SZhong Yang 		dstRect.Height = boundingBox.Height;
3362256f4d4SZhong Yang 		transRect = textRect;
3372256f4d4SZhong Yang 		transRect.Y += (boundingBox.Height + gapHeight);
3382256f4d4SZhong Yang 		transRect.Height = translateHeight;
3392256f4d4SZhong Yang 	}
340b1f2b024SZhong Yang 
341b6d5f9dcSzhongyang 	DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true);
342b6d5f9dcSzhongyang 	if (bDrawTranslate)
343b6d5f9dcSzhongyang 		DrawLyricText(pGraphics, m_strTranslate, transRect, false, true);
344b1f2b024SZhong Yang }
345b6d5f9dcSzhongyang 
346b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricsDoubleLine(Gdiplus::Graphics* pGraphics)
347b6d5f9dcSzhongyang {
348b6d5f9dcSzhongyang     static bool bSwap = false;
349b6d5f9dcSzhongyang     if (m_lyricChangeFlag)      //�����ʷ����˸ı䣬������ǰ��ʺ���һ���ʵ�λ��
350b6d5f9dcSzhongyang         bSwap = !bSwap;
351b6d5f9dcSzhongyang     //��ȡ�����ֿ�Ⱥ͸߶�
352b6d5f9dcSzhongyang     Gdiplus::RectF layoutRect(0, 0, 0, 0);
353b6d5f9dcSzhongyang     Gdiplus::RectF boundingBox;
354b6d5f9dcSzhongyang     pGraphics->MeasureString(m_lpszLyrics, -1, m_pFont, layoutRect, m_pTextFormat, &boundingBox, 0, 0);
355b6d5f9dcSzhongyang     Gdiplus::RectF nextBoundingBox;
356b6d5f9dcSzhongyang     pGraphics->MeasureString(m_strNextLyric, -1, m_pFont, layoutRect, m_pTextFormat, &nextBoundingBox, 0, 0);
357b6d5f9dcSzhongyang     //�����ʻ�����λ��
358b6d5f9dcSzhongyang     Gdiplus::RectF dstRect;		//���ֵľ���
359b6d5f9dcSzhongyang     Gdiplus::RectF nextRect;	//��һ���ı��ľ���
360b6d5f9dcSzhongyang 
361b6d5f9dcSzhongyang     dstRect = Gdiplus::RectF(0, (m_nHeight / 2 - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height);
362b6d5f9dcSzhongyang     nextRect = Gdiplus::RectF(m_nWidth - nextBoundingBox.Width, dstRect.Y + m_nHeight / 2, nextBoundingBox.Width, nextBoundingBox.Height);
363b6d5f9dcSzhongyang 
364b6d5f9dcSzhongyang     if (bSwap)
365b6d5f9dcSzhongyang     {
366b6d5f9dcSzhongyang         std::swap(dstRect.Y, nextRect.Y);
367b6d5f9dcSzhongyang         nextRect.X = 0;
368b6d5f9dcSzhongyang         dstRect.X = m_nWidth - dstRect.Width;
369b6d5f9dcSzhongyang     }
370b6d5f9dcSzhongyang 
371b6d5f9dcSzhongyang     DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true);
372b6d5f9dcSzhongyang     DrawLyricText(pGraphics, m_strNextLyric, nextRect, false);
373b6d5f9dcSzhongyang }
374b6d5f9dcSzhongyang 
375b1f2b024SZhong Yang //���Ƹ������
376b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect)
377b1f2b024SZhong Yang {
378b1f2b024SZhong Yang 	if(m_nHighlight<=0)return;
379b1f2b024SZhong Yang 	Gdiplus::Region* pRegion=NULL;
380b1f2b024SZhong Yang 	if(m_nHighlight<1000){
381b1f2b024SZhong Yang 		Gdiplus::RectF CliptRect(dstRect);
382b1f2b024SZhong Yang 		CliptRect.Width=CliptRect.Width * m_nHighlight / 1000;
383b1f2b024SZhong Yang 		pRegion=new Gdiplus::Region(CliptRect);
384b1f2b024SZhong Yang 		pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace);
385b1f2b024SZhong Yang 	}
386b1f2b024SZhong Yang 	//--------------------------------------------
387b1f2b024SZhong Yang 	if(m_pHighlightPen){
388b1f2b024SZhong Yang 		pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿�
389b1f2b024SZhong Yang 	}
390b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect);
391b1f2b024SZhong Yang 	pGraphics->FillPath (pBrush,pPath);//���·��
392b1f2b024SZhong Yang 	delete pBrush;//���ٻ�ˢ
393b1f2b024SZhong Yang 	//--------------------------------------------
394b1f2b024SZhong Yang 	if(pRegion){
395b1f2b024SZhong Yang 		pGraphics->ResetClip();
396b1f2b024SZhong Yang 		delete pRegion;
397b1f2b024SZhong Yang 	}
398b1f2b024SZhong Yang }
399*b7f299bfSzhongyang 
400*b7f299bfSzhongyang void CLyricsWindow::DrawToolbar(Gdiplus::Graphics* pGraphics)
401*b7f299bfSzhongyang {
402*b7f299bfSzhongyang     const int toolbar_num = 4;
403*b7f299bfSzhongyang     const int btn_size = theApp.DPI(24);
404*b7f299bfSzhongyang     int toolbar_width = toolbar_num * btn_size;
405*b7f299bfSzhongyang     Gdiplus::Rect toolbar_rect;
406*b7f299bfSzhongyang     toolbar_rect.Y = 0;
407*b7f299bfSzhongyang     toolbar_rect.X = (m_nWidth - toolbar_width) / 2;
408*b7f299bfSzhongyang     toolbar_rect.Width = toolbar_width;
409*b7f299bfSzhongyang     toolbar_rect.Height = btn_size;
410*b7f299bfSzhongyang 
411*b7f299bfSzhongyang     //���Ʊ���
412*b7f299bfSzhongyang     Gdiplus::Color back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light3, 180);
413*b7f299bfSzhongyang     Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(back_color);
414*b7f299bfSzhongyang     pGraphics->FillRectangle(pBrush, toolbar_rect);
415*b7f299bfSzhongyang     delete pBrush;
416*b7f299bfSzhongyang 
417*b7f299bfSzhongyang     HDC hDC = pGraphics->GetHDC();
418*b7f299bfSzhongyang     CDrawCommon drawer;
419*b7f299bfSzhongyang     drawer.Create(CDC::FromHandle(hDC));
420*b7f299bfSzhongyang 
421*b7f299bfSzhongyang     //
422*b7f299bfSzhongyang     CRect rcIcon = CRect(toolbar_rect.X, toolbar_rect.Y, toolbar_rect.GetRight(), toolbar_rect.GetBottom());
423*b7f299bfSzhongyang     rcIcon.right = rcIcon.left + btn_size;
424*b7f299bfSzhongyang 
425*b7f299bfSzhongyang     DrawToolIcon(pGraphics, drawer, theApp.m_icon_set.stop_l, rcIcon, BTN_STOP);
426*b7f299bfSzhongyang     rcIcon.MoveToX(rcIcon.right);
427*b7f299bfSzhongyang     DrawToolIcon(pGraphics, drawer, theApp.m_icon_set.previous, rcIcon, BTN_PREVIOUS);
428*b7f299bfSzhongyang     rcIcon.MoveToX(rcIcon.right);
429*b7f299bfSzhongyang     IconRes hPlayPauseIcon = (CPlayer::GetInstance().IsPlaying() ? theApp.m_icon_set.pause : theApp.m_icon_set.play);
430*b7f299bfSzhongyang     DrawToolIcon(pGraphics, drawer, hPlayPauseIcon, rcIcon, BTN_PLAY_PAUSE);
431*b7f299bfSzhongyang     rcIcon.MoveToX(rcIcon.right);
432*b7f299bfSzhongyang     DrawToolIcon(pGraphics, drawer, theApp.m_icon_set.next, rcIcon, BTN_NEXT);
433*b7f299bfSzhongyang 
434*b7f299bfSzhongyang     pGraphics->ReleaseHDC(hDC);
435*b7f299bfSzhongyang }
436*b7f299bfSzhongyang 
437*b7f299bfSzhongyang void CLyricsWindow::DrawToolIcon(Gdiplus::Graphics* pGraphics, CDrawCommon& drawer, IconRes icon, CRect rect, BtnKey btn_key, bool checked)
438*b7f299bfSzhongyang {
439*b7f299bfSzhongyang     rect.DeflateRect(theApp.DPI(2), theApp.DPI(2));
440*b7f299bfSzhongyang     auto& btn = m_buttons[btn_key];
441*b7f299bfSzhongyang     btn.rect = rect;
442*b7f299bfSzhongyang 
443*b7f299bfSzhongyang     if (btn.pressed)
444*b7f299bfSzhongyang         rect.MoveToXY(rect.left + theApp.DPI(1), rect.top + theApp.DPI(1));
445*b7f299bfSzhongyang 
446*b7f299bfSzhongyang     Gdiplus::Color back_color;
447*b7f299bfSzhongyang     if (btn.pressed && btn.hover)
448*b7f299bfSzhongyang         back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.dark1, 160);
449*b7f299bfSzhongyang     else if (btn.hover)
450*b7f299bfSzhongyang         back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light1, 160);
451*b7f299bfSzhongyang     else if(checked)
452*b7f299bfSzhongyang         back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light2, 160);
453*b7f299bfSzhongyang     Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(back_color);
454*b7f299bfSzhongyang     pGraphics->FillRectangle(pBrush, rect.left, rect.top, rect.Width(), rect.Height());
455*b7f299bfSzhongyang     delete pBrush;
456*b7f299bfSzhongyang 
457*b7f299bfSzhongyang     //drawer.GetDC()->FillSolidRect(rect, theApp.m_app_setting_data.theme_color.light1);
458*b7f299bfSzhongyang 
459*b7f299bfSzhongyang     CRect rc_tmp = rect;
460*b7f299bfSzhongyang     //ʹͼ���ھ����о���
461*b7f299bfSzhongyang     CSize icon_size = icon.GetSize(theApp.m_ui_data.full_screen);
462*b7f299bfSzhongyang     rc_tmp.left = rect.left + (rect.Width() - icon_size.cx) / 2;
463*b7f299bfSzhongyang     rc_tmp.top = rect.top + (rect.Height() - icon_size.cy) / 2;
464*b7f299bfSzhongyang     rc_tmp.right = rc_tmp.left + icon_size.cx;
465*b7f299bfSzhongyang     rc_tmp.bottom = rc_tmp.top + icon_size.cy;
466*b7f299bfSzhongyang 
467*b7f299bfSzhongyang     drawer.DrawIcon(icon.GetIcon(), rc_tmp.TopLeft(), rc_tmp.Size());
468*b7f299bfSzhongyang }
469*b7f299bfSzhongyang 
470b1f2b024SZhong Yang //�������仭ˢ
471b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect)
472b1f2b024SZhong Yang {
473b1f2b024SZhong Yang 	Gdiplus::PointF pt1;
474b1f2b024SZhong Yang 	Gdiplus::PointF pt2;
475b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush=NULL;
476b1f2b024SZhong Yang 	switch (TextGradientMode)
477b1f2b024SZhong Yang 	{
478b1f2b024SZhong Yang 	case LyricsGradientMode_Two://��ɫ����
479b1f2b024SZhong Yang 		{
480b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
481b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height);
482b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
483b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
484b1f2b024SZhong Yang 			break;
485b1f2b024SZhong Yang 		}
486b1f2b024SZhong Yang 
487b1f2b024SZhong Yang 	case LyricsGradientMode_Three://��ɫ����
488b1f2b024SZhong Yang 		{
489b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
490b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2);
491b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
492b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
493b1f2b024SZhong Yang 			break;
494b1f2b024SZhong Yang 		}
495b1f2b024SZhong Yang 
496b1f2b024SZhong Yang 	default://�޽���
497b1f2b024SZhong Yang 		{
498b1f2b024SZhong Yang 			pBrush=new Gdiplus::SolidBrush(Color1);
499b1f2b024SZhong Yang 			break;
500b1f2b024SZhong Yang 		}
501b1f2b024SZhong Yang 	}
502b1f2b024SZhong Yang 	return pBrush;
503b1f2b024SZhong Yang }
504b1f2b024SZhong Yang 
505b1f2b024SZhong Yang //���ø����ɫ
506b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1)
507b1f2b024SZhong Yang {
508b1f2b024SZhong Yang 	CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
509b1f2b024SZhong Yang }
510b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
511b1f2b024SZhong Yang {
512b1f2b024SZhong Yang 	m_TextColor1=TextColor1;
513b1f2b024SZhong Yang 	m_TextColor2=TextColor2;
514b1f2b024SZhong Yang 	m_TextGradientMode=TextGradientMode;
515b1f2b024SZhong Yang 
516b1f2b024SZhong Yang }
517b1f2b024SZhong Yang //���ø�ʱ߿�
518b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
519b1f2b024SZhong Yang {
520b1f2b024SZhong Yang 	if(m_pTextPen){
521b1f2b024SZhong Yang 		delete m_pTextPen;
522b1f2b024SZhong Yang 		m_pTextPen=NULL;
523b1f2b024SZhong Yang 	}
524b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
525b1f2b024SZhong Yang 		m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth);
526b1f2b024SZhong Yang }
527b1f2b024SZhong Yang //���ø��������ɫ
528b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1)
529b1f2b024SZhong Yang {
530b1f2b024SZhong Yang 	CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
531b1f2b024SZhong Yang }
532b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
533b1f2b024SZhong Yang {
534b1f2b024SZhong Yang 	m_HighlightColor1=TextColor1;
535b1f2b024SZhong Yang 	m_HighlightColor2=TextColor2;
536b1f2b024SZhong Yang 	m_HighlightGradientMode=TextGradientMode;
537b1f2b024SZhong Yang 
538b1f2b024SZhong Yang }
539b1f2b024SZhong Yang //���ø�����ʱ߿�
540b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
541b1f2b024SZhong Yang {
542b1f2b024SZhong Yang 	if(m_pHighlightPen){
543b1f2b024SZhong Yang 		delete m_pHighlightPen;
544b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
545b1f2b024SZhong Yang 	}
546b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
547b1f2b024SZhong Yang 		m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth);
548b1f2b024SZhong Yang }
549b1f2b024SZhong Yang //���ø����Ӱ
550b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset)
551b1f2b024SZhong Yang {
552b1f2b024SZhong Yang 	if(m_pShadowBrush){
553b1f2b024SZhong Yang 		delete m_pShadowBrush;
554b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
555b1f2b024SZhong Yang 	}
556b1f2b024SZhong Yang 	if(ShadowColor.GetA()>0 && nShadowOffset>0){
557b1f2b024SZhong Yang 		m_nShadowOffset=nShadowOffset;
558b1f2b024SZhong Yang 		m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor);
559b1f2b024SZhong Yang 	}else{
560b1f2b024SZhong Yang 		m_nShadowOffset=0;
561b1f2b024SZhong Yang 	}
562b1f2b024SZhong Yang }
563b1f2b024SZhong Yang //���ø������
564b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit)
565b1f2b024SZhong Yang {
566b1f2b024SZhong Yang 	if(m_pFont){
567b1f2b024SZhong Yang 		delete m_pFont;
568b1f2b024SZhong Yang 		m_pFont=NULL;
569b1f2b024SZhong Yang 	}
570b1f2b024SZhong Yang 	Gdiplus::FontFamily family(familyName,NULL);
571b1f2b024SZhong Yang 	Gdiplus::Status lastResult = family.GetLastStatus();
572b1f2b024SZhong Yang 	if (lastResult != Gdiplus::Ok)
573b1f2b024SZhong Yang 	{
574b1f2b024SZhong Yang 		HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
575b1f2b024SZhong Yang 		LOGFONTW lf;
576b1f2b024SZhong Yang 		ZeroMemory(&lf,sizeof(LOGFONTW));
577b1f2b024SZhong Yang 		GetObjectW(hFont,sizeof(LOGFONTW),&lf);
578b1f2b024SZhong Yang 		Gdiplus::FontFamily family2(lf.lfFaceName,NULL);
579b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family2,emSize,style,unit);
580b1f2b024SZhong Yang 	}else{
581b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family,emSize,style,unit);
582b1f2b024SZhong Yang 	}
583b1f2b024SZhong Yang 	 //----------------
584b1f2b024SZhong Yang 	//����һЩ��������,����·��ʱҪ�õ�
585b1f2b024SZhong Yang 	m_pFont->GetFamily (m_pFontFamily);
586b1f2b024SZhong Yang 	m_FontSize=m_pFont->GetSize ();
587b1f2b024SZhong Yang 	m_FontStyle=m_pFont->GetStyle ();
588b1f2b024SZhong Yang 
589b1f2b024SZhong Yang 
590b1f2b024SZhong Yang 
591b1f2b024SZhong Yang }
592b1f2b024SZhong Yang 
5932256f4d4SZhong Yang void CLyricsWindow::SetLyricDoubleLine(bool doubleLine)
5942256f4d4SZhong Yang {
5952256f4d4SZhong Yang 	m_bDoubleLine = doubleLine;
5962256f4d4SZhong Yang }
5972256f4d4SZhong Yang 
5982256f4d4SZhong Yang void CLyricsWindow::SetNextLyric(LPCTSTR lpszNextLyric)
5992256f4d4SZhong Yang {
6002256f4d4SZhong Yang 	m_strNextLyric = lpszNextLyric;
6012256f4d4SZhong Yang }
6022256f4d4SZhong Yang 
60332f06d7fSZhong Yang void CLyricsWindow::SetDrawBackground(bool drawBackground)
60432f06d7fSZhong Yang {
60532f06d7fSZhong Yang 	m_bDrawBackground = drawBackground;
60632f06d7fSZhong Yang }
60732f06d7fSZhong Yang 
608b6d5f9dcSzhongyang void CLyricsWindow::SetShowTranslate(bool showTranslate)
609b6d5f9dcSzhongyang {
610b6d5f9dcSzhongyang     m_bShowTranslate = showTranslate;
611b6d5f9dcSzhongyang }
612b6d5f9dcSzhongyang 
613be1c6be2Szhongyang void CLyricsWindow::SetAlpha(int alpha)
614be1c6be2Szhongyang {
615be1c6be2Szhongyang     m_alpha = alpha;
616be1c6be2Szhongyang }
617be1c6be2Szhongyang 
618e32f802dSZhong Yang const CString& CLyricsWindow::GetLyricStr() const
619e32f802dSZhong Yang {
620e32f802dSZhong Yang     return m_lpszLyrics;
621e32f802dSZhong Yang }
622e32f802dSZhong Yang 
623b6d5f9dcSzhongyang void CLyricsWindow::SetLyricChangeFlag(bool bFlag)
624b6d5f9dcSzhongyang {
625b6d5f9dcSzhongyang     m_lyricChangeFlag = bFlag;
626b6d5f9dcSzhongyang }
627b6d5f9dcSzhongyang 
628b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point)
629b1f2b024SZhong Yang {
630*b7f299bfSzhongyang     for (auto& btn : m_buttons)
631*b7f299bfSzhongyang     {
632*b7f299bfSzhongyang         if (btn.second.rect.PtInRect(point) != FALSE)
633*b7f299bfSzhongyang             btn.second.pressed = true;
634*b7f299bfSzhongyang     }
635*b7f299bfSzhongyang 
636b1f2b024SZhong Yang 	CWnd::OnLButtonDown(nFlags, point);
637b1f2b024SZhong Yang 	ReleaseCapture();
638b1f2b024SZhong Yang 	SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL);
639b1f2b024SZhong Yang }
640b1f2b024SZhong Yang 
641b1f2b024SZhong Yang void CLyricsWindow::OnLButtonUp(UINT nFlags, CPoint point)
642b1f2b024SZhong Yang {
643b1f2b024SZhong Yang 	// TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
644*b7f299bfSzhongyang     for (auto& btn : m_buttons)
645*b7f299bfSzhongyang     {
646*b7f299bfSzhongyang         btn.second.pressed = false;
647*b7f299bfSzhongyang     }
648b1f2b024SZhong Yang 	CWnd::OnLButtonUp(nFlags, point);
649b1f2b024SZhong Yang }
6509dc20028Szhongyang 
6519dc20028Szhongyang 
6529dc20028Szhongyang void CLyricsWindow::OnMouseMove(UINT nFlags, CPoint point)
6539dc20028Szhongyang {
6549dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
655*b7f299bfSzhongyang     for (auto& btn : m_buttons)
656*b7f299bfSzhongyang     {
657*b7f299bfSzhongyang         btn.second.hover = (btn.second.rect.PtInRect(point) != FALSE);
658*b7f299bfSzhongyang     }
659*b7f299bfSzhongyang 
6609dc20028Szhongyang     TRACKMOUSEEVENT tme;
6619dc20028Szhongyang     tme.cbSize = sizeof(tme);
6629dc20028Szhongyang     tme.hwndTrack = m_hWnd;
6639dc20028Szhongyang     tme.dwFlags = TME_LEAVE | TME_HOVER;
6649dc20028Szhongyang     tme.dwHoverTime = 1;
6659dc20028Szhongyang     _TrackMouseEvent(&tme);
6669dc20028Szhongyang 
6679dc20028Szhongyang     CWnd::OnMouseMove(nFlags, point);
6689dc20028Szhongyang }
6699dc20028Szhongyang 
6709dc20028Szhongyang 
6719dc20028Szhongyang void CLyricsWindow::OnMouseHover(UINT nFlags, CPoint point)
6729dc20028Szhongyang {
6739dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
6749dc20028Szhongyang     if (!m_bHot)
6759dc20028Szhongyang     {
6769dc20028Szhongyang         m_bHot = true;
6779dc20028Szhongyang         //Invalidate();
6789dc20028Szhongyang     }
6799dc20028Szhongyang     else
6809dc20028Szhongyang     {
6819dc20028Szhongyang         CWnd::OnMouseHover(nFlags, point);
6829dc20028Szhongyang     }
6839dc20028Szhongyang }
6849dc20028Szhongyang 
6859dc20028Szhongyang 
6869dc20028Szhongyang void CLyricsWindow::OnMouseLeave()
6879dc20028Szhongyang {
6889dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
6899dc20028Szhongyang     m_bHot = false;
6909dc20028Szhongyang     //Invalidate();
6919dc20028Szhongyang 
6929dc20028Szhongyang     CWnd::OnMouseLeave();
6939dc20028Szhongyang }
694c7bf0801Szhongyang 
695c7bf0801Szhongyang 
696c7bf0801Szhongyang void CLyricsWindow::OnSizing(UINT fwSide, LPRECT pRect)
697c7bf0801Szhongyang {
698c7bf0801Szhongyang     CWnd::OnSizing(fwSide, pRect);
699c7bf0801Szhongyang 
700c7bf0801Szhongyang     // TODO: �ڴ˴������Ϣ����������
701c7bf0801Szhongyang     m_bHot = true;
702c7bf0801Szhongyang }
703c45e940bSzhongyang 
704c45e940bSzhongyang 
705c45e940bSzhongyang void CLyricsWindow::OnRButtonUp(UINT nFlags, CPoint point)
706c45e940bSzhongyang {
707c45e940bSzhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
708c45e940bSzhongyang     CPoint point1;		//����һ������ȷ�����λ�õ�λ��
709c45e940bSzhongyang     GetCursorPos(&point1);	//��ȡ��ǰ����λ�ã��Ա�ʹ�ò˵����Ը����꣬��λ������Ļ���Ͻǵ�Ϊԭ�㣬point���Կͻ������Ͻ�Ϊԭ��
710c45e940bSzhongyang     CMenu* pMenu = m_popupMenu.GetSubMenu(0);
711c45e940bSzhongyang     if (pMenu != NULL)
712c45e940bSzhongyang         pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this);
713c45e940bSzhongyang 
714c45e940bSzhongyang     //CWnd::OnRButtonUp(nFlags, point);
715c45e940bSzhongyang }
716c45e940bSzhongyang 
717c45e940bSzhongyang 
718c45e940bSzhongyang BOOL CLyricsWindow::OnCommand(WPARAM wParam, LPARAM lParam)
719c45e940bSzhongyang {
720c45e940bSzhongyang     // TODO: �ڴ����ר�ô����/����û���
721c45e940bSzhongyang     if (CCommon::IsMenuItemInMenu(m_popupMenu.GetSubMenu(0), wParam))
722c45e940bSzhongyang         AfxGetMainWnd()->SendMessage(WM_COMMAND, wParam, lParam);		//���˵�����ת����������
723c45e940bSzhongyang 
724c45e940bSzhongyang     return CWnd::OnCommand(wParam, lParam);
725c45e940bSzhongyang }
7267815ece2Szhongyang 
7277815ece2Szhongyang 
7287815ece2Szhongyang void CLyricsWindow::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
7297815ece2Szhongyang {
7307815ece2Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
7317815ece2Szhongyang     lpMMI->ptMinTrackSize.x = theApp.DPI(400);
7327815ece2Szhongyang     lpMMI->ptMinTrackSize.y = theApp.DPI(100);
7337815ece2Szhongyang 
7347815ece2Szhongyang     CWnd::OnGetMinMaxInfo(lpMMI);
7357815ece2Szhongyang }
7367815ece2Szhongyang 
7377815ece2Szhongyang 
7387815ece2Szhongyang afx_msg LRESULT CLyricsWindow::OnInitmenu(WPARAM wParam, LPARAM lParam)
7397815ece2Szhongyang {
7407815ece2Szhongyang     AfxGetMainWnd()->SendMessage(WM_INITMENU, wParam, lParam);        //��WM_INITMENU��Ϣת����������
7417815ece2Szhongyang     return 0;
7427815ece2Szhongyang }
743