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