xref: /MusicPlayer2/MusicPlayer2/LyricsWindow.cpp (revision 5435920015345c2f48a1cedc017899f59aca73d7)
1b1f2b024SZhong Yang // LyricsWindow.cpp : ʵ���ļ�
2b1f2b024SZhong Yang //
3b1f2b024SZhong Yang 
4b1f2b024SZhong Yang #include "stdafx.h"
5b1f2b024SZhong Yang #include "LyricsWindow.h"
6b1f2b024SZhong Yang 
7b1f2b024SZhong Yang 
8b1f2b024SZhong Yang // CLyricsWindow
9b1f2b024SZhong Yang 
10b1f2b024SZhong Yang IMPLEMENT_DYNAMIC(CLyricsWindow, CWnd)
11b1f2b024SZhong Yang 
12b1f2b024SZhong Yang CLyricsWindow::CLyricsWindow()
13b1f2b024SZhong Yang {
14b1f2b024SZhong Yang 	HDC hDC=::GetDC(NULL);
15b1f2b024SZhong Yang 	m_hCacheDC=::CreateCompatibleDC(hDC);
16b1f2b024SZhong Yang 	::ReleaseDC(NULL,hDC);
17b1f2b024SZhong Yang 	//---------------------------------
18b1f2b024SZhong Yang 	m_lpszLyrics=NULL ; //Unicode��ʽ�ĸ��
19b1f2b024SZhong Yang 	m_nHighlight=NULL ; //������ʵİٷֱ� 0--100
20b1f2b024SZhong Yang 	m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ
21b1f2b024SZhong Yang 	m_pTextPen=NULL ; //��ͨ��ʱ߿���
22b1f2b024SZhong Yang 	m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ
23b1f2b024SZhong Yang 	m_pHighlightPen=NULL ; //������ʱ߿���
24b1f2b024SZhong Yang 	m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ
25*54359200SZhong Yang 	m_nShadowOffset=1 ; //��Ӱƫ��
26b1f2b024SZhong Yang 	m_pFont=NULL ; //GDIPlus����
27b1f2b024SZhong Yang 	m_FontStyle=NULL ;
28b1f2b024SZhong Yang 	m_FontSize=NULL ;
29b1f2b024SZhong Yang 	m_pTextFormat=NULL;
30b1f2b024SZhong Yang 	//---------------------------------
31b1f2b024SZhong Yang 	m_pFontFamily=new Gdiplus::FontFamily();
32b1f2b024SZhong Yang 	m_pTextFormat=new Gdiplus::StringFormat();
33b1f2b024SZhong Yang 	m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������
34b1f2b024SZhong Yang 	m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ
35b1f2b024SZhong Yang 	m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ
36b1f2b024SZhong Yang 	//---------------------------------
37*54359200SZhong Yang 	//SetLyricsFont(L"΢���ź�", 40, Gdiplus::FontStyle::FontStyleRegular);
38*54359200SZhong Yang 	//SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three);
39b1f2b024SZhong Yang 	//SetLyricsBorder(Gdiplus::Color::Black,1);
40*54359200SZhong Yang 	SetLyricsShadow(Gdiplus::Color(150,0,0,0),1);
41*54359200SZhong Yang 	//SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three);
42b1f2b024SZhong Yang 	//SetHighlightBorder(Gdiplus::Color::Black,1);
43b1f2b024SZhong Yang 
44b1f2b024SZhong Yang }
45b1f2b024SZhong Yang 
46b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow()
47b1f2b024SZhong Yang {
48b1f2b024SZhong Yang 	if(m_lpszLyrics){
49b1f2b024SZhong Yang 		delete  m_lpszLyrics;
50b1f2b024SZhong Yang 		m_lpszLyrics=NULL;
51b1f2b024SZhong Yang 	}
52b1f2b024SZhong Yang 	if(m_pTextPen){
53b1f2b024SZhong Yang 		delete m_pTextPen;
54b1f2b024SZhong Yang 		m_pTextPen=NULL;
55b1f2b024SZhong Yang 	}
56b1f2b024SZhong Yang 	if(m_pHighlightPen){
57b1f2b024SZhong Yang 		delete m_pHighlightPen;
58b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
59b1f2b024SZhong Yang 	}
60b1f2b024SZhong Yang 	if(m_pShadowBrush){
61b1f2b024SZhong Yang 		delete m_pShadowBrush;
62b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
63b1f2b024SZhong Yang 	}
64b1f2b024SZhong Yang 	if(m_pFontFamily){
65b1f2b024SZhong Yang 		delete m_pFontFamily;
66b1f2b024SZhong Yang 		m_pFontFamily=NULL;
67b1f2b024SZhong Yang 	}
68b1f2b024SZhong Yang 	if(m_pTextFormat){
69b1f2b024SZhong Yang 		delete m_pTextFormat;
70b1f2b024SZhong Yang 		m_pTextFormat=NULL;
71b1f2b024SZhong Yang 	}
72b1f2b024SZhong Yang 	if(m_pFont){
73b1f2b024SZhong Yang 		delete m_pFont;
74b1f2b024SZhong Yang 		m_pFont=NULL;
75b1f2b024SZhong Yang 	}
76b1f2b024SZhong Yang }
77b1f2b024SZhong Yang 
78b1f2b024SZhong Yang 
79b1f2b024SZhong Yang BEGIN_MESSAGE_MAP(CLyricsWindow, CWnd)
80b1f2b024SZhong Yang 
81b1f2b024SZhong Yang 	ON_WM_LBUTTONDOWN()
82b1f2b024SZhong Yang 	ON_WM_LBUTTONUP()
83b1f2b024SZhong Yang END_MESSAGE_MAP()
84b1f2b024SZhong Yang 
85b1f2b024SZhong Yang 
86b1f2b024SZhong Yang 
87b1f2b024SZhong Yang BOOL CLyricsWindow::Create()
88b1f2b024SZhong Yang {
89b1f2b024SZhong Yang 	return CLyricsWindow::Create(_T("CometLyricsWindow"),-1,-1);
90b1f2b024SZhong Yang }
91b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName)
92b1f2b024SZhong Yang {
93b1f2b024SZhong Yang 	return CLyricsWindow::Create(lpszClassName,-1,-1);
94b1f2b024SZhong Yang }
95b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight)
96b1f2b024SZhong Yang {
97b1f2b024SZhong Yang 	if(!RegisterWndClass(lpszClassName))
98b1f2b024SZhong Yang 	{
99b1f2b024SZhong Yang 		TRACE("Class��Registration��Failedn");
100b1f2b024SZhong Yang 	}
101b1f2b024SZhong Yang 	//--------------------------------------------
102b1f2b024SZhong Yang 	//ȡ�����湤������
103b1f2b024SZhong Yang 	RECT rcWork;
104b1f2b024SZhong Yang 	SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL);
105b1f2b024SZhong Yang 	int nWorkWidth=rcWork.right-rcWork.left;
106b1f2b024SZhong Yang 	int nWorkHeight=rcWork.bottom-rcWork.top;
107b1f2b024SZhong Yang 	//δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ
108b1f2b024SZhong Yang 	if(nWidth<0)nWidth=nWorkWidth;
109b1f2b024SZhong Yang 	if(nHeight<0)nHeight=150;
110b1f2b024SZhong Yang 	//������ߡ�����λ��,�ô�������Ļ�·�
111b1f2b024SZhong Yang 	int x=rcWork.left+( (nWorkWidth-nWidth)/2 );
112b1f2b024SZhong Yang 	int y=rcWork.bottom-nHeight;
113b1f2b024SZhong Yang 	//--------------------------------------------
114b1f2b024SZhong Yang 	DWORD dwStyle=WS_POPUP|WS_VISIBLE;
115b1f2b024SZhong Yang 	DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED;
116b1f2b024SZhong Yang 	return CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL);
117b1f2b024SZhong Yang }
118b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName)
119b1f2b024SZhong Yang {
120b1f2b024SZhong Yang 	HINSTANCE hInstance=AfxGetInstanceHandle();
121b1f2b024SZhong Yang 	WNDCLASSEX wndcls;
122b1f2b024SZhong Yang 	memset(&wndcls,0,sizeof(WNDCLASSEX));
123b1f2b024SZhong Yang 	wndcls.cbSize=sizeof(WNDCLASSEX);
124b1f2b024SZhong Yang 	if(GetClassInfoEx(hInstance,lpszClassName,&wndcls))
125b1f2b024SZhong Yang 	{
126b1f2b024SZhong Yang 		return TRUE;
127b1f2b024SZhong Yang 	}
128b1f2b024SZhong Yang 	if(GetClassInfoEx(NULL,lpszClassName,&wndcls))
129b1f2b024SZhong Yang 	{
130b1f2b024SZhong Yang 		return TRUE;
131b1f2b024SZhong Yang 	}
132b1f2b024SZhong Yang 
133b1f2b024SZhong Yang 	wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
134b1f2b024SZhong Yang 	wndcls.lpfnWndProc=::DefWindowProc;
135b1f2b024SZhong Yang 	wndcls.hInstance=hInstance;
136b1f2b024SZhong Yang 	wndcls.hIcon=NULL;
137b1f2b024SZhong Yang 	wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW);
138b1f2b024SZhong Yang 	wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
139b1f2b024SZhong Yang 	wndcls.lpszMenuName=NULL;
140b1f2b024SZhong Yang 	wndcls.lpszClassName=lpszClassName;
141b1f2b024SZhong Yang 	if(!RegisterClassEx(&wndcls))
142b1f2b024SZhong Yang 	{
143b1f2b024SZhong Yang 		return FALSE;
144b1f2b024SZhong Yang 	}
145b1f2b024SZhong Yang 	return TRUE;
146b1f2b024SZhong Yang }
147b1f2b024SZhong Yang 
148b1f2b024SZhong Yang 
149b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�)
150b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(LPCSTR lpszLyrics,int nHighlight)
151b1f2b024SZhong Yang {
152b1f2b024SZhong Yang 	if(m_lpszLyrics){
153b1f2b024SZhong Yang 		delete  m_lpszLyrics;
154b1f2b024SZhong Yang 		m_lpszLyrics=NULL;
155b1f2b024SZhong Yang 	}
156b1f2b024SZhong Yang 	if(lpszLyrics){
157b1f2b024SZhong Yang 		//���ݽ�����ANSI�汾���ַ���,��Ҫת����Unicode
158b1f2b024SZhong Yang 		int nLen=MultiByteToWideChar(CP_ACP,0,lpszLyrics,-1, NULL,NULL);
159b1f2b024SZhong Yang 		if(nLen){
160b1f2b024SZhong Yang 			m_lpszLyrics = new WCHAR[nLen+1];
161b1f2b024SZhong Yang 			ZeroMemory(m_lpszLyrics,sizeof(WCHAR)*(nLen+1));
162b1f2b024SZhong Yang 			MultiByteToWideChar(CP_ACP,0,lpszLyrics,-1,m_lpszLyrics,nLen);
163b1f2b024SZhong Yang 		}
164b1f2b024SZhong Yang 	}
165b1f2b024SZhong Yang 	UpdateLyrics(nHighlight);
166b1f2b024SZhong Yang }
167b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(LPCWSTR lpszLyrics,int nHighlight)
168b1f2b024SZhong Yang {
169b1f2b024SZhong Yang 	if(m_lpszLyrics){
170b1f2b024SZhong Yang 		delete  m_lpszLyrics;
171b1f2b024SZhong Yang 		 m_lpszLyrics=NULL;
172b1f2b024SZhong Yang 	}
173b1f2b024SZhong Yang 	int nLen=0;
174b1f2b024SZhong Yang 	if(lpszLyrics){
175b1f2b024SZhong Yang 		nLen=lstrlenW(lpszLyrics);
176b1f2b024SZhong Yang 	}
177b1f2b024SZhong Yang 	if(nLen>0){
178b1f2b024SZhong Yang 		m_lpszLyrics=new WCHAR[nLen+1];
179b1f2b024SZhong Yang 		ZeroMemory(m_lpszLyrics,sizeof(WCHAR)*(nLen+1));
180b1f2b024SZhong Yang 		CopyMemory(m_lpszLyrics,lpszLyrics,sizeof(WCHAR)*(nLen));
181b1f2b024SZhong Yang 	}
182b1f2b024SZhong Yang 	UpdateLyrics(nHighlight);
183b1f2b024SZhong Yang }
184b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�)
185b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight)
186b1f2b024SZhong Yang {
187b1f2b024SZhong Yang 	m_nHighlight=nHighlight;
188b1f2b024SZhong Yang 	if(m_nHighlight<0)
189b1f2b024SZhong Yang 		m_nHighlight=0;
190b1f2b024SZhong Yang 	if(m_nHighlight>1000)
191b1f2b024SZhong Yang 		m_nHighlight=1000;
192b1f2b024SZhong Yang 	Draw();
193b1f2b024SZhong Yang }
194b1f2b024SZhong Yang //�ػ���ʴ���
195b1f2b024SZhong Yang void CLyricsWindow::Draw()
196b1f2b024SZhong Yang {
197b1f2b024SZhong Yang 	CRect rcClient;
198b1f2b024SZhong Yang 	GetClientRect(rcClient);
199b1f2b024SZhong Yang 	m_nWidth=rcClient.Width();
200b1f2b024SZhong Yang 	m_nHeight=rcClient.Height();
201b1f2b024SZhong Yang 	//----------------------------------
202b1f2b024SZhong Yang 	BITMAPINFO bitmapinfo;
203b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
204b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biBitCount = 32;
205b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biHeight = m_nHeight;
206b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biWidth = m_nWidth;
207b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biPlanes = 1;
208b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biCompression=BI_RGB;
209b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biXPelsPerMeter=0;
210b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biYPelsPerMeter=0;
211b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrUsed=0;
212b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biClrImportant=0;
213b1f2b024SZhong Yang 	bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8;
214b1f2b024SZhong Yang 	HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0);
215b1f2b024SZhong Yang 	HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap);
216b1f2b024SZhong Yang 	//----------------------------------
217b1f2b024SZhong Yang 	Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC);
218b1f2b024SZhong Yang 	pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias);
219b1f2b024SZhong Yang 	pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias);
220b1f2b024SZhong Yang 	DrawLyrics(pGraphics);
221b1f2b024SZhong Yang 	delete pGraphics;
222b1f2b024SZhong Yang 	//----------------------------------
223b1f2b024SZhong Yang 	//����͸������
224b1f2b024SZhong Yang 	CPoint DestPt(0,0);
225b1f2b024SZhong Yang 	CSize psize(m_nWidth,m_nHeight);
226b1f2b024SZhong Yang 	BLENDFUNCTION blendFunc32bpp;
227b1f2b024SZhong Yang 	blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA;
228b1f2b024SZhong Yang 	blendFunc32bpp.BlendFlags = 0;
229b1f2b024SZhong Yang 	blendFunc32bpp.BlendOp = AC_SRC_OVER;
230b1f2b024SZhong Yang 	blendFunc32bpp.SourceConstantAlpha = 255;
231b1f2b024SZhong Yang 	HDC hDC=::GetDC(m_hWnd);
232b1f2b024SZhong Yang 	::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA);
233b1f2b024SZhong Yang 	//----------------------------------
234b1f2b024SZhong Yang 	//�ͷ���Դ
235b1f2b024SZhong Yang 	::SelectObject (m_hCacheDC,hOldBitmap);
236b1f2b024SZhong Yang 	::DeleteObject(hBitmap);
237b1f2b024SZhong Yang 	::ReleaseDC(m_hWnd,hDC);
238b1f2b024SZhong Yang }
239b1f2b024SZhong Yang //���Ƹ��
240b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics)
241b1f2b024SZhong Yang {
242b1f2b024SZhong Yang 	//��ȡ�����ֿ�Ⱥ͸߶�
243b1f2b024SZhong Yang 	Gdiplus::RectF layoutRect(0,0,0,0);
244b1f2b024SZhong Yang 	Gdiplus::RectF boundingBox;
245b1f2b024SZhong Yang 	pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0);
246b1f2b024SZhong Yang 	//�����ʻ�����λ��
247b1f2b024SZhong Yang 	Gdiplus::RectF dstRect((m_nWidth - boundingBox.Width) / 2,(m_nHeight - boundingBox.Height) / 2,boundingBox.Width,boundingBox.Height);
248b1f2b024SZhong Yang 	if(dstRect.X<0)dstRect.X=0;
249b1f2b024SZhong Yang 	if(dstRect.Width>m_nWidth)dstRect.Width=m_nWidth;
250b1f2b024SZhong Yang 
251b1f2b024SZhong Yang 	//-----------------------------------------------------------
252b1f2b024SZhong Yang 	//������Ӱ
253b1f2b024SZhong Yang 	if(m_pShadowBrush){
254b1f2b024SZhong Yang 		layoutRect=dstRect;
255b1f2b024SZhong Yang 		layoutRect.X=layoutRect.X + m_nShadowOffset;
256b1f2b024SZhong Yang 		layoutRect.Y=layoutRect.Y + m_nShadowOffset;
257b1f2b024SZhong Yang 		Gdiplus::GraphicsPath* pShadowPath=new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
258b1f2b024SZhong Yang 		pShadowPath->AddString (m_lpszLyrics, -1, m_pFontFamily, m_FontStyle, m_FontSize, layoutRect, m_pTextFormat); //�����ּ���·��
259b1f2b024SZhong Yang 		pGraphics->FillPath (m_pShadowBrush,pShadowPath);//���·��
260b1f2b024SZhong Yang 		delete pShadowPath; //����·��
261b1f2b024SZhong Yang 	}
262b1f2b024SZhong Yang 
263b1f2b024SZhong Yang 	//-----------------------------------------------------------
264b1f2b024SZhong Yang 	//�������
265b1f2b024SZhong Yang 	Gdiplus::GraphicsPath* pStringPath=new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·��
266b1f2b024SZhong Yang 	pStringPath->AddString (m_lpszLyrics, -1, m_pFontFamily, m_FontStyle, m_FontSize,dstRect, m_pTextFormat); //�����ּ���·��
267b1f2b024SZhong Yang 	if(m_pTextPen){
268b1f2b024SZhong Yang 		pGraphics->DrawPath (m_pTextPen,pStringPath);//��·��,���ֱ߿�
269b1f2b024SZhong Yang 	}
270b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1,m_TextColor2,dstRect);
271b1f2b024SZhong Yang 	pGraphics->FillPath (pBrush,pStringPath);//���·��
272b1f2b024SZhong Yang 	delete pBrush;//���ٻ�ˢ
273b1f2b024SZhong Yang 	DrawHighlightLyrics(pGraphics,pStringPath,dstRect);
274b1f2b024SZhong Yang 	delete pStringPath; //����·��
275b1f2b024SZhong Yang 
276b1f2b024SZhong Yang }
277b1f2b024SZhong Yang //���Ƹ������
278b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect)
279b1f2b024SZhong Yang {
280b1f2b024SZhong Yang 	if(m_nHighlight<=0)return;
281b1f2b024SZhong Yang 	Gdiplus::Region* pRegion=NULL;
282b1f2b024SZhong Yang 	if(m_nHighlight<1000){
283b1f2b024SZhong Yang 		Gdiplus::RectF CliptRect(dstRect);
284b1f2b024SZhong Yang 		CliptRect.Width=CliptRect.Width * m_nHighlight / 1000;
285b1f2b024SZhong Yang 		pRegion=new Gdiplus::Region(CliptRect);
286b1f2b024SZhong Yang 		pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace);
287b1f2b024SZhong Yang 	}
288b1f2b024SZhong Yang 	//--------------------------------------------
289b1f2b024SZhong Yang 	if(m_pHighlightPen){
290b1f2b024SZhong Yang 		pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿�
291b1f2b024SZhong Yang 	}
292b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect);
293b1f2b024SZhong Yang 	pGraphics->FillPath (pBrush,pPath);//���·��
294b1f2b024SZhong Yang 	delete pBrush;//���ٻ�ˢ
295b1f2b024SZhong Yang 	//--------------------------------------------
296b1f2b024SZhong Yang 	if(pRegion){
297b1f2b024SZhong Yang 		pGraphics->ResetClip();
298b1f2b024SZhong Yang 		delete pRegion;
299b1f2b024SZhong Yang 	}
300b1f2b024SZhong Yang }
301b1f2b024SZhong Yang //�������仭ˢ
302b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect)
303b1f2b024SZhong Yang {
304b1f2b024SZhong Yang 	Gdiplus::PointF pt1;
305b1f2b024SZhong Yang 	Gdiplus::PointF pt2;
306b1f2b024SZhong Yang 	Gdiplus::Brush* pBrush=NULL;
307b1f2b024SZhong Yang 	switch (TextGradientMode)
308b1f2b024SZhong Yang 	{
309b1f2b024SZhong Yang 	case LyricsGradientMode_Two://��ɫ����
310b1f2b024SZhong Yang 		{
311b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
312b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height);
313b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
314b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
315b1f2b024SZhong Yang 			break;
316b1f2b024SZhong Yang 		}
317b1f2b024SZhong Yang 
318b1f2b024SZhong Yang 	case LyricsGradientMode_Three://��ɫ����
319b1f2b024SZhong Yang 		{
320b1f2b024SZhong Yang 			Gdiplus::PointF point1(dstRect.X,dstRect.Y);
321b1f2b024SZhong Yang 			Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2);
322b1f2b024SZhong Yang 			pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2);
323b1f2b024SZhong Yang 			((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY);
324b1f2b024SZhong Yang 			break;
325b1f2b024SZhong Yang 		}
326b1f2b024SZhong Yang 
327b1f2b024SZhong Yang 	default://�޽���
328b1f2b024SZhong Yang 		{
329b1f2b024SZhong Yang 			pBrush=new Gdiplus::SolidBrush(Color1);
330b1f2b024SZhong Yang 			break;
331b1f2b024SZhong Yang 		}
332b1f2b024SZhong Yang 	}
333b1f2b024SZhong Yang 	return pBrush;
334b1f2b024SZhong Yang }
335b1f2b024SZhong Yang 
336b1f2b024SZhong Yang //���ø����ɫ
337b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1)
338b1f2b024SZhong Yang {
339b1f2b024SZhong Yang 	CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
340b1f2b024SZhong Yang }
341b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
342b1f2b024SZhong Yang {
343b1f2b024SZhong Yang 	m_TextColor1=TextColor1;
344b1f2b024SZhong Yang 	m_TextColor2=TextColor2;
345b1f2b024SZhong Yang 	m_TextGradientMode=TextGradientMode;
346b1f2b024SZhong Yang 
347b1f2b024SZhong Yang }
348b1f2b024SZhong Yang //���ø�ʱ߿�
349b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
350b1f2b024SZhong Yang {
351b1f2b024SZhong Yang 	if(m_pTextPen){
352b1f2b024SZhong Yang 		delete m_pTextPen;
353b1f2b024SZhong Yang 		m_pTextPen=NULL;
354b1f2b024SZhong Yang 	}
355b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
356b1f2b024SZhong Yang 		m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth);
357b1f2b024SZhong Yang }
358b1f2b024SZhong Yang //���ø��������ɫ
359b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1)
360b1f2b024SZhong Yang {
361b1f2b024SZhong Yang 	CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None);
362b1f2b024SZhong Yang }
363b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode)
364b1f2b024SZhong Yang {
365b1f2b024SZhong Yang 	m_HighlightColor1=TextColor1;
366b1f2b024SZhong Yang 	m_HighlightColor2=TextColor2;
367b1f2b024SZhong Yang 	m_HighlightGradientMode=TextGradientMode;
368b1f2b024SZhong Yang 
369b1f2b024SZhong Yang }
370b1f2b024SZhong Yang //���ø�����ʱ߿�
371b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth)
372b1f2b024SZhong Yang {
373b1f2b024SZhong Yang 	if(m_pHighlightPen){
374b1f2b024SZhong Yang 		delete m_pHighlightPen;
375b1f2b024SZhong Yang 		m_pHighlightPen=NULL;
376b1f2b024SZhong Yang 	}
377b1f2b024SZhong Yang 	if(BorderColor.GetA()>0 && BorderWidth>0)
378b1f2b024SZhong Yang 		m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth);
379b1f2b024SZhong Yang }
380b1f2b024SZhong Yang //���ø����Ӱ
381b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset)
382b1f2b024SZhong Yang {
383b1f2b024SZhong Yang 	if(m_pShadowBrush){
384b1f2b024SZhong Yang 		delete m_pShadowBrush;
385b1f2b024SZhong Yang 		m_pShadowBrush=NULL;
386b1f2b024SZhong Yang 	}
387b1f2b024SZhong Yang 	if(ShadowColor.GetA()>0 && nShadowOffset>0){
388b1f2b024SZhong Yang 		m_nShadowOffset=nShadowOffset;
389b1f2b024SZhong Yang 		m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor);
390b1f2b024SZhong Yang 	}else{
391b1f2b024SZhong Yang 		m_nShadowOffset=0;
392b1f2b024SZhong Yang 	}
393b1f2b024SZhong Yang }
394b1f2b024SZhong Yang //���ø������
395b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit)
396b1f2b024SZhong Yang {
397b1f2b024SZhong Yang 	if(m_pFont){
398b1f2b024SZhong Yang 		delete m_pFont;
399b1f2b024SZhong Yang 		m_pFont=NULL;
400b1f2b024SZhong Yang 	}
401b1f2b024SZhong Yang 	Gdiplus::FontFamily family(familyName,NULL);
402b1f2b024SZhong Yang 	Gdiplus::Status lastResult = family.GetLastStatus();
403b1f2b024SZhong Yang 	if (lastResult != Gdiplus::Ok)
404b1f2b024SZhong Yang 	{
405b1f2b024SZhong Yang 		HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT);
406b1f2b024SZhong Yang 		LOGFONTW lf;
407b1f2b024SZhong Yang 		ZeroMemory(&lf,sizeof(LOGFONTW));
408b1f2b024SZhong Yang 		GetObjectW(hFont,sizeof(LOGFONTW),&lf);
409b1f2b024SZhong Yang 		Gdiplus::FontFamily family2(lf.lfFaceName,NULL);
410b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family2,emSize,style,unit);
411b1f2b024SZhong Yang 	}else{
412b1f2b024SZhong Yang 		m_pFont=new Gdiplus::Font(&family,emSize,style,unit);
413b1f2b024SZhong Yang 	}
414b1f2b024SZhong Yang 	 //----------------
415b1f2b024SZhong Yang 	//����һЩ��������,����·��ʱҪ�õ�
416b1f2b024SZhong Yang 	m_pFont->GetFamily (m_pFontFamily);
417b1f2b024SZhong Yang 	m_FontSize=m_pFont->GetSize ();
418b1f2b024SZhong Yang 	m_FontStyle=m_pFont->GetStyle ();
419b1f2b024SZhong Yang 
420b1f2b024SZhong Yang 
421b1f2b024SZhong Yang 
422b1f2b024SZhong Yang }
423b1f2b024SZhong Yang 
424b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point)
425b1f2b024SZhong Yang {
426b1f2b024SZhong Yang 	CWnd::OnLButtonDown(nFlags, point);
427b1f2b024SZhong Yang 	ReleaseCapture();
428b1f2b024SZhong Yang 	SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL);
429b1f2b024SZhong Yang }
430b1f2b024SZhong Yang 
431b1f2b024SZhong Yang void CLyricsWindow::OnLButtonUp(UINT nFlags, CPoint point)
432b1f2b024SZhong Yang {
433b1f2b024SZhong Yang 	// TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ
434b1f2b024SZhong Yang 
435b1f2b024SZhong Yang 	CWnd::OnLButtonUp(nFlags, point);
436b1f2b024SZhong Yang }
437