xref: /MusicPlayer2/MusicPlayer2/LyricsWindow.cpp (revision 8735f0405da69978e43983251b6e540ea7513e90)
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"
9b7f299bfSzhongyang #include "GdiPlusTool.h"
10b1f2b024SZhong Yang 
11b1f2b024SZhong Yang 
12b1f2b024SZhong Yang // CLyricsWindow
13b1f2b024SZhong Yang 
142256f4d4SZhong Yang const Gdiplus::REAL TRANSLATE_FONT_SIZE_FACTOR = 0.88f;		//��ʷ����ı���Сռ����ı���С�ı���
15a8b024cfSZhong Yang const int TOOL_ICON_SIZE = 24;
162256f4d4SZhong Yang 
17b1f2b024SZhong Yang IMPLEMENT_DYNAMIC(CLyricsWindow, CWnd)
18b1f2b024SZhong Yang 
19b1f2b024SZhong Yang CLyricsWindow::CLyricsWindow()
20b1f2b024SZhong Yang {
21b1f2b024SZhong Yang 	HDC hDC=::GetDC(NULL);
22b1f2b024SZhong Yang 	m_hCacheDC=::CreateCompatibleDC(hDC);
23b1f2b024SZhong Yang 	::ReleaseDC(NULL,hDC);
24b1f2b024SZhong Yang 	//---------------------------------
25b1f2b024SZhong Yang 	m_nHighlight=NULL ; //������ʵİٷֱ� 0--100
26b1f2b024SZhong Yang 	m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ
27b1f2b024SZhong Yang 	m_pTextPen=NULL ; //��ͨ��ʱ߿���
28b1f2b024SZhong Yang 	m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ
29b1f2b024SZhong Yang 	m_pHighlightPen=NULL ; //������ʱ߿���
30b1f2b024SZhong Yang 	m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ
3154359200SZhong Yang 	m_nShadowOffset=1 ; //��Ӱƫ��
32b1f2b024SZhong Yang 	m_pFont=NULL ; //GDIPlus����
33b1f2b024SZhong Yang 	m_FontStyle=NULL ;
34b1f2b024SZhong Yang 	m_FontSize=NULL ;
35b1f2b024SZhong Yang 	m_pTextFormat=NULL;
36b1f2b024SZhong Yang 	//---------------------------------
37b1f2b024SZhong Yang 	m_pFontFamily=new Gdiplus::FontFamily();
38b1f2b024SZhong Yang 	m_pTextFormat=new Gdiplus::StringFormat();
39b1f2b024SZhong Yang 	m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������
40b1f2b024SZhong Yang 	m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ
41b1f2b024SZhong Yang 	m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ
42b1f2b024SZhong Yang 	//---------------------------------
4354359200SZhong Yang 	//SetLyricsFont(L"΢���ź�", 40, Gdiplus::FontStyle::FontStyleRegular);
4454359200SZhong Yang 	//SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three);
45b1f2b024SZhong Yang 	//SetLyricsBorder(Gdiplus::Color::Black,1);
4654359200SZhong Yang 	SetLyricsShadow(Gdiplus::Color(150,0,0,0),1);
4754359200SZhong Yang 	//SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three);
48b1f2b024SZhong Yang 	//SetHighlightBorder(Gdiplus::Color::Black,1);
49b1f2b024SZhong Yang 
50b1f2b024SZhong Yang }
51b1f2b024SZhong Yang 
52b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow()
53b1f2b024SZhong Yang {
54b1f2b024SZhong Yang 	if(m_pTextPen){
55b1f2b024SZhong Yang 		delete m_pTextPen;
56b1f2b024SZhong Yang 		m_pTextPen=NULL;
57b1f2b024SZhong Yang 	}
58b1f2b024SZhong Yang 	if(m_pHighlightPen){
59b1f2b024SZhong Yang 		delete m_pHighlightPen;
60b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
61b1f2b024SZhong Yang 	}
62b1f2b024SZhong Yang 	if(m_pShadowBrush){
63b1f2b024SZhong Yang 		delete m_pShadowBrush;
64b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
65b1f2b024SZhong Yang 	}
66b1f2b024SZhong Yang 	if(m_pFontFamily){
67b1f2b024SZhong Yang 		delete m_pFontFamily;
68b1f2b024SZhong Yang 		m_pFontFamily=NULL;
69b1f2b024SZhong Yang 	}
70b1f2b024SZhong Yang 	if(m_pTextFormat){
71b1f2b024SZhong Yang 		delete m_pTextFormat;
72b1f2b024SZhong Yang 		m_pTextFormat=NULL;
73b1f2b024SZhong Yang 	}
74b1f2b024SZhong Yang 	if(m_pFont){
75b1f2b024SZhong Yang 		delete m_pFont;
76b1f2b024SZhong Yang 		m_pFont=NULL;
77b1f2b024SZhong Yang 	}
78b1f2b024SZhong Yang }
79b1f2b024SZhong Yang 
80b1f2b024SZhong Yang 
81b1f2b024SZhong Yang BEGIN_MESSAGE_MAP(CLyricsWindow, CWnd)
82b1f2b024SZhong Yang 
83b1f2b024SZhong Yang 	ON_WM_LBUTTONDOWN()
84b1f2b024SZhong Yang 	ON_WM_LBUTTONUP()
859dc20028Szhongyang     ON_WM_MOUSEMOVE()
869dc20028Szhongyang     ON_WM_MOUSEHOVER()
879dc20028Szhongyang     ON_WM_MOUSELEAVE()
88c7bf0801Szhongyang     ON_WM_SIZING()
89c45e940bSzhongyang     ON_WM_RBUTTONUP()
907815ece2Szhongyang     ON_WM_GETMINMAXINFO()
917815ece2Szhongyang     ON_MESSAGE(WM_INITMENU, &CLyricsWindow::OnInitmenu)
92*8735f040SZhong Yang     ON_WM_TIMER()
93b1f2b024SZhong Yang END_MESSAGE_MAP()
94b1f2b024SZhong Yang 
95b1f2b024SZhong Yang 
96b1f2b024SZhong Yang 
972256f4d4SZhong Yang BOOL CLyricsWindow::Create(int nHeight)
98b1f2b024SZhong Yang {
992256f4d4SZhong Yang 	return CLyricsWindow::Create(_T("CometLyricsWindow"), -1, nHeight);
100b1f2b024SZhong Yang }
101b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName)
102b1f2b024SZhong Yang {
103b1f2b024SZhong Yang 	return CLyricsWindow::Create(lpszClassName,-1,-1);
104b1f2b024SZhong Yang }
105b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight)
106b1f2b024SZhong Yang {
107b1f2b024SZhong Yang 	if(!RegisterWndClass(lpszClassName))
108b1f2b024SZhong Yang 	{
109b1f2b024SZhong Yang 		TRACE("Class��Registration��Failedn");
110b1f2b024SZhong Yang 	}
111c45e940bSzhongyang 
112c45e940bSzhongyang     m_popupMenu.LoadMenu(IDR_DESKTOP_LYRIC_POPUP_MENU);
113c45e940bSzhongyang 
114b1f2b024SZhong Yang 	//--------------------------------------------
115b1f2b024SZhong Yang 	//ȡ�����湤������
116b1f2b024SZhong Yang 	RECT rcWork;
117b1f2b024SZhong Yang 	SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL);
118b1f2b024SZhong Yang 	int nWorkWidth=rcWork.right-rcWork.left;
119b1f2b024SZhong Yang 	int nWorkHeight=rcWork.bottom-rcWork.top;
120b1f2b024SZhong Yang 	//δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ
121c7bf0801Szhongyang 	if(nWidth<0)nWidth=nWorkWidth*2/3;      //Ĭ�Ͽ��Ϊ�����ȵ�2/3
122b1f2b024SZhong Yang 	if(nHeight<0)nHeight=150;
123b1f2b024SZhong Yang 	//������ߡ�����λ��,�ô�������Ļ�·�
124b1f2b024SZhong Yang 	int x=rcWork.left+( (nWorkWidth-nWidth)/2 );
125b1f2b024SZhong Yang 	int y=rcWork.bottom-nHeight;
126b1f2b024SZhong Yang 	//--------------------------------------------
127c7bf0801Szhongyang 	DWORD dwStyle=WS_POPUP|WS_VISIBLE|WS_THICKFRAME;
128b1f2b024SZhong Yang 	DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED;
129*8735f040SZhong Yang     BOOL rtn = CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL);
130a8b024cfSZhong Yang 
131a8b024cfSZhong Yang     //��ʼ����ʾ��Ϣ
132a8b024cfSZhong Yang     m_tool_tip.Create(this, TTS_ALWAYSTIP);
133a8b024cfSZhong Yang     m_tool_tip.SetMaxTipWidth(theApp.DPI(400));
134a8b024cfSZhong Yang 
135*8735f040SZhong Yang     //��ʼ����ʱ��
136*8735f040SZhong Yang     SetTimer(TIMER_DESKTOP_LYRIC, 200, NULL);
137*8735f040SZhong Yang 
138*8735f040SZhong Yang     return rtn;
139b1f2b024SZhong Yang }
140b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName)
141b1f2b024SZhong Yang {
142b1f2b024SZhong Yang 	HINSTANCE hInstance=AfxGetInstanceHandle();
143b1f2b024SZhong Yang 	WNDCLASSEX wndcls;
144b1f2b024SZhong Yang 	memset(&wndcls,0,sizeof(WNDCLASSEX));
145b1f2b024SZhong Yang 	wndcls.cbSize=sizeof(WNDCLASSEX);
146b1f2b024SZhong Yang 	if(GetClassInfoEx(hInstance,lpszClassName,&wndcls))
147b1f2b024SZhong Yang 	{
148b1f2b024SZhong Yang 		return TRUE;
149b1f2b024SZhong Yang 	}
150b1f2b024SZhong Yang 	if(GetClassInfoEx(NULL,lpszClassName,&wndcls))
151b1f2b024SZhong Yang 	{
152b1f2b024SZhong Yang 		return TRUE;
153b1f2b024SZhong Yang 	}
154b1f2b024SZhong Yang 
155b1f2b024SZhong Yang 	wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
156b1f2b024SZhong Yang 	wndcls.lpfnWndProc=::DefWindowProc;
157b1f2b024SZhong Yang 	wndcls.hInstance=hInstance;
158b1f2b024SZhong Yang 	wndcls.hIcon=NULL;
159b1f2b024SZhong Yang 	wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);
160b1f2b024SZhong Yang 	wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
161b1f2b024SZhong Yang 	wndcls.lpszMenuName=NULL;
162b1f2b024SZhong Yang 	wndcls.lpszClassName=lpszClassName;
163b1f2b024SZhong Yang 	if(!RegisterClassEx(&wndcls))
164b1f2b024SZhong Yang 	{
165b1f2b024SZhong Yang 		return FALSE;
166b1f2b024SZhong Yang 	}
167b1f2b024SZhong Yang 	return TRUE;
168b1f2b024SZhong Yang }
169b1f2b024SZhong Yang 
170b1f2b024SZhong Yang 
171a8b024cfSZhong Yang void CLyricsWindow::AddToolTips()
172a8b024cfSZhong Yang {
173a8b024cfSZhong Yang     AddMouseToolTip(BTN_APP, CCommon::LoadText(IDS_MAIN_MENU));
174a8b024cfSZhong Yang     AddMouseToolTip(BTN_STOP, CCommon::LoadText(IDS_STOP));
175a8b024cfSZhong Yang     AddMouseToolTip(BTN_PREVIOUS, CCommon::LoadText(IDS_PREVIOUS));
176a8b024cfSZhong Yang     AddMouseToolTip(BTN_PLAY_PAUSE, CCommon::LoadText(IDS_PLAY_PAUSE));
177a8b024cfSZhong Yang     AddMouseToolTip(BTN_NEXT, CCommon::LoadText(IDS_NEXT));
178a8b024cfSZhong Yang     AddMouseToolTip(BTN_SETTING, CCommon::LoadText(IDS_SETTINGS));
17920cf72e6SZhong Yang     AddMouseToolTip(BTN_DOUBLE_LINE, CCommon::LoadText(IDS_LYRIC_DOUBLE_LINE));
180a8b024cfSZhong Yang     AddMouseToolTip(BTN_LOCK, CCommon::LoadText(IDS_LOCK_DESKTOP_LYRIC));
181a8b024cfSZhong Yang     AddMouseToolTip(BTN_CLOSE, CCommon::LoadText(IDS_CLOSE_DESKTOP_LYRIC));
182a8b024cfSZhong Yang 
183a8b024cfSZhong Yang     m_tool_tip.SetWindowPos(&CWnd::wndTopMost, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
184a8b024cfSZhong Yang }
185a8b024cfSZhong Yang 
186a8b024cfSZhong Yang void CLyricsWindow::AddMouseToolTip(BtnKey btn, LPCTSTR str)
187a8b024cfSZhong Yang {
188a8b024cfSZhong Yang     m_tool_tip.AddTool(this, str, m_buttons[btn].rect, btn + 1000);
189a8b024cfSZhong Yang 
190a8b024cfSZhong Yang }
191a8b024cfSZhong Yang 
192b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�)
193be1c6be2Szhongyang void CLyricsWindow::UpdateLyrics(LPCTSTR lpszLyrics,int nHighlight)
194b1f2b024SZhong Yang {
195be1c6be2Szhongyang     m_lpszLyrics = lpszLyrics;
196b1f2b024SZhong Yang     UpdateLyrics(nHighlight);
197b1f2b024SZhong Yang }
198b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�)
199b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight)
200b1f2b024SZhong Yang {
201b1f2b024SZhong Yang 	m_nHighlight=nHighlight;
202b1f2b024SZhong Yang 	if(m_nHighlight<0)
203b1f2b024SZhong Yang 		m_nHighlight=0;
204b1f2b024SZhong Yang 	if(m_nHighlight>1000)
205b1f2b024SZhong Yang 		m_nHighlight=1000;
206b1f2b024SZhong Yang 	Draw();
207b1f2b024SZhong Yang }
2082256f4d4SZhong Yang 
2092256f4d4SZhong Yang void CLyricsWindow::UpdateLyricTranslate(LPCTSTR lpszLyricTranslate)
2102256f4d4SZhong Yang {
2112256f4d4SZhong Yang 	m_strTranslate = lpszLyricTranslate;
2122256f4d4SZhong Yang }
2132256f4d4SZhong Yang 
214b1f2b024SZhong Yang //�ػ���ʴ���
215b1f2b024SZhong Yang void CLyricsWindow::Draw()
216b1f2b024SZhong Yang {
217*8735f040SZhong Yang 	//CRect rcWindow;
218*8735f040SZhong Yang 	GetWindowRect(m_rcWindow);
219*8735f040SZhong Yang 	m_nWidth= m_rcWindow.Width();
220*8735f040SZhong Yang 	m_nHeight= m_rcWindow.Height();
221b1f2b024SZhong Yang     CRect rcClient;
222a8b024cfSZhong Yang     GetClientRect(rcClient);
223*8735f040SZhong Yang     m_frameSize.cx = (m_rcWindow.Width() - rcClient.Width()) / 2;
224*8735f040SZhong Yang     m_frameSize.cy = (m_rcWindow.Height() - rcClient.Height()) / 2;
225a8b024cfSZhong Yang 
226b1f2b024SZhong Yang 	//----------------------------------
227b1f2b024SZhong Yang 	BITMAPINFO bitmapinfo;
228b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
229b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biBitCount = 32;
230b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biHeight = m_nHeight;
231b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biWidth = m_nWidth;
232b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biPlanes = 1;
233b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biCompression=BI_RGB;
234b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biXPelsPerMeter=0;
235b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biYPelsPerMeter=0;
236b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrUsed=0;
237b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrImportant=0;
238b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;
239b1f2b024SZhong Yang 	HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0);
240b1f2b024SZhong Yang 	HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap);
241b1f2b024SZhong Yang 	//----------------------------------
242b1f2b024SZhong Yang 	Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC);
243b1f2b024SZhong Yang 	pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias);
244b1f2b024SZhong Yang 	pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias);
24532f06d7fSZhong Yang 
24632f06d7fSZhong Yang 	//���ư�͸������
247c7bf0801Szhongyang 	if(m_bDrawBackground)
24832f06d7fSZhong Yang 	{
249*8735f040SZhong Yang         BYTE alpha = (m_bHover) ? 96 : 1;
250c7bf0801Szhongyang 		Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(Gdiplus::Color(alpha, 255, 255, 255));
251*8735f040SZhong Yang 		pGraphics->FillRectangle(pBrush, 0, 0, m_rcWindow.Width(), m_rcWindow.Height());
25232f06d7fSZhong Yang 		delete pBrush;
25332f06d7fSZhong Yang 	}
25445faed50SZhong Yang     if (m_bDoubleLine && !m_strNextLyric.IsEmpty())
255b6d5f9dcSzhongyang         DrawLyricsDoubleLine(pGraphics);
256b6d5f9dcSzhongyang     else
257b1f2b024SZhong Yang         DrawLyrics(pGraphics);
258b7f299bfSzhongyang 
259b7f299bfSzhongyang     //���ƹ�����
260*8735f040SZhong Yang     if (m_bDrawBackground && (m_bHover))
261a8b024cfSZhong Yang     {
262a8b024cfSZhong Yang         m_first_draw = true;
263b7f299bfSzhongyang         DrawToolbar(pGraphics);
264a8b024cfSZhong Yang     }
265b7f299bfSzhongyang 
266b1f2b024SZhong Yang 	delete pGraphics;
267b1f2b024SZhong Yang 	//----------------------------------
268b1f2b024SZhong Yang 	//����͸������
269b1f2b024SZhong Yang 	CPoint DestPt(0,0);
270b1f2b024SZhong Yang 	CSize psize(m_nWidth,m_nHeight);
271b1f2b024SZhong Yang 	BLENDFUNCTION blendFunc32bpp;
272b1f2b024SZhong Yang 	blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;
273b1f2b024SZhong Yang 	blendFunc32bpp.BlendFlags = 0;
274b1f2b024SZhong Yang 	blendFunc32bpp.BlendOp = AC_SRC_OVER;
275be1c6be2Szhongyang 	blendFunc32bpp.SourceConstantAlpha = m_alpha;
276b1f2b024SZhong Yang 	HDC hDC=::GetDC(m_hWnd);
277b1f2b024SZhong Yang 	::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA);
278b1f2b024SZhong Yang 	//----------------------------------
279b1f2b024SZhong Yang 	//�ͷ���Դ
280b1f2b024SZhong Yang 	::SelectObject (m_hCacheDC,hOldBitmap);
281b1f2b024SZhong Yang 	::DeleteObject(hBitmap);
282b1f2b024SZhong Yang 	::ReleaseDC(m_hWnd,hDC);
283a8b024cfSZhong Yang 
284a8b024cfSZhong Yang     if (m_first_draw)
285a8b024cfSZhong Yang     {
286a8b024cfSZhong Yang         AddToolTips();
287a8b024cfSZhong Yang         m_first_draw = false;
288a8b024cfSZhong Yang     }
289b1f2b024SZhong Yang }
2902256f4d4SZhong Yang 
291b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool bDrawHighlight, bool bDrawTranslate)
2922256f4d4SZhong Yang {
2932256f4d4SZhong Yang 	Gdiplus::REAL fontSize = bDrawTranslate ? m_FontSize * TRANSLATE_FONT_SIZE_FACTOR : m_FontSize;
2942256f4d4SZhong Yang 	if (fontSize < 1)
2952256f4d4SZhong Yang 		fontSize = m_FontSize;
2962256f4d4SZhong Yang 
297e3d88825Szhongyang     Gdiplus::REAL textWidth = rect.Width;
298e3d88825Szhongyang     Gdiplus::REAL highlighWidth = rect.Width * m_nHighlight / 1000;
299b6d5f9dcSzhongyang 
300b6d5f9dcSzhongyang     if (!bDrawHighlight && !bDrawTranslate)
301b6d5f9dcSzhongyang     {
302b6d5f9dcSzhongyang         if (rect.X < 0)
303b6d5f9dcSzhongyang             rect.X = 0;
304b6d5f9dcSzhongyang     }
305b6d5f9dcSzhongyang     else
306b6d5f9dcSzhongyang     {
307e3d88825Szhongyang         //����ı���ȴ��ڿؼ���ȣ���Ҫ���ݷָ��λ�ù����ı�
308e3d88825Szhongyang         if (textWidth > m_nWidth)
309e3d88825Szhongyang         {
310e3d88825Szhongyang             //����ָ��λ�ã���ʽ��ȣ�ʣ�µĿ���Ѿ�С�ڿؼ���ȵ�һ�룬��ʱʹ�ı��Ҳ�Ϳؼ��Ҳ����
311e3d88825Szhongyang             if (textWidth - highlighWidth < m_nWidth / 2)
312e3d88825Szhongyang             {
313e3d88825Szhongyang                 rect.X = m_nWidth - textWidth;
314e3d88825Szhongyang             }
315e3d88825Szhongyang             //�ָ�λ��ʣ�µĿ�Ȼ�û�е�С�ڿؼ���ȵ�һ�룬���Ƿָ�λ�õĿ���Ѿ����ڿؼ���ȵ�һ��ʱ����Ҫ�ƶ��ı�ʹ�ָ�λ�������ڿؼ����м�
316e3d88825Szhongyang             else if (highlighWidth > m_nWidth / 2)
317e3d88825Szhongyang             {
318e3d88825Szhongyang                 rect.X = m_nWidth / 2 - highlighWidth;
319e3d88825Szhongyang             }
320e3d88825Szhongyang             //�ָ�λ�û������ؼ���ȵ�һ��ʱ��ʹ�ı����Ϳؼ�������
321e3d88825Szhongyang             else
322e3d88825Szhongyang             {
323e3d88825Szhongyang                 rect.X = 0;
324e3d88825Szhongyang             }
325e3d88825Szhongyang         }
326b6d5f9dcSzhongyang     }
327e3d88825Szhongyang 
3282256f4d4SZhong Yang 	//-----------------------------------------------------------
3292256f4d4SZhong Yang 	//������Ӱ
3302256f4d4SZhong Yang 	if (m_pShadowBrush) {
3312256f4d4SZhong Yang 		Gdiplus::RectF layoutRect(0, 0, 0, 0);
3322256f4d4SZhong Yang 		layoutRect = rect;
3332256f4d4SZhong Yang 		layoutRect.X = layoutRect.X + m_nShadowOffset;
3342256f4d4SZhong Yang 		layoutRect.Y = layoutRect.Y + m_nShadowOffset;
3352256f4d4SZhong Yang 		Gdiplus::GraphicsPath* pShadowPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
3362256f4d4SZhong Yang 		pShadowPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, layoutRect, m_pTextFormat); //�����ּ���·��
3372256f4d4SZhong Yang 		pGraphics->FillPath(m_pShadowBrush, pShadowPath);//���·��
3382256f4d4SZhong Yang 		delete pShadowPath; //����·��
3392256f4d4SZhong Yang 	}
3402256f4d4SZhong Yang 
3412256f4d4SZhong Yang 	//-----------------------------------------------------------
3422256f4d4SZhong Yang 	//�������
3432256f4d4SZhong Yang 	Gdiplus::GraphicsPath* pStringPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
3442256f4d4SZhong Yang 	pStringPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, rect, m_pTextFormat); //�����ּ���·��
3452256f4d4SZhong Yang 	if (m_pTextPen) {
3462256f4d4SZhong Yang 		pGraphics->DrawPath(m_pTextPen, pStringPath);//��·��,���ֱ߿�
3472256f4d4SZhong Yang 	}
3482256f4d4SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1, m_TextColor2, rect);
3492256f4d4SZhong Yang 	pGraphics->FillPath(pBrush, pStringPath);//���·��
3502256f4d4SZhong Yang 	delete pBrush;//���ٻ�ˢ
351b6d5f9dcSzhongyang 	if(bDrawHighlight)
3522256f4d4SZhong Yang 		DrawHighlightLyrics(pGraphics, pStringPath, rect);
3532256f4d4SZhong Yang 	delete pStringPath; //����·��
3542256f4d4SZhong Yang }
3552256f4d4SZhong Yang 
356b1f2b024SZhong Yang //���Ƹ��
357b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics)
358b1f2b024SZhong Yang {
359a8b024cfSZhong Yang     int lyricHeight = m_nHeight - theApp.DPI(TOOL_ICON_SIZE);
360b1f2b024SZhong Yang 	//��ȡ�����ֿ�Ⱥ͸߶�
361b1f2b024SZhong Yang 	Gdiplus::RectF layoutRect(0,0,0,0);
362b1f2b024SZhong Yang 	Gdiplus::RectF boundingBox;
363b1f2b024SZhong Yang 	pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0);
364b1f2b024SZhong Yang 	//�����ʻ�����λ��
3652256f4d4SZhong Yang 	Gdiplus::RectF dstRect;		//���ֵľ���
3662256f4d4SZhong Yang 	Gdiplus::RectF transRect;	//�����ı��ľ���
367b6d5f9dcSzhongyang     bool bDrawTranslate = m_bShowTranslate && !m_strTranslate.IsEmpty();
368b6d5f9dcSzhongyang 	if(!bDrawTranslate)
369f5ba4de7SZhong Yang 	{
370a8b024cfSZhong Yang 		dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, theApp.DPI(TOOL_ICON_SIZE) + (lyricHeight - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height);
371f5ba4de7SZhong Yang 	}
372f5ba4de7SZhong Yang 	else
3732256f4d4SZhong Yang 	{
3742256f4d4SZhong Yang 		Gdiplus::RectF transBoundingBox;
3752256f4d4SZhong Yang 		pGraphics->MeasureString(m_strTranslate, -1, m_pFont, layoutRect, m_pTextFormat, &transBoundingBox, 0, 0);
3762256f4d4SZhong Yang 		Gdiplus::REAL translateHeight = boundingBox.Height * TRANSLATE_FONT_SIZE_FACTOR;
3772256f4d4SZhong Yang 		Gdiplus::REAL maxWidth = max(boundingBox.Width, transBoundingBox.Width);
3782256f4d4SZhong Yang 		Gdiplus::REAL gapHeight = boundingBox.Height * 0.2f;	//��ʺͷ���֮��ļ�϶
3792256f4d4SZhong Yang 		Gdiplus::REAL height = boundingBox.Height + gapHeight + translateHeight;
380a8b024cfSZhong Yang         Gdiplus::RectF textRect((m_nWidth - maxWidth) / 2, theApp.DPI(TOOL_ICON_SIZE) + (lyricHeight - height) / 2, maxWidth, height);
3812256f4d4SZhong Yang 		dstRect = textRect;
3822256f4d4SZhong Yang 		dstRect.Height = boundingBox.Height;
3832256f4d4SZhong Yang 		transRect = textRect;
3842256f4d4SZhong Yang 		transRect.Y += (boundingBox.Height + gapHeight);
3852256f4d4SZhong Yang 		transRect.Height = translateHeight;
3862256f4d4SZhong Yang 	}
387b1f2b024SZhong Yang 
388b6d5f9dcSzhongyang 	DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true);
389b6d5f9dcSzhongyang 	if (bDrawTranslate)
390b6d5f9dcSzhongyang 		DrawLyricText(pGraphics, m_strTranslate, transRect, false, true);
391b1f2b024SZhong Yang }
392b6d5f9dcSzhongyang 
393b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricsDoubleLine(Gdiplus::Graphics* pGraphics)
394b6d5f9dcSzhongyang {
395a8b024cfSZhong Yang     int lyricHeight = m_nHeight - theApp.DPI(TOOL_ICON_SIZE);
396b6d5f9dcSzhongyang     static bool bSwap = false;
397b6d5f9dcSzhongyang     if (m_lyricChangeFlag)      //�����ʷ����˸ı䣬������ǰ��ʺ���һ���ʵ�λ��
398b6d5f9dcSzhongyang         bSwap = !bSwap;
399b6d5f9dcSzhongyang     //��ȡ�����ֿ�Ⱥ͸߶�
400b6d5f9dcSzhongyang     Gdiplus::RectF layoutRect(0, 0, 0, 0);
401b6d5f9dcSzhongyang     Gdiplus::RectF boundingBox;
402b6d5f9dcSzhongyang     pGraphics->MeasureString(m_lpszLyrics, -1, m_pFont, layoutRect, m_pTextFormat, &boundingBox, 0, 0);
403b6d5f9dcSzhongyang     Gdiplus::RectF nextBoundingBox;
404b6d5f9dcSzhongyang     pGraphics->MeasureString(m_strNextLyric, -1, m_pFont, layoutRect, m_pTextFormat, &nextBoundingBox, 0, 0);
405b6d5f9dcSzhongyang     //�����ʻ�����λ��
406b6d5f9dcSzhongyang     Gdiplus::RectF dstRect;		//���ֵľ���
407b6d5f9dcSzhongyang     Gdiplus::RectF nextRect;	//��һ���ı��ľ���
408b6d5f9dcSzhongyang 
409a8b024cfSZhong Yang     dstRect = Gdiplus::RectF(0, theApp.DPI(TOOL_ICON_SIZE) + (lyricHeight / 2 - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height);
410a8b024cfSZhong Yang     nextRect = Gdiplus::RectF(m_nWidth - nextBoundingBox.Width, dstRect.Y + lyricHeight / 2, nextBoundingBox.Width, nextBoundingBox.Height);
411b6d5f9dcSzhongyang 
412b6d5f9dcSzhongyang     if (bSwap)
413b6d5f9dcSzhongyang     {
414b6d5f9dcSzhongyang         std::swap(dstRect.Y, nextRect.Y);
415b6d5f9dcSzhongyang         nextRect.X = 0;
416b6d5f9dcSzhongyang         dstRect.X = m_nWidth - dstRect.Width;
417b6d5f9dcSzhongyang     }
418b6d5f9dcSzhongyang 
419b6d5f9dcSzhongyang     DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true);
420b6d5f9dcSzhongyang     DrawLyricText(pGraphics, m_strNextLyric, nextRect, false);
421b6d5f9dcSzhongyang }
422b6d5f9dcSzhongyang 
423b1f2b024SZhong Yang //���Ƹ������
424b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect)
425b1f2b024SZhong Yang {
426b1f2b024SZhong Yang 	if(m_nHighlight<=0)return;
427b1f2b024SZhong Yang 	Gdiplus::Region* pRegion=NULL;
428b1f2b024SZhong Yang 	if(m_nHighlight<1000){
429b1f2b024SZhong Yang 		Gdiplus::RectF CliptRect(dstRect);
430b1f2b024SZhong Yang 		CliptRect.Width=CliptRect.Width * m_nHighlight / 1000;
431b1f2b024SZhong Yang 		pRegion=new Gdiplus::Region(CliptRect);
432b1f2b024SZhong Yang 		pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace);
433b1f2b024SZhong Yang 	}
434b1f2b024SZhong Yang 	//--------------------------------------------
435b1f2b024SZhong Yang 	if(m_pHighlightPen){
436b1f2b024SZhong Yang 		pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿�
437b1f2b024SZhong Yang 	}
438b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect);
439b1f2b024SZhong Yang 	pGraphics->FillPath (pBrush,pPath);//���·��
440b1f2b024SZhong Yang 	delete pBrush;//���ٻ�ˢ
441b1f2b024SZhong Yang 	//--------------------------------------------
442b1f2b024SZhong Yang 	if(pRegion){
443b1f2b024SZhong Yang 		pGraphics->ResetClip();
444b1f2b024SZhong Yang 		delete pRegion;
445b1f2b024SZhong Yang 	}
446b1f2b024SZhong Yang }
447b7f299bfSzhongyang 
448b7f299bfSzhongyang void CLyricsWindow::DrawToolbar(Gdiplus::Graphics* pGraphics)
449b7f299bfSzhongyang {
45020cf72e6SZhong Yang     const int toolbar_num = 9;
451a8b024cfSZhong Yang     const int btn_size = theApp.DPI(TOOL_ICON_SIZE);
452b7f299bfSzhongyang     int toolbar_width = toolbar_num * btn_size;
453b7f299bfSzhongyang     Gdiplus::Rect toolbar_rect;
454b7f299bfSzhongyang     toolbar_rect.Y = 0;
455b7f299bfSzhongyang     toolbar_rect.X = (m_nWidth - toolbar_width) / 2;
456b7f299bfSzhongyang     toolbar_rect.Width = toolbar_width;
457b7f299bfSzhongyang     toolbar_rect.Height = btn_size;
458b7f299bfSzhongyang 
459b7f299bfSzhongyang     //���Ʊ���
460a8b024cfSZhong Yang     Gdiplus::Color back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light2, 180);
461b7f299bfSzhongyang     Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(back_color);
462b7f299bfSzhongyang     pGraphics->FillRectangle(pBrush, toolbar_rect);
463b7f299bfSzhongyang     delete pBrush;
464b7f299bfSzhongyang 
465b7f299bfSzhongyang     CRect rcIcon = CRect(toolbar_rect.X, toolbar_rect.Y, toolbar_rect.GetRight(), toolbar_rect.GetBottom());
466b7f299bfSzhongyang     rcIcon.right = rcIcon.left + btn_size;
467b7f299bfSzhongyang 
468a8b024cfSZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.app, rcIcon, BTN_APP);
469b7f299bfSzhongyang     rcIcon.MoveToX(rcIcon.right);
470a8b024cfSZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.stop_l, rcIcon, BTN_STOP);
471a8b024cfSZhong Yang     rcIcon.MoveToX(rcIcon.right);
472a8b024cfSZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.previous, rcIcon, BTN_PREVIOUS);
473b7f299bfSzhongyang     rcIcon.MoveToX(rcIcon.right);
474b7f299bfSzhongyang     IconRes hPlayPauseIcon = (CPlayer::GetInstance().IsPlaying() ? theApp.m_icon_set.pause : theApp.m_icon_set.play);
475a8b024cfSZhong Yang     DrawToolIcon(pGraphics, hPlayPauseIcon, rcIcon, BTN_PLAY_PAUSE);
476b7f299bfSzhongyang     rcIcon.MoveToX(rcIcon.right);
477a8b024cfSZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.next, rcIcon, BTN_NEXT);
478a8b024cfSZhong Yang     rcIcon.MoveToX(rcIcon.right);
479a8b024cfSZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.setting, rcIcon, BTN_SETTING);
480a8b024cfSZhong Yang     rcIcon.MoveToX(rcIcon.right);
48108450031SZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.double_line, rcIcon, BTN_DOUBLE_LINE, theApp.m_lyric_setting_data.desktop_lyric_data.lyric_double_line);
48220cf72e6SZhong Yang     rcIcon.MoveToX(rcIcon.right);
483a8b024cfSZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.lock, rcIcon, BTN_LOCK);
484a8b024cfSZhong Yang     rcIcon.MoveToX(rcIcon.right);
485a8b024cfSZhong Yang     DrawToolIcon(pGraphics, theApp.m_icon_set.close, rcIcon, BTN_CLOSE);
486b7f299bfSzhongyang }
487b7f299bfSzhongyang 
488a8b024cfSZhong Yang void CLyricsWindow::DrawToolIcon(Gdiplus::Graphics* pGraphics, IconRes icon, CRect rect, BtnKey btn_key, bool checked)
489b7f299bfSzhongyang {
490b7f299bfSzhongyang     rect.DeflateRect(theApp.DPI(2), theApp.DPI(2));
491b7f299bfSzhongyang     auto& btn = m_buttons[btn_key];
492b7f299bfSzhongyang     btn.rect = rect;
493b7f299bfSzhongyang 
494b7f299bfSzhongyang     if (btn.pressed)
495b7f299bfSzhongyang         rect.MoveToXY(rect.left + theApp.DPI(1), rect.top + theApp.DPI(1));
496b7f299bfSzhongyang 
497b7f299bfSzhongyang     Gdiplus::Color back_color;
498a8b024cfSZhong Yang     bool draw_background = false;
499b7f299bfSzhongyang     if (btn.pressed && btn.hover)
500a8b024cfSZhong Yang     {
501a8b024cfSZhong Yang         back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.dark1, 180);
502a8b024cfSZhong Yang         draw_background = true;
503a8b024cfSZhong Yang     }
504b7f299bfSzhongyang     else if (btn.hover)
505a8b024cfSZhong Yang     {
506a8b024cfSZhong Yang         back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light1, 180);
507a8b024cfSZhong Yang         draw_background = true;
508a8b024cfSZhong Yang     }
509b7f299bfSzhongyang     else if(checked)
510a8b024cfSZhong Yang     {
51120cf72e6SZhong Yang         back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light1, 110);
512a8b024cfSZhong Yang         draw_background = true;
513a8b024cfSZhong Yang     }
514a8b024cfSZhong Yang     if(draw_background)
515a8b024cfSZhong Yang     {
516a8b024cfSZhong Yang         Gdiplus::SolidBrush brush(back_color);
517a8b024cfSZhong Yang         pGraphics->FillRectangle(&brush, rect.left, rect.top, rect.Width(), rect.Height());
518a8b024cfSZhong Yang     }
519b7f299bfSzhongyang 
520b7f299bfSzhongyang     CRect rc_tmp = rect;
521b7f299bfSzhongyang     //ʹͼ���ھ����о���
522c2a35e51SZhong Yang     CSize icon_size = icon.GetSize();
523b7f299bfSzhongyang     rc_tmp.left = rect.left + (rect.Width() - icon_size.cx) / 2;
524b7f299bfSzhongyang     rc_tmp.top = rect.top + (rect.Height() - icon_size.cy) / 2;
525b7f299bfSzhongyang     rc_tmp.right = rc_tmp.left + icon_size.cx;
526b7f299bfSzhongyang     rc_tmp.bottom = rc_tmp.top + icon_size.cy;
527b7f299bfSzhongyang 
528a8b024cfSZhong Yang     HDC hDC = pGraphics->GetHDC();
529a8b024cfSZhong Yang     CDrawCommon drawer;
530a8b024cfSZhong Yang     drawer.Create(CDC::FromHandle(hDC));
531a8b024cfSZhong Yang     drawer.DrawIcon(icon.GetIcon(true), rc_tmp.TopLeft(), rc_tmp.Size());
532a8b024cfSZhong Yang     pGraphics->ReleaseHDC(hDC);
533b7f299bfSzhongyang }
534b7f299bfSzhongyang 
535b1f2b024SZhong Yang //�������仭ˢ
536b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect)
537b1f2b024SZhong Yang {
538b1f2b024SZhong Yang 	Gdiplus::PointF pt1;
539b1f2b024SZhong Yang 	Gdiplus::PointF pt2;
540b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush=NULL;
541b1f2b024SZhong Yang 	switch (TextGradientMode)
542b1f2b024SZhong Yang 	{
543b1f2b024SZhong Yang 	case LyricsGradientMode_Two://��ɫ����
544b1f2b024SZhong Yang 		{
545b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
546b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height);
547b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
548b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
549b1f2b024SZhong Yang 			break;
550b1f2b024SZhong Yang 		}
551b1f2b024SZhong Yang 
552b1f2b024SZhong Yang 	case LyricsGradientMode_Three://��ɫ����
553b1f2b024SZhong Yang 		{
554b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
555b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2);
556b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
557b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
558b1f2b024SZhong Yang 			break;
559b1f2b024SZhong Yang 		}
560b1f2b024SZhong Yang 
561b1f2b024SZhong Yang 	default://�޽���
562b1f2b024SZhong Yang 		{
563b1f2b024SZhong Yang 			pBrush=new Gdiplus::SolidBrush(Color1);
564b1f2b024SZhong Yang 			break;
565b1f2b024SZhong Yang 		}
566b1f2b024SZhong Yang 	}
567b1f2b024SZhong Yang 	return pBrush;
568b1f2b024SZhong Yang }
569b1f2b024SZhong Yang 
570b1f2b024SZhong Yang //���ø����ɫ
571b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1)
572b1f2b024SZhong Yang {
573b1f2b024SZhong Yang 	CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
574b1f2b024SZhong Yang }
575b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
576b1f2b024SZhong Yang {
577b1f2b024SZhong Yang 	m_TextColor1=TextColor1;
578b1f2b024SZhong Yang 	m_TextColor2=TextColor2;
579b1f2b024SZhong Yang 	m_TextGradientMode=TextGradientMode;
580b1f2b024SZhong Yang 
581b1f2b024SZhong Yang }
582b1f2b024SZhong Yang //���ø�ʱ߿�
583b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
584b1f2b024SZhong Yang {
585b1f2b024SZhong Yang 	if(m_pTextPen){
586b1f2b024SZhong Yang 		delete m_pTextPen;
587b1f2b024SZhong Yang 		m_pTextPen=NULL;
588b1f2b024SZhong Yang 	}
589b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
590b1f2b024SZhong Yang 		m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth);
591b1f2b024SZhong Yang }
592b1f2b024SZhong Yang //���ø��������ɫ
593b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1)
594b1f2b024SZhong Yang {
595b1f2b024SZhong Yang 	CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
596b1f2b024SZhong Yang }
597b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
598b1f2b024SZhong Yang {
599b1f2b024SZhong Yang 	m_HighlightColor1=TextColor1;
600b1f2b024SZhong Yang 	m_HighlightColor2=TextColor2;
601b1f2b024SZhong Yang 	m_HighlightGradientMode=TextGradientMode;
602b1f2b024SZhong Yang 
603b1f2b024SZhong Yang }
604b1f2b024SZhong Yang //���ø�����ʱ߿�
605b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
606b1f2b024SZhong Yang {
607b1f2b024SZhong Yang 	if(m_pHighlightPen){
608b1f2b024SZhong Yang 		delete m_pHighlightPen;
609b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
610b1f2b024SZhong Yang 	}
611b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
612b1f2b024SZhong Yang 		m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth);
613b1f2b024SZhong Yang }
614b1f2b024SZhong Yang //���ø����Ӱ
615b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset)
616b1f2b024SZhong Yang {
617b1f2b024SZhong Yang 	if(m_pShadowBrush){
618b1f2b024SZhong Yang 		delete m_pShadowBrush;
619b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
620b1f2b024SZhong Yang 	}
621b1f2b024SZhong Yang 	if(ShadowColor.GetA()>0 && nShadowOffset>0){
622b1f2b024SZhong Yang 		m_nShadowOffset=nShadowOffset;
623b1f2b024SZhong Yang 		m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor);
624b1f2b024SZhong Yang 	}else{
625b1f2b024SZhong Yang 		m_nShadowOffset=0;
626b1f2b024SZhong Yang 	}
627b1f2b024SZhong Yang }
628b1f2b024SZhong Yang //���ø������
629b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit)
630b1f2b024SZhong Yang {
631b1f2b024SZhong Yang 	if(m_pFont){
632b1f2b024SZhong Yang 		delete m_pFont;
633b1f2b024SZhong Yang 		m_pFont=NULL;
634b1f2b024SZhong Yang 	}
635b1f2b024SZhong Yang 	Gdiplus::FontFamily family(familyName,NULL);
636b1f2b024SZhong Yang 	Gdiplus::Status lastResult = family.GetLastStatus();
637b1f2b024SZhong Yang 	if (lastResult != Gdiplus::Ok)
638b1f2b024SZhong Yang 	{
639b1f2b024SZhong Yang 		HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
640b1f2b024SZhong Yang 		LOGFONTW lf;
641b1f2b024SZhong Yang 		ZeroMemory(&lf,sizeof(LOGFONTW));
642b1f2b024SZhong Yang 		GetObjectW(hFont,sizeof(LOGFONTW),&lf);
643b1f2b024SZhong Yang 		Gdiplus::FontFamily family2(lf.lfFaceName,NULL);
644b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family2,emSize,style,unit);
645b1f2b024SZhong Yang 	}else{
646b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family,emSize,style,unit);
647b1f2b024SZhong Yang 	}
648b1f2b024SZhong Yang 	 //----------------
649b1f2b024SZhong Yang 	//����һЩ��������,����·��ʱҪ�õ�
650b1f2b024SZhong Yang 	m_pFont->GetFamily (m_pFontFamily);
651b1f2b024SZhong Yang 	m_FontSize=m_pFont->GetSize ();
652b1f2b024SZhong Yang 	m_FontStyle=m_pFont->GetStyle ();
653b1f2b024SZhong Yang 
654b1f2b024SZhong Yang 
655b1f2b024SZhong Yang 
656b1f2b024SZhong Yang }
657b1f2b024SZhong Yang 
6582256f4d4SZhong Yang void CLyricsWindow::SetLyricDoubleLine(bool doubleLine)
6592256f4d4SZhong Yang {
6602256f4d4SZhong Yang 	m_bDoubleLine = doubleLine;
6612256f4d4SZhong Yang }
6622256f4d4SZhong Yang 
6632256f4d4SZhong Yang void CLyricsWindow::SetNextLyric(LPCTSTR lpszNextLyric)
6642256f4d4SZhong Yang {
6652256f4d4SZhong Yang 	m_strNextLyric = lpszNextLyric;
6662256f4d4SZhong Yang }
6672256f4d4SZhong Yang 
66832f06d7fSZhong Yang void CLyricsWindow::SetDrawBackground(bool drawBackground)
66932f06d7fSZhong Yang {
67032f06d7fSZhong Yang 	m_bDrawBackground = drawBackground;
67132f06d7fSZhong Yang }
67232f06d7fSZhong Yang 
673b6d5f9dcSzhongyang void CLyricsWindow::SetShowTranslate(bool showTranslate)
674b6d5f9dcSzhongyang {
675b6d5f9dcSzhongyang     m_bShowTranslate = showTranslate;
676b6d5f9dcSzhongyang }
677b6d5f9dcSzhongyang 
678be1c6be2Szhongyang void CLyricsWindow::SetAlpha(int alpha)
679be1c6be2Szhongyang {
680be1c6be2Szhongyang     m_alpha = alpha;
681be1c6be2Szhongyang }
682be1c6be2Szhongyang 
683e32f802dSZhong Yang const CString& CLyricsWindow::GetLyricStr() const
684e32f802dSZhong Yang {
685e32f802dSZhong Yang     return m_lpszLyrics;
686e32f802dSZhong Yang }
687e32f802dSZhong Yang 
688b6d5f9dcSzhongyang void CLyricsWindow::SetLyricChangeFlag(bool bFlag)
689b6d5f9dcSzhongyang {
690b6d5f9dcSzhongyang     m_lyricChangeFlag = bFlag;
691b6d5f9dcSzhongyang }
692b6d5f9dcSzhongyang 
693b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point)
694b1f2b024SZhong Yang {
695a8b024cfSZhong Yang     CPoint point1 = point;
696a8b024cfSZhong Yang     point1.x += m_frameSize.cx;
697a8b024cfSZhong Yang     point1.y += m_frameSize.cy;
698a8b024cfSZhong Yang 
699a8b024cfSZhong Yang     bool point_in_btns = false;
700b7f299bfSzhongyang     for (auto& btn : m_buttons)
701b7f299bfSzhongyang     {
702a8b024cfSZhong Yang         if (btn.second.rect.PtInRect(point1) != FALSE)
703a8b024cfSZhong Yang         {
704b7f299bfSzhongyang             btn.second.pressed = true;
705a8b024cfSZhong Yang             point_in_btns = true;
706b7f299bfSzhongyang         }
707a8b024cfSZhong Yang     }
708a8b024cfSZhong Yang     if (!point_in_btns)
709a8b024cfSZhong Yang         PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point1.x, point1.y));
710b7f299bfSzhongyang 
711b1f2b024SZhong Yang 	CWnd::OnLButtonDown(nFlags, point);
712a8b024cfSZhong Yang 	//ReleaseCapture();
713a8b024cfSZhong Yang 	//SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL);
714b1f2b024SZhong Yang }
715b1f2b024SZhong Yang 
716b1f2b024SZhong Yang void CLyricsWindow::OnLButtonUp(UINT nFlags, CPoint point)
717b1f2b024SZhong Yang {
718b1f2b024SZhong Yang 	// TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
719a8b024cfSZhong Yang     CPoint point1 = point;
720a8b024cfSZhong Yang     point1.x += m_frameSize.cx;
721a8b024cfSZhong Yang     point1.y += m_frameSize.cy;
722a8b024cfSZhong Yang 
723b7f299bfSzhongyang     for (auto& btn : m_buttons)
724b7f299bfSzhongyang     {
725b7f299bfSzhongyang         btn.second.pressed = false;
726a8b024cfSZhong Yang 
727a8b024cfSZhong Yang         if (btn.second.rect.PtInRect(point1) && btn.second.enable)
728a8b024cfSZhong Yang         {
729a8b024cfSZhong Yang             switch (btn.first)
730a8b024cfSZhong Yang             {
731a8b024cfSZhong Yang             case BTN_APP:
732a8b024cfSZhong Yang             {
733a8b024cfSZhong Yang                 CPoint cur_point;
734a8b024cfSZhong Yang                 GetCursorPos(&cur_point);
735a8b024cfSZhong Yang                 theApp.m_menu_set.m_main_menu_popup.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, cur_point.x, cur_point.y, this);
736b7f299bfSzhongyang             }
737a8b024cfSZhong Yang                 return;
738a8b024cfSZhong Yang 
739a8b024cfSZhong Yang             case BTN_STOP:
740a8b024cfSZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_STOP);
741a8b024cfSZhong Yang                 return;
742a8b024cfSZhong Yang 
743a8b024cfSZhong Yang             case BTN_PREVIOUS:
744a8b024cfSZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_PREVIOUS);
745a8b024cfSZhong Yang                 return;
746a8b024cfSZhong Yang             case BTN_PLAY_PAUSE:
747a8b024cfSZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_PLAY_PAUSE);
748a8b024cfSZhong Yang                 return;
749a8b024cfSZhong Yang 
750a8b024cfSZhong Yang             case BTN_NEXT:
751a8b024cfSZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_NEXT);
752a8b024cfSZhong Yang                 return;
753a8b024cfSZhong Yang 
754a8b024cfSZhong Yang             case BTN_SETTING:
755a8b024cfSZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_OPTION_SETTINGS);
756a8b024cfSZhong Yang                 return;
757a8b024cfSZhong Yang 
75820cf72e6SZhong Yang             case BTN_DOUBLE_LINE:
75920cf72e6SZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_LYRIC_DISPLAYED_DOUBLE_LINE);
76020cf72e6SZhong Yang                 return;
76120cf72e6SZhong Yang 
762a8b024cfSZhong Yang             case BTN_LOCK:
763a8b024cfSZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_LOCK_DESKTOP_LRYIC);
764a8b024cfSZhong Yang                 return;
765a8b024cfSZhong Yang 
766a8b024cfSZhong Yang             case BTN_CLOSE:
767a8b024cfSZhong Yang                 theApp.m_pMainWnd->SendMessage(WM_COMMAND, ID_CLOSE_DESKTOP_LYRIC);
768a8b024cfSZhong Yang                 return;
769a8b024cfSZhong Yang 
770a8b024cfSZhong Yang             default:
771a8b024cfSZhong Yang                 break;
772a8b024cfSZhong Yang             }
773a8b024cfSZhong Yang         }
774a8b024cfSZhong Yang     }
775a8b024cfSZhong Yang 
776b1f2b024SZhong Yang 	CWnd::OnLButtonUp(nFlags, point);
777b1f2b024SZhong Yang }
7789dc20028Szhongyang 
7799dc20028Szhongyang 
7809dc20028Szhongyang void CLyricsWindow::OnMouseMove(UINT nFlags, CPoint point)
7819dc20028Szhongyang {
7829dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
783a8b024cfSZhong Yang     CPoint point1 = point;
784a8b024cfSZhong Yang     point1.x += m_frameSize.cx;
785a8b024cfSZhong Yang     point1.y += m_frameSize.cy;
786b7f299bfSzhongyang     for (auto& btn : m_buttons)
787b7f299bfSzhongyang     {
788a8b024cfSZhong Yang         btn.second.hover = (btn.second.rect.PtInRect(point1) != FALSE);
789b7f299bfSzhongyang     }
790b7f299bfSzhongyang 
7919dc20028Szhongyang     TRACKMOUSEEVENT tme;
7929dc20028Szhongyang     tme.cbSize = sizeof(tme);
7939dc20028Szhongyang     tme.hwndTrack = m_hWnd;
7949dc20028Szhongyang     tme.dwFlags = TME_LEAVE | TME_HOVER;
7959dc20028Szhongyang     tme.dwHoverTime = 1;
7969dc20028Szhongyang     _TrackMouseEvent(&tme);
7979dc20028Szhongyang 
7989dc20028Szhongyang     CWnd::OnMouseMove(nFlags, point);
7999dc20028Szhongyang }
8009dc20028Szhongyang 
8019dc20028Szhongyang 
8029dc20028Szhongyang void CLyricsWindow::OnMouseHover(UINT nFlags, CPoint point)
8039dc20028Szhongyang {
8049dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
805a8b024cfSZhong Yang     if (!m_bHover)
8069dc20028Szhongyang     {
807a8b024cfSZhong Yang         m_bHover = true;
8089dc20028Szhongyang         //Invalidate();
8099dc20028Szhongyang     }
8109dc20028Szhongyang     else
8119dc20028Szhongyang     {
8129dc20028Szhongyang         CWnd::OnMouseHover(nFlags, point);
8139dc20028Szhongyang     }
8149dc20028Szhongyang }
8159dc20028Szhongyang 
8169dc20028Szhongyang 
8179dc20028Szhongyang void CLyricsWindow::OnMouseLeave()
8189dc20028Szhongyang {
8199dc20028Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
820a8b024cfSZhong Yang     m_bHover = false;
8219dc20028Szhongyang     //Invalidate();
822*8735f040SZhong Yang     for (auto& btn : m_buttons)
823*8735f040SZhong Yang     {
824*8735f040SZhong Yang         btn.second.pressed = false;
825*8735f040SZhong Yang     }
8269dc20028Szhongyang 
8279dc20028Szhongyang     CWnd::OnMouseLeave();
8289dc20028Szhongyang }
829c7bf0801Szhongyang 
830c7bf0801Szhongyang 
831c7bf0801Szhongyang void CLyricsWindow::OnSizing(UINT fwSide, LPRECT pRect)
832c7bf0801Szhongyang {
833c7bf0801Szhongyang     CWnd::OnSizing(fwSide, pRect);
834c7bf0801Szhongyang 
835c7bf0801Szhongyang     // TODO: �ڴ˴������Ϣ����������
836a8b024cfSZhong Yang     m_bHover = true;
837c7bf0801Szhongyang }
838c45e940bSzhongyang 
839c45e940bSzhongyang 
840c45e940bSzhongyang void CLyricsWindow::OnRButtonUp(UINT nFlags, CPoint point)
841c45e940bSzhongyang {
842c45e940bSzhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
843c45e940bSzhongyang     CPoint point1;		//����һ������ȷ�����λ�õ�λ��
844c45e940bSzhongyang     GetCursorPos(&point1);	//��ȡ��ǰ����λ�ã��Ա�ʹ�ò˵����Ը����꣬��λ������Ļ���Ͻǵ�Ϊԭ�㣬point���Կͻ������Ͻ�Ϊԭ��
845c45e940bSzhongyang     CMenu* pMenu = m_popupMenu.GetSubMenu(0);
846c45e940bSzhongyang     if (pMenu != NULL)
847c45e940bSzhongyang         pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this);
848c45e940bSzhongyang 
849c45e940bSzhongyang     //CWnd::OnRButtonUp(nFlags, point);
850c45e940bSzhongyang }
851c45e940bSzhongyang 
852c45e940bSzhongyang 
853c45e940bSzhongyang BOOL CLyricsWindow::OnCommand(WPARAM wParam, LPARAM lParam)
854c45e940bSzhongyang {
855c45e940bSzhongyang     // TODO: �ڴ����ר�ô����/����û���
85620cf72e6SZhong Yang     WORD command = LOWORD(wParam);
857ca6f9dc8SZhong Yang     if (CCommon::IsMenuItemInMenu(m_popupMenu.GetSubMenu(0), command) || CCommon::IsMenuItemInMenu(&theApp.m_menu_set.m_main_menu, command))
858c45e940bSzhongyang         AfxGetMainWnd()->SendMessage(WM_COMMAND, wParam, lParam);		//���˵�����ת����������
859c45e940bSzhongyang 
860c45e940bSzhongyang     return CWnd::OnCommand(wParam, lParam);
861c45e940bSzhongyang }
8627815ece2Szhongyang 
8637815ece2Szhongyang 
8647815ece2Szhongyang void CLyricsWindow::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
8657815ece2Szhongyang {
8667815ece2Szhongyang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
8677815ece2Szhongyang     lpMMI->ptMinTrackSize.x = theApp.DPI(400);
8687815ece2Szhongyang     lpMMI->ptMinTrackSize.y = theApp.DPI(100);
8697815ece2Szhongyang 
8707815ece2Szhongyang     CWnd::OnGetMinMaxInfo(lpMMI);
8717815ece2Szhongyang }
8727815ece2Szhongyang 
8737815ece2Szhongyang 
8747815ece2Szhongyang afx_msg LRESULT CLyricsWindow::OnInitmenu(WPARAM wParam, LPARAM lParam)
8757815ece2Szhongyang {
8767815ece2Szhongyang     AfxGetMainWnd()->SendMessage(WM_INITMENU, wParam, lParam);        //��WM_INITMENU��Ϣת����������
8777815ece2Szhongyang     return 0;
8787815ece2Szhongyang }
879a8b024cfSZhong Yang 
880a8b024cfSZhong Yang 
881a8b024cfSZhong Yang BOOL CLyricsWindow::PreTranslateMessage(MSG* pMsg)
882a8b024cfSZhong Yang {
883a8b024cfSZhong Yang     // TODO: �ڴ����ר�ô����/����û���
884a8b024cfSZhong Yang     if (pMsg->message == WM_MOUSEMOVE)
885a8b024cfSZhong Yang         m_tool_tip.RelayEvent(pMsg);
886a8b024cfSZhong Yang 
887a8b024cfSZhong Yang     return CWnd::PreTranslateMessage(pMsg);
888a8b024cfSZhong Yang }
889*8735f040SZhong Yang 
890*8735f040SZhong Yang 
891*8735f040SZhong Yang void CLyricsWindow::OnTimer(UINT_PTR nIDEvent)
892*8735f040SZhong Yang {
893*8735f040SZhong Yang     // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
894*8735f040SZhong Yang     if (nIDEvent == TIMER_DESKTOP_LYRIC)
895*8735f040SZhong Yang     {
896*8735f040SZhong Yang         CPoint point;
897*8735f040SZhong Yang         GetCursorPos(&point);
898*8735f040SZhong Yang         m_bMouseInWindowRect = m_rcWindow.PtInRect(point);
899*8735f040SZhong Yang     }
900*8735f040SZhong Yang 
901*8735f040SZhong Yang     CWnd::OnTimer(nIDEvent);
902*8735f040SZhong Yang }
903