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 102256f4d4SZhong Yang const Gdiplus::REAL TRANSLATE_FONT_SIZE_FACTOR = 0.88f; //��ʷ����ı���Сռ����ı���С�ı��� 112256f4d4SZhong Yang 12b1f2b024SZhong Yang IMPLEMENT_DYNAMIC(CLyricsWindow, CWnd) 13b1f2b024SZhong Yang 14b1f2b024SZhong Yang CLyricsWindow::CLyricsWindow() 15b1f2b024SZhong Yang { 16b1f2b024SZhong Yang HDC hDC=::GetDC(NULL); 17b1f2b024SZhong Yang m_hCacheDC=::CreateCompatibleDC(hDC); 18b1f2b024SZhong Yang ::ReleaseDC(NULL,hDC); 19b1f2b024SZhong Yang //--------------------------------- 20b1f2b024SZhong Yang m_lpszLyrics=NULL ; //Unicode��ʽ�ĸ�� 21b1f2b024SZhong Yang m_nHighlight=NULL ; //������ʵİٷֱ� 0--100 22b1f2b024SZhong Yang m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ 23b1f2b024SZhong Yang m_pTextPen=NULL ; //��ͨ��ʱ߿� 24b1f2b024SZhong Yang m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ 25b1f2b024SZhong Yang m_pHighlightPen=NULL ; //������ʱ߿� 26b1f2b024SZhong Yang m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ 2754359200SZhong Yang m_nShadowOffset=1 ; //��Ӱƫ�� 28b1f2b024SZhong Yang m_pFont=NULL ; //GDIPlus���� 29b1f2b024SZhong Yang m_FontStyle=NULL ; 30b1f2b024SZhong Yang m_FontSize=NULL ; 31b1f2b024SZhong Yang m_pTextFormat=NULL; 32b1f2b024SZhong Yang //--------------------------------- 33b1f2b024SZhong Yang m_pFontFamily=new Gdiplus::FontFamily(); 34b1f2b024SZhong Yang m_pTextFormat=new Gdiplus::StringFormat(); 35b1f2b024SZhong Yang m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������ 36b1f2b024SZhong Yang m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ 37b1f2b024SZhong Yang m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ 38b1f2b024SZhong Yang //--------------------------------- 3954359200SZhong Yang //SetLyricsFont(L"���ź�", 40, Gdiplus::FontStyle::FontStyleRegular); 4054359200SZhong Yang //SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three); 41b1f2b024SZhong Yang //SetLyricsBorder(Gdiplus::Color::Black,1); 4254359200SZhong Yang SetLyricsShadow(Gdiplus::Color(150,0,0,0),1); 4354359200SZhong Yang //SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three); 44b1f2b024SZhong Yang //SetHighlightBorder(Gdiplus::Color::Black,1); 45b1f2b024SZhong Yang 46b1f2b024SZhong Yang } 47b1f2b024SZhong Yang 48b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow() 49b1f2b024SZhong Yang { 50b1f2b024SZhong Yang if(m_lpszLyrics){ 51b1f2b024SZhong Yang delete m_lpszLyrics; 52b1f2b024SZhong Yang m_lpszLyrics=NULL; 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() 85b1f2b024SZhong Yang END_MESSAGE_MAP() 86b1f2b024SZhong Yang 87b1f2b024SZhong Yang 88b1f2b024SZhong Yang 892256f4d4SZhong Yang BOOL CLyricsWindow::Create(int nHeight) 90b1f2b024SZhong Yang { 912256f4d4SZhong Yang return CLyricsWindow::Create(_T("CometLyricsWindow"), -1, nHeight); 92b1f2b024SZhong Yang } 93b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName) 94b1f2b024SZhong Yang { 95b1f2b024SZhong Yang return CLyricsWindow::Create(lpszClassName,-1,-1); 96b1f2b024SZhong Yang } 97b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight) 98b1f2b024SZhong Yang { 99b1f2b024SZhong Yang if(!RegisterWndClass(lpszClassName)) 100b1f2b024SZhong Yang { 101b1f2b024SZhong Yang TRACE("Class��Registration��Failedn"); 102b1f2b024SZhong Yang } 103b1f2b024SZhong Yang //-------------------------------------------- 104b1f2b024SZhong Yang //ȡ�����湤������ 105b1f2b024SZhong Yang RECT rcWork; 106b1f2b024SZhong Yang SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL); 107b1f2b024SZhong Yang int nWorkWidth=rcWork.right-rcWork.left; 108b1f2b024SZhong Yang int nWorkHeight=rcWork.bottom-rcWork.top; 109b1f2b024SZhong Yang //δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ 110b1f2b024SZhong Yang if(nWidth<0)nWidth=nWorkWidth; 111b1f2b024SZhong Yang if(nHeight<0)nHeight=150; 112b1f2b024SZhong Yang //������ߡ�����λ��,�ô�������Ļ�·� 113b1f2b024SZhong Yang int x=rcWork.left+( (nWorkWidth-nWidth)/2 ); 114b1f2b024SZhong Yang int y=rcWork.bottom-nHeight; 115b1f2b024SZhong Yang //-------------------------------------------- 116b1f2b024SZhong Yang DWORD dwStyle=WS_POPUP|WS_VISIBLE; 117b1f2b024SZhong Yang DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED; 118b1f2b024SZhong Yang return CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL); 119b1f2b024SZhong Yang } 120b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName) 121b1f2b024SZhong Yang { 122b1f2b024SZhong Yang HINSTANCE hInstance=AfxGetInstanceHandle(); 123b1f2b024SZhong Yang WNDCLASSEX wndcls; 124b1f2b024SZhong Yang memset(&wndcls,0,sizeof(WNDCLASSEX)); 125b1f2b024SZhong Yang wndcls.cbSize=sizeof(WNDCLASSEX); 126b1f2b024SZhong Yang if(GetClassInfoEx(hInstance,lpszClassName,&wndcls)) 127b1f2b024SZhong Yang { 128b1f2b024SZhong Yang return TRUE; 129b1f2b024SZhong Yang } 130b1f2b024SZhong Yang if(GetClassInfoEx(NULL,lpszClassName,&wndcls)) 131b1f2b024SZhong Yang { 132b1f2b024SZhong Yang return TRUE; 133b1f2b024SZhong Yang } 134b1f2b024SZhong Yang 135b1f2b024SZhong Yang wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; 136b1f2b024SZhong Yang wndcls.lpfnWndProc=::DefWindowProc; 137b1f2b024SZhong Yang wndcls.hInstance=hInstance; 138b1f2b024SZhong Yang wndcls.hIcon=NULL; 139b1f2b024SZhong Yang wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW); 140b1f2b024SZhong Yang wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); 141b1f2b024SZhong Yang wndcls.lpszMenuName=NULL; 142b1f2b024SZhong Yang wndcls.lpszClassName=lpszClassName; 143b1f2b024SZhong Yang if(!RegisterClassEx(&wndcls)) 144b1f2b024SZhong Yang { 145b1f2b024SZhong Yang return FALSE; 146b1f2b024SZhong Yang } 147b1f2b024SZhong Yang return TRUE; 148b1f2b024SZhong Yang } 149b1f2b024SZhong Yang 150b1f2b024SZhong Yang 151b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�) 152b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(LPCSTR lpszLyrics,int nHighlight) 153b1f2b024SZhong Yang { 154b1f2b024SZhong Yang if(m_lpszLyrics){ 155b1f2b024SZhong Yang delete m_lpszLyrics; 156b1f2b024SZhong Yang m_lpszLyrics=NULL; 157b1f2b024SZhong Yang } 158b1f2b024SZhong Yang if(lpszLyrics){ 159b1f2b024SZhong Yang //���ݽ�����ANSI�汾���ַ���,��Ҫת����Unicode 160b1f2b024SZhong Yang int nLen=MultiByteToWideChar(CP_ACP,0,lpszLyrics,-1, NULL,NULL); 161b1f2b024SZhong Yang if(nLen){ 162b1f2b024SZhong Yang m_lpszLyrics = new WCHAR[nLen+1]; 163b1f2b024SZhong Yang ZeroMemory(m_lpszLyrics,sizeof(WCHAR)*(nLen+1)); 164b1f2b024SZhong Yang MultiByteToWideChar(CP_ACP,0,lpszLyrics,-1,m_lpszLyrics,nLen); 165b1f2b024SZhong Yang } 166b1f2b024SZhong Yang } 167b1f2b024SZhong Yang UpdateLyrics(nHighlight); 168b1f2b024SZhong Yang } 169b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(LPCWSTR lpszLyrics,int nHighlight) 170b1f2b024SZhong Yang { 171b1f2b024SZhong Yang if(m_lpszLyrics){ 172b1f2b024SZhong Yang delete m_lpszLyrics; 173b1f2b024SZhong Yang m_lpszLyrics=NULL; 174b1f2b024SZhong Yang } 175b1f2b024SZhong Yang int nLen=0; 176b1f2b024SZhong Yang if(lpszLyrics){ 177b1f2b024SZhong Yang nLen=lstrlenW(lpszLyrics); 178b1f2b024SZhong Yang } 179b1f2b024SZhong Yang if(nLen>0){ 180b1f2b024SZhong Yang m_lpszLyrics=new WCHAR[nLen+1]; 181b1f2b024SZhong Yang ZeroMemory(m_lpszLyrics,sizeof(WCHAR)*(nLen+1)); 182b1f2b024SZhong Yang CopyMemory(m_lpszLyrics,lpszLyrics,sizeof(WCHAR)*(nLen)); 183b1f2b024SZhong Yang } 184b1f2b024SZhong Yang UpdateLyrics(nHighlight); 185b1f2b024SZhong Yang } 186b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�) 187b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight) 188b1f2b024SZhong Yang { 189b1f2b024SZhong Yang m_nHighlight=nHighlight; 190b1f2b024SZhong Yang if(m_nHighlight<0) 191b1f2b024SZhong Yang m_nHighlight=0; 192b1f2b024SZhong Yang if(m_nHighlight>1000) 193b1f2b024SZhong Yang m_nHighlight=1000; 194b1f2b024SZhong Yang Draw(); 195b1f2b024SZhong Yang } 1962256f4d4SZhong Yang 1972256f4d4SZhong Yang void CLyricsWindow::UpdateLyricTranslate(LPCTSTR lpszLyricTranslate) 1982256f4d4SZhong Yang { 1992256f4d4SZhong Yang m_strTranslate = lpszLyricTranslate; 2002256f4d4SZhong Yang } 2012256f4d4SZhong Yang 202b1f2b024SZhong Yang //�ػ���ʴ��� 203b1f2b024SZhong Yang void CLyricsWindow::Draw() 204b1f2b024SZhong Yang { 205b1f2b024SZhong Yang CRect rcClient; 206b1f2b024SZhong Yang GetClientRect(rcClient); 207b1f2b024SZhong Yang m_nWidth=rcClient.Width(); 208b1f2b024SZhong Yang m_nHeight=rcClient.Height(); 209b1f2b024SZhong Yang //---------------------------------- 210b1f2b024SZhong Yang BITMAPINFO bitmapinfo; 211b1f2b024SZhong Yang bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 212b1f2b024SZhong Yang bitmapinfo.bmiHeader.biBitCount = 32; 213b1f2b024SZhong Yang bitmapinfo.bmiHeader.biHeight = m_nHeight; 214b1f2b024SZhong Yang bitmapinfo.bmiHeader.biWidth = m_nWidth; 215b1f2b024SZhong Yang bitmapinfo.bmiHeader.biPlanes = 1; 216b1f2b024SZhong Yang bitmapinfo.bmiHeader.biCompression=BI_RGB; 217b1f2b024SZhong Yang bitmapinfo.bmiHeader.biXPelsPerMeter=0; 218b1f2b024SZhong Yang bitmapinfo.bmiHeader.biYPelsPerMeter=0; 219b1f2b024SZhong Yang bitmapinfo.bmiHeader.biClrUsed=0; 220b1f2b024SZhong Yang bitmapinfo.bmiHeader.biClrImportant=0; 221b1f2b024SZhong Yang bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8; 222b1f2b024SZhong Yang HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0); 223b1f2b024SZhong Yang HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap); 224b1f2b024SZhong Yang //---------------------------------- 225b1f2b024SZhong Yang Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC); 226b1f2b024SZhong Yang pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias); 227b1f2b024SZhong Yang pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias); 228b1f2b024SZhong Yang DrawLyrics(pGraphics); 229b1f2b024SZhong Yang delete pGraphics; 230b1f2b024SZhong Yang //---------------------------------- 231b1f2b024SZhong Yang //���������� 232b1f2b024SZhong Yang CPoint DestPt(0,0); 233b1f2b024SZhong Yang CSize psize(m_nWidth,m_nHeight); 234b1f2b024SZhong Yang BLENDFUNCTION blendFunc32bpp; 235b1f2b024SZhong Yang blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA; 236b1f2b024SZhong Yang blendFunc32bpp.BlendFlags = 0; 237b1f2b024SZhong Yang blendFunc32bpp.BlendOp = AC_SRC_OVER; 238b1f2b024SZhong Yang blendFunc32bpp.SourceConstantAlpha = 255; 239b1f2b024SZhong Yang HDC hDC=::GetDC(m_hWnd); 240b1f2b024SZhong Yang ::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA); 241b1f2b024SZhong Yang //---------------------------------- 242b1f2b024SZhong Yang //�ͷ���Դ 243b1f2b024SZhong Yang ::SelectObject (m_hCacheDC,hOldBitmap); 244b1f2b024SZhong Yang ::DeleteObject(hBitmap); 245b1f2b024SZhong Yang ::ReleaseDC(m_hWnd,hDC); 246b1f2b024SZhong Yang } 2472256f4d4SZhong Yang 2482256f4d4SZhong Yang void CLyricsWindow::DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool bDrawTranslate) 2492256f4d4SZhong Yang { 2502256f4d4SZhong Yang Gdiplus::REAL fontSize = bDrawTranslate ? m_FontSize * TRANSLATE_FONT_SIZE_FACTOR : m_FontSize; 2512256f4d4SZhong Yang if (fontSize < 1) 2522256f4d4SZhong Yang fontSize = m_FontSize; 2532256f4d4SZhong Yang 2542256f4d4SZhong Yang //----------------------------------------------------------- 2552256f4d4SZhong Yang //������Ӱ 2562256f4d4SZhong Yang if (m_pShadowBrush) { 2572256f4d4SZhong Yang Gdiplus::RectF layoutRect(0, 0, 0, 0); 2582256f4d4SZhong Yang layoutRect = rect; 2592256f4d4SZhong Yang layoutRect.X = layoutRect.X + m_nShadowOffset; 2602256f4d4SZhong Yang layoutRect.Y = layoutRect.Y + m_nShadowOffset; 2612256f4d4SZhong Yang Gdiplus::GraphicsPath* pShadowPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·�� 2622256f4d4SZhong Yang pShadowPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, layoutRect, m_pTextFormat); //�����ּ���·�� 2632256f4d4SZhong Yang pGraphics->FillPath(m_pShadowBrush, pShadowPath);//���·�� 2642256f4d4SZhong Yang delete pShadowPath; //����·�� 2652256f4d4SZhong Yang } 2662256f4d4SZhong Yang 2672256f4d4SZhong Yang //----------------------------------------------------------- 2682256f4d4SZhong Yang //������� 2692256f4d4SZhong Yang Gdiplus::GraphicsPath* pStringPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·�� 2702256f4d4SZhong Yang pStringPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, rect, m_pTextFormat); //�����ּ���·�� 2712256f4d4SZhong Yang if (m_pTextPen) { 2722256f4d4SZhong Yang pGraphics->DrawPath(m_pTextPen, pStringPath);//��·��,���ֱ߿� 2732256f4d4SZhong Yang } 2742256f4d4SZhong Yang Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1, m_TextColor2, rect); 2752256f4d4SZhong Yang pGraphics->FillPath(pBrush, pStringPath);//���·�� 2762256f4d4SZhong Yang delete pBrush;//���ٻ�ˢ 2772256f4d4SZhong Yang if(!bDrawTranslate) 2782256f4d4SZhong Yang DrawHighlightLyrics(pGraphics, pStringPath, rect); 2792256f4d4SZhong Yang delete pStringPath; //����·�� 2802256f4d4SZhong Yang } 2812256f4d4SZhong Yang 282b1f2b024SZhong Yang //���Ƹ�� 283b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics) 284b1f2b024SZhong Yang { 285b1f2b024SZhong Yang //��ȡ�����ֿ�Ⱥ߶� 286b1f2b024SZhong Yang Gdiplus::RectF layoutRect(0,0,0,0); 287b1f2b024SZhong Yang Gdiplus::RectF boundingBox; 288b1f2b024SZhong Yang pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0); 289b1f2b024SZhong Yang //�����ʻ�����λ�� 2902256f4d4SZhong Yang Gdiplus::RectF dstRect; //���ֵľ��� 2912256f4d4SZhong Yang Gdiplus::RectF transRect; //�����ı��ľ��� 292*f5ba4de7SZhong Yang if(m_strTranslate.IsEmpty()) 293*f5ba4de7SZhong Yang { 2942256f4d4SZhong Yang dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, (m_nHeight - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height); 295*f5ba4de7SZhong Yang } 296*f5ba4de7SZhong Yang else 2972256f4d4SZhong Yang { 2982256f4d4SZhong Yang Gdiplus::RectF transBoundingBox; 2992256f4d4SZhong Yang pGraphics->MeasureString(m_strTranslate, -1, m_pFont, layoutRect, m_pTextFormat, &transBoundingBox, 0, 0); 3002256f4d4SZhong Yang Gdiplus::REAL translateHeight = boundingBox.Height * TRANSLATE_FONT_SIZE_FACTOR; 3012256f4d4SZhong Yang Gdiplus::REAL maxWidth = max(boundingBox.Width, transBoundingBox.Width); 3022256f4d4SZhong Yang Gdiplus::REAL gapHeight = boundingBox.Height * 0.2f; //��ʺͷ���֮��ļ�϶ 3032256f4d4SZhong Yang Gdiplus::REAL height = boundingBox.Height + gapHeight + translateHeight; 304*f5ba4de7SZhong Yang Gdiplus::RectF textRect((m_nWidth - maxWidth) / 2, (m_nHeight - height) / 2, maxWidth, height); 3052256f4d4SZhong Yang dstRect = textRect; 3062256f4d4SZhong Yang dstRect.Height = boundingBox.Height; 3072256f4d4SZhong Yang transRect = textRect; 3082256f4d4SZhong Yang transRect.Y += (boundingBox.Height + gapHeight); 3092256f4d4SZhong Yang transRect.Height = translateHeight; 3102256f4d4SZhong Yang } 311b1f2b024SZhong Yang if(dstRect.X<0)dstRect.X=0; 312b1f2b024SZhong Yang if(dstRect.Width>m_nWidth)dstRect.Width=m_nWidth; 3132256f4d4SZhong Yang if (transRect.X < 0)transRect.X = 0; 3142256f4d4SZhong Yang if (transRect.Width > m_nWidth)transRect.Width = m_nWidth; 315b1f2b024SZhong Yang 3162256f4d4SZhong Yang DrawLyricText(pGraphics, m_lpszLyrics, dstRect, false); 3172256f4d4SZhong Yang if (!m_strTranslate.IsEmpty()) 3182256f4d4SZhong Yang DrawLyricText(pGraphics, m_strTranslate, transRect, true); 319b1f2b024SZhong Yang } 320b1f2b024SZhong Yang //���Ƹ������ 321b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect) 322b1f2b024SZhong Yang { 323b1f2b024SZhong Yang if(m_nHighlight<=0)return; 324b1f2b024SZhong Yang Gdiplus::Region* pRegion=NULL; 325b1f2b024SZhong Yang if(m_nHighlight<1000){ 326b1f2b024SZhong Yang Gdiplus::RectF CliptRect(dstRect); 327b1f2b024SZhong Yang CliptRect.Width=CliptRect.Width * m_nHighlight / 1000; 328b1f2b024SZhong Yang pRegion=new Gdiplus::Region(CliptRect); 329b1f2b024SZhong Yang pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace); 330b1f2b024SZhong Yang } 331b1f2b024SZhong Yang //-------------------------------------------- 332b1f2b024SZhong Yang if(m_pHighlightPen){ 333b1f2b024SZhong Yang pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿� 334b1f2b024SZhong Yang } 335b1f2b024SZhong Yang Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect); 336b1f2b024SZhong Yang pGraphics->FillPath (pBrush,pPath);//���·�� 337b1f2b024SZhong Yang delete pBrush;//���ٻ�ˢ 338b1f2b024SZhong Yang //-------------------------------------------- 339b1f2b024SZhong Yang if(pRegion){ 340b1f2b024SZhong Yang pGraphics->ResetClip(); 341b1f2b024SZhong Yang delete pRegion; 342b1f2b024SZhong Yang } 343b1f2b024SZhong Yang } 344b1f2b024SZhong Yang //�������仭ˢ 345b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect) 346b1f2b024SZhong Yang { 347b1f2b024SZhong Yang Gdiplus::PointF pt1; 348b1f2b024SZhong Yang Gdiplus::PointF pt2; 349b1f2b024SZhong Yang Gdiplus::Brush* pBrush=NULL; 350b1f2b024SZhong Yang switch (TextGradientMode) 351b1f2b024SZhong Yang { 352b1f2b024SZhong Yang case LyricsGradientMode_Two://��ɫ���� 353b1f2b024SZhong Yang { 354b1f2b024SZhong Yang Gdiplus::PointF point1(dstRect.X,dstRect.Y); 355b1f2b024SZhong Yang Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height); 356b1f2b024SZhong Yang pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2); 357b1f2b024SZhong Yang ((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY); 358b1f2b024SZhong Yang break; 359b1f2b024SZhong Yang } 360b1f2b024SZhong Yang 361b1f2b024SZhong Yang case LyricsGradientMode_Three://��ɫ���� 362b1f2b024SZhong Yang { 363b1f2b024SZhong Yang Gdiplus::PointF point1(dstRect.X,dstRect.Y); 364b1f2b024SZhong Yang Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2); 365b1f2b024SZhong Yang pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2); 366b1f2b024SZhong Yang ((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY); 367b1f2b024SZhong Yang break; 368b1f2b024SZhong Yang } 369b1f2b024SZhong Yang 370b1f2b024SZhong Yang default://���� 371b1f2b024SZhong Yang { 372b1f2b024SZhong Yang pBrush=new Gdiplus::SolidBrush(Color1); 373b1f2b024SZhong Yang break; 374b1f2b024SZhong Yang } 375b1f2b024SZhong Yang } 376b1f2b024SZhong Yang return pBrush; 377b1f2b024SZhong Yang } 378b1f2b024SZhong Yang 379b1f2b024SZhong Yang //���ø����ɫ 380b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1) 381b1f2b024SZhong Yang { 382b1f2b024SZhong Yang CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None); 383b1f2b024SZhong Yang } 384b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode) 385b1f2b024SZhong Yang { 386b1f2b024SZhong Yang m_TextColor1=TextColor1; 387b1f2b024SZhong Yang m_TextColor2=TextColor2; 388b1f2b024SZhong Yang m_TextGradientMode=TextGradientMode; 389b1f2b024SZhong Yang 390b1f2b024SZhong Yang } 391b1f2b024SZhong Yang //���ø�ʱ߿� 392b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth) 393b1f2b024SZhong Yang { 394b1f2b024SZhong Yang if(m_pTextPen){ 395b1f2b024SZhong Yang delete m_pTextPen; 396b1f2b024SZhong Yang m_pTextPen=NULL; 397b1f2b024SZhong Yang } 398b1f2b024SZhong Yang if(BorderColor.GetA()>0 && BorderWidth>0) 399b1f2b024SZhong Yang m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth); 400b1f2b024SZhong Yang } 401b1f2b024SZhong Yang //���ø��������ɫ 402b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1) 403b1f2b024SZhong Yang { 404b1f2b024SZhong Yang CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None); 405b1f2b024SZhong Yang } 406b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode) 407b1f2b024SZhong Yang { 408b1f2b024SZhong Yang m_HighlightColor1=TextColor1; 409b1f2b024SZhong Yang m_HighlightColor2=TextColor2; 410b1f2b024SZhong Yang m_HighlightGradientMode=TextGradientMode; 411b1f2b024SZhong Yang 412b1f2b024SZhong Yang } 413b1f2b024SZhong Yang //���ø�����ʱ߿� 414b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth) 415b1f2b024SZhong Yang { 416b1f2b024SZhong Yang if(m_pHighlightPen){ 417b1f2b024SZhong Yang delete m_pHighlightPen; 418b1f2b024SZhong Yang m_pHighlightPen=NULL; 419b1f2b024SZhong Yang } 420b1f2b024SZhong Yang if(BorderColor.GetA()>0 && BorderWidth>0) 421b1f2b024SZhong Yang m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth); 422b1f2b024SZhong Yang } 423b1f2b024SZhong Yang //���ø����Ӱ 424b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset) 425b1f2b024SZhong Yang { 426b1f2b024SZhong Yang if(m_pShadowBrush){ 427b1f2b024SZhong Yang delete m_pShadowBrush; 428b1f2b024SZhong Yang m_pShadowBrush=NULL; 429b1f2b024SZhong Yang } 430b1f2b024SZhong Yang if(ShadowColor.GetA()>0 && nShadowOffset>0){ 431b1f2b024SZhong Yang m_nShadowOffset=nShadowOffset; 432b1f2b024SZhong Yang m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor); 433b1f2b024SZhong Yang }else{ 434b1f2b024SZhong Yang m_nShadowOffset=0; 435b1f2b024SZhong Yang } 436b1f2b024SZhong Yang } 437b1f2b024SZhong Yang //���ø������ 438b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit) 439b1f2b024SZhong Yang { 440b1f2b024SZhong Yang if(m_pFont){ 441b1f2b024SZhong Yang delete m_pFont; 442b1f2b024SZhong Yang m_pFont=NULL; 443b1f2b024SZhong Yang } 444b1f2b024SZhong Yang Gdiplus::FontFamily family(familyName,NULL); 445b1f2b024SZhong Yang Gdiplus::Status lastResult = family.GetLastStatus(); 446b1f2b024SZhong Yang if (lastResult != Gdiplus::Ok) 447b1f2b024SZhong Yang { 448b1f2b024SZhong Yang HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); 449b1f2b024SZhong Yang LOGFONTW lf; 450b1f2b024SZhong Yang ZeroMemory(&lf,sizeof(LOGFONTW)); 451b1f2b024SZhong Yang GetObjectW(hFont,sizeof(LOGFONTW),&lf); 452b1f2b024SZhong Yang Gdiplus::FontFamily family2(lf.lfFaceName,NULL); 453b1f2b024SZhong Yang m_pFont=new Gdiplus::Font(&family2,emSize,style,unit); 454b1f2b024SZhong Yang }else{ 455b1f2b024SZhong Yang m_pFont=new Gdiplus::Font(&family,emSize,style,unit); 456b1f2b024SZhong Yang } 457b1f2b024SZhong Yang //---------------- 458b1f2b024SZhong Yang //����һЩ��������,����·��ʱҪ�õ� 459b1f2b024SZhong Yang m_pFont->GetFamily (m_pFontFamily); 460b1f2b024SZhong Yang m_FontSize=m_pFont->GetSize (); 461b1f2b024SZhong Yang m_FontStyle=m_pFont->GetStyle (); 462b1f2b024SZhong Yang 463b1f2b024SZhong Yang 464b1f2b024SZhong Yang 465b1f2b024SZhong Yang } 466b1f2b024SZhong Yang 4672256f4d4SZhong Yang void CLyricsWindow::SetLyricDoubleLine(bool doubleLine) 4682256f4d4SZhong Yang { 4692256f4d4SZhong Yang m_bDoubleLine = doubleLine; 4702256f4d4SZhong Yang } 4712256f4d4SZhong Yang 4722256f4d4SZhong Yang void CLyricsWindow::SetNextLyric(LPCTSTR lpszNextLyric) 4732256f4d4SZhong Yang { 4742256f4d4SZhong Yang m_strNextLyric = lpszNextLyric; 4752256f4d4SZhong Yang } 4762256f4d4SZhong Yang 477b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point) 478b1f2b024SZhong Yang { 479b1f2b024SZhong Yang CWnd::OnLButtonDown(nFlags, point); 480b1f2b024SZhong Yang ReleaseCapture(); 481b1f2b024SZhong Yang SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL); 482b1f2b024SZhong Yang } 483b1f2b024SZhong Yang 484b1f2b024SZhong Yang void CLyricsWindow::OnLButtonUp(UINT nFlags, CPoint point) 485b1f2b024SZhong Yang { 486b1f2b024SZhong Yang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 487b1f2b024SZhong Yang 488b1f2b024SZhong Yang CWnd::OnLButtonUp(nFlags, point); 489b1f2b024SZhong Yang } 490