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_nHighlight=NULL ; //������ʵİٷֱ� 0--100 21b1f2b024SZhong Yang m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ 22b1f2b024SZhong Yang m_pTextPen=NULL ; //��ͨ��ʱ߿� 23b1f2b024SZhong Yang m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ 24b1f2b024SZhong Yang m_pHighlightPen=NULL ; //������ʱ߿� 25b1f2b024SZhong Yang m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ 2654359200SZhong Yang m_nShadowOffset=1 ; //��Ӱƫ�� 27b1f2b024SZhong Yang m_pFont=NULL ; //GDIPlus���� 28b1f2b024SZhong Yang m_FontStyle=NULL ; 29b1f2b024SZhong Yang m_FontSize=NULL ; 30b1f2b024SZhong Yang m_pTextFormat=NULL; 31b1f2b024SZhong Yang //--------------------------------- 32b1f2b024SZhong Yang m_pFontFamily=new Gdiplus::FontFamily(); 33b1f2b024SZhong Yang m_pTextFormat=new Gdiplus::StringFormat(); 34b1f2b024SZhong Yang m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������ 35b1f2b024SZhong Yang m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ 36b1f2b024SZhong Yang m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ 37b1f2b024SZhong Yang //--------------------------------- 3854359200SZhong Yang //SetLyricsFont(L"���ź�", 40, Gdiplus::FontStyle::FontStyleRegular); 3954359200SZhong Yang //SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three); 40b1f2b024SZhong Yang //SetLyricsBorder(Gdiplus::Color::Black,1); 4154359200SZhong Yang SetLyricsShadow(Gdiplus::Color(150,0,0,0),1); 4254359200SZhong Yang //SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three); 43b1f2b024SZhong Yang //SetHighlightBorder(Gdiplus::Color::Black,1); 44b1f2b024SZhong Yang 45b1f2b024SZhong Yang } 46b1f2b024SZhong Yang 47b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow() 48b1f2b024SZhong Yang { 49b1f2b024SZhong Yang if(m_pTextPen){ 50b1f2b024SZhong Yang delete m_pTextPen; 51b1f2b024SZhong Yang m_pTextPen=NULL; 52b1f2b024SZhong Yang } 53b1f2b024SZhong Yang if(m_pHighlightPen){ 54b1f2b024SZhong Yang delete m_pHighlightPen; 55b1f2b024SZhong Yang m_pHighlightPen=NULL; 56b1f2b024SZhong Yang } 57b1f2b024SZhong Yang if(m_pShadowBrush){ 58b1f2b024SZhong Yang delete m_pShadowBrush; 59b1f2b024SZhong Yang m_pShadowBrush=NULL; 60b1f2b024SZhong Yang } 61b1f2b024SZhong Yang if(m_pFontFamily){ 62b1f2b024SZhong Yang delete m_pFontFamily; 63b1f2b024SZhong Yang m_pFontFamily=NULL; 64b1f2b024SZhong Yang } 65b1f2b024SZhong Yang if(m_pTextFormat){ 66b1f2b024SZhong Yang delete m_pTextFormat; 67b1f2b024SZhong Yang m_pTextFormat=NULL; 68b1f2b024SZhong Yang } 69b1f2b024SZhong Yang if(m_pFont){ 70b1f2b024SZhong Yang delete m_pFont; 71b1f2b024SZhong Yang m_pFont=NULL; 72b1f2b024SZhong Yang } 73b1f2b024SZhong Yang } 74b1f2b024SZhong Yang 75b1f2b024SZhong Yang 76b1f2b024SZhong Yang BEGIN_MESSAGE_MAP(CLyricsWindow, CWnd) 77b1f2b024SZhong Yang 78b1f2b024SZhong Yang ON_WM_LBUTTONDOWN() 79b1f2b024SZhong Yang ON_WM_LBUTTONUP() 809dc20028Szhongyang ON_WM_MOUSEMOVE() 819dc20028Szhongyang ON_WM_MOUSEHOVER() 829dc20028Szhongyang ON_WM_MOUSELEAVE() 83c7bf0801Szhongyang ON_WM_SIZING() 84b1f2b024SZhong Yang END_MESSAGE_MAP() 85b1f2b024SZhong Yang 86b1f2b024SZhong Yang 87b1f2b024SZhong Yang 882256f4d4SZhong Yang BOOL CLyricsWindow::Create(int nHeight) 89b1f2b024SZhong Yang { 902256f4d4SZhong Yang return CLyricsWindow::Create(_T("CometLyricsWindow"), -1, nHeight); 91b1f2b024SZhong Yang } 92b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName) 93b1f2b024SZhong Yang { 94b1f2b024SZhong Yang return CLyricsWindow::Create(lpszClassName,-1,-1); 95b1f2b024SZhong Yang } 96b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight) 97b1f2b024SZhong Yang { 98b1f2b024SZhong Yang if(!RegisterWndClass(lpszClassName)) 99b1f2b024SZhong Yang { 100b1f2b024SZhong Yang TRACE("Class��Registration��Failedn"); 101b1f2b024SZhong Yang } 102b1f2b024SZhong Yang //-------------------------------------------- 103b1f2b024SZhong Yang //ȡ�����湤������ 104b1f2b024SZhong Yang RECT rcWork; 105b1f2b024SZhong Yang SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL); 106b1f2b024SZhong Yang int nWorkWidth=rcWork.right-rcWork.left; 107b1f2b024SZhong Yang int nWorkHeight=rcWork.bottom-rcWork.top; 108b1f2b024SZhong Yang //δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ 109c7bf0801Szhongyang if(nWidth<0)nWidth=nWorkWidth*2/3; //Ĭ�Ͽ��Ϊ�����ȵ�2/3 110b1f2b024SZhong Yang if(nHeight<0)nHeight=150; 111b1f2b024SZhong Yang //������ߡ�����λ��,�ô�������Ļ�·� 112b1f2b024SZhong Yang int x=rcWork.left+( (nWorkWidth-nWidth)/2 ); 113b1f2b024SZhong Yang int y=rcWork.bottom-nHeight; 114b1f2b024SZhong Yang //-------------------------------------------- 115c7bf0801Szhongyang DWORD dwStyle=WS_POPUP|WS_VISIBLE|WS_THICKFRAME; 116b1f2b024SZhong Yang DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED; 117b1f2b024SZhong Yang return CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL); 118b1f2b024SZhong Yang } 119b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName) 120b1f2b024SZhong Yang { 121b1f2b024SZhong Yang HINSTANCE hInstance=AfxGetInstanceHandle(); 122b1f2b024SZhong Yang WNDCLASSEX wndcls; 123b1f2b024SZhong Yang memset(&wndcls,0,sizeof(WNDCLASSEX)); 124b1f2b024SZhong Yang wndcls.cbSize=sizeof(WNDCLASSEX); 125b1f2b024SZhong Yang if(GetClassInfoEx(hInstance,lpszClassName,&wndcls)) 126b1f2b024SZhong Yang { 127b1f2b024SZhong Yang return TRUE; 128b1f2b024SZhong Yang } 129b1f2b024SZhong Yang if(GetClassInfoEx(NULL,lpszClassName,&wndcls)) 130b1f2b024SZhong Yang { 131b1f2b024SZhong Yang return TRUE; 132b1f2b024SZhong Yang } 133b1f2b024SZhong Yang 134b1f2b024SZhong Yang wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; 135b1f2b024SZhong Yang wndcls.lpfnWndProc=::DefWindowProc; 136b1f2b024SZhong Yang wndcls.hInstance=hInstance; 137b1f2b024SZhong Yang wndcls.hIcon=NULL; 138b1f2b024SZhong Yang wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW); 139b1f2b024SZhong Yang wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); 140b1f2b024SZhong Yang wndcls.lpszMenuName=NULL; 141b1f2b024SZhong Yang wndcls.lpszClassName=lpszClassName; 142b1f2b024SZhong Yang if(!RegisterClassEx(&wndcls)) 143b1f2b024SZhong Yang { 144b1f2b024SZhong Yang return FALSE; 145b1f2b024SZhong Yang } 146b1f2b024SZhong Yang return TRUE; 147b1f2b024SZhong Yang } 148b1f2b024SZhong Yang 149b1f2b024SZhong Yang 150b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�) 151be1c6be2Szhongyang void CLyricsWindow::UpdateLyrics(LPCTSTR lpszLyrics,int nHighlight) 152b1f2b024SZhong Yang { 153be1c6be2Szhongyang m_lpszLyrics = lpszLyrics; 154b1f2b024SZhong Yang UpdateLyrics(nHighlight); 155b1f2b024SZhong Yang } 156b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�) 157b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight) 158b1f2b024SZhong Yang { 159b1f2b024SZhong Yang m_nHighlight=nHighlight; 160b1f2b024SZhong Yang if(m_nHighlight<0) 161b1f2b024SZhong Yang m_nHighlight=0; 162b1f2b024SZhong Yang if(m_nHighlight>1000) 163b1f2b024SZhong Yang m_nHighlight=1000; 164b1f2b024SZhong Yang Draw(); 165b1f2b024SZhong Yang } 1662256f4d4SZhong Yang 1672256f4d4SZhong Yang void CLyricsWindow::UpdateLyricTranslate(LPCTSTR lpszLyricTranslate) 1682256f4d4SZhong Yang { 1692256f4d4SZhong Yang m_strTranslate = lpszLyricTranslate; 1702256f4d4SZhong Yang } 1712256f4d4SZhong Yang 172b1f2b024SZhong Yang //�ػ���ʴ��� 173b1f2b024SZhong Yang void CLyricsWindow::Draw() 174b1f2b024SZhong Yang { 175b1f2b024SZhong Yang CRect rcClient; 176c7bf0801Szhongyang GetWindowRect(rcClient); 177b1f2b024SZhong Yang m_nWidth=rcClient.Width(); 178b1f2b024SZhong Yang m_nHeight=rcClient.Height(); 179b1f2b024SZhong Yang //---------------------------------- 180b1f2b024SZhong Yang BITMAPINFO bitmapinfo; 181b1f2b024SZhong Yang bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 182b1f2b024SZhong Yang bitmapinfo.bmiHeader.biBitCount = 32; 183b1f2b024SZhong Yang bitmapinfo.bmiHeader.biHeight = m_nHeight; 184b1f2b024SZhong Yang bitmapinfo.bmiHeader.biWidth = m_nWidth; 185b1f2b024SZhong Yang bitmapinfo.bmiHeader.biPlanes = 1; 186b1f2b024SZhong Yang bitmapinfo.bmiHeader.biCompression=BI_RGB; 187b1f2b024SZhong Yang bitmapinfo.bmiHeader.biXPelsPerMeter=0; 188b1f2b024SZhong Yang bitmapinfo.bmiHeader.biYPelsPerMeter=0; 189b1f2b024SZhong Yang bitmapinfo.bmiHeader.biClrUsed=0; 190b1f2b024SZhong Yang bitmapinfo.bmiHeader.biClrImportant=0; 191b1f2b024SZhong Yang bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8; 192b1f2b024SZhong Yang HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0); 193b1f2b024SZhong Yang HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap); 194b1f2b024SZhong Yang //---------------------------------- 195b1f2b024SZhong Yang Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC); 196b1f2b024SZhong Yang pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias); 197b1f2b024SZhong Yang pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias); 19832f06d7fSZhong Yang 19932f06d7fSZhong Yang //���ư������� 200c7bf0801Szhongyang if(m_bDrawBackground) 20132f06d7fSZhong Yang { 202c7bf0801Szhongyang BYTE alpha = m_bHot ? 80 : 2; 203c7bf0801Szhongyang Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(Gdiplus::Color(alpha, 255, 255, 255)); 204c7bf0801Szhongyang pGraphics->FillRectangle(pBrush, 0, 0, rcClient.Width(), rcClient.Height()); 20532f06d7fSZhong Yang delete pBrush; 20632f06d7fSZhong Yang } 207*b6d5f9dcSzhongyang if (m_bDoubleLine) 208*b6d5f9dcSzhongyang DrawLyricsDoubleLine(pGraphics); 209*b6d5f9dcSzhongyang else 210b1f2b024SZhong Yang DrawLyrics(pGraphics); 211b1f2b024SZhong Yang delete pGraphics; 212b1f2b024SZhong Yang //---------------------------------- 213b1f2b024SZhong Yang //���������� 214b1f2b024SZhong Yang CPoint DestPt(0,0); 215b1f2b024SZhong Yang CSize psize(m_nWidth,m_nHeight); 216b1f2b024SZhong Yang BLENDFUNCTION blendFunc32bpp; 217b1f2b024SZhong Yang blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA; 218b1f2b024SZhong Yang blendFunc32bpp.BlendFlags = 0; 219b1f2b024SZhong Yang blendFunc32bpp.BlendOp = AC_SRC_OVER; 220be1c6be2Szhongyang blendFunc32bpp.SourceConstantAlpha = m_alpha; 221b1f2b024SZhong Yang HDC hDC=::GetDC(m_hWnd); 222b1f2b024SZhong Yang ::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA); 223b1f2b024SZhong Yang //---------------------------------- 224b1f2b024SZhong Yang //�ͷ���Դ 225b1f2b024SZhong Yang ::SelectObject (m_hCacheDC,hOldBitmap); 226b1f2b024SZhong Yang ::DeleteObject(hBitmap); 227b1f2b024SZhong Yang ::ReleaseDC(m_hWnd,hDC); 228b1f2b024SZhong Yang } 2292256f4d4SZhong Yang 230*b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool bDrawHighlight, bool bDrawTranslate) 2312256f4d4SZhong Yang { 2322256f4d4SZhong Yang Gdiplus::REAL fontSize = bDrawTranslate ? m_FontSize * TRANSLATE_FONT_SIZE_FACTOR : m_FontSize; 2332256f4d4SZhong Yang if (fontSize < 1) 2342256f4d4SZhong Yang fontSize = m_FontSize; 2352256f4d4SZhong Yang 236e3d88825Szhongyang Gdiplus::REAL textWidth = rect.Width; 237e3d88825Szhongyang Gdiplus::REAL highlighWidth = rect.Width * m_nHighlight / 1000; 238*b6d5f9dcSzhongyang 239*b6d5f9dcSzhongyang if (!bDrawHighlight && !bDrawTranslate) 240*b6d5f9dcSzhongyang { 241*b6d5f9dcSzhongyang if (rect.X < 0) 242*b6d5f9dcSzhongyang rect.X = 0; 243*b6d5f9dcSzhongyang } 244*b6d5f9dcSzhongyang else 245*b6d5f9dcSzhongyang { 246e3d88825Szhongyang //����ı���ȴ��ڿؼ���ȣ���Ҫ���ݷָ��λ�ù����ı� 247e3d88825Szhongyang if (textWidth > m_nWidth) 248e3d88825Szhongyang { 249e3d88825Szhongyang //����ָ��λ�ã���ʽ��ȣ�ʣ�µĿ���Ѿ�С�ڿؼ���ȵ�һ�룬��ʱʹ�ı��Ҳ�Ϳؼ��Ҳ���� 250e3d88825Szhongyang if (textWidth - highlighWidth < m_nWidth / 2) 251e3d88825Szhongyang { 252e3d88825Szhongyang rect.X = m_nWidth - textWidth; 253e3d88825Szhongyang } 254e3d88825Szhongyang //�ָ�λ��ʣ�µĿ�Ȼ�û�е�С�ڿؼ���ȵ�һ�룬���Ƿָ�λ�õĿ���Ѿ����ڿؼ���ȵ�һ��ʱ����Ҫ�ƶ��ı�ʹ�ָ�λ�������ڿؼ����м� 255e3d88825Szhongyang else if (highlighWidth > m_nWidth / 2) 256e3d88825Szhongyang { 257e3d88825Szhongyang rect.X = m_nWidth / 2 - highlighWidth; 258e3d88825Szhongyang } 259e3d88825Szhongyang //�ָ�λ�û������ؼ���ȵ�һ��ʱ��ʹ�ı����Ϳؼ������� 260e3d88825Szhongyang else 261e3d88825Szhongyang { 262e3d88825Szhongyang rect.X = 0; 263e3d88825Szhongyang } 264e3d88825Szhongyang } 265*b6d5f9dcSzhongyang } 266e3d88825Szhongyang 2672256f4d4SZhong Yang //----------------------------------------------------------- 2682256f4d4SZhong Yang //������Ӱ 2692256f4d4SZhong Yang if (m_pShadowBrush) { 2702256f4d4SZhong Yang Gdiplus::RectF layoutRect(0, 0, 0, 0); 2712256f4d4SZhong Yang layoutRect = rect; 2722256f4d4SZhong Yang layoutRect.X = layoutRect.X + m_nShadowOffset; 2732256f4d4SZhong Yang layoutRect.Y = layoutRect.Y + m_nShadowOffset; 2742256f4d4SZhong Yang Gdiplus::GraphicsPath* pShadowPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·�� 2752256f4d4SZhong Yang pShadowPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, layoutRect, m_pTextFormat); //�����ּ���·�� 2762256f4d4SZhong Yang pGraphics->FillPath(m_pShadowBrush, pShadowPath);//���·�� 2772256f4d4SZhong Yang delete pShadowPath; //����·�� 2782256f4d4SZhong Yang } 2792256f4d4SZhong Yang 2802256f4d4SZhong Yang //----------------------------------------------------------- 2812256f4d4SZhong Yang //������� 2822256f4d4SZhong Yang Gdiplus::GraphicsPath* pStringPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·�� 2832256f4d4SZhong Yang pStringPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, rect, m_pTextFormat); //�����ּ���·�� 2842256f4d4SZhong Yang if (m_pTextPen) { 2852256f4d4SZhong Yang pGraphics->DrawPath(m_pTextPen, pStringPath);//��·��,���ֱ߿� 2862256f4d4SZhong Yang } 2872256f4d4SZhong Yang Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1, m_TextColor2, rect); 2882256f4d4SZhong Yang pGraphics->FillPath(pBrush, pStringPath);//���·�� 2892256f4d4SZhong Yang delete pBrush;//���ٻ�ˢ 290*b6d5f9dcSzhongyang if(bDrawHighlight) 2912256f4d4SZhong Yang DrawHighlightLyrics(pGraphics, pStringPath, rect); 2922256f4d4SZhong Yang delete pStringPath; //����·�� 2932256f4d4SZhong Yang } 2942256f4d4SZhong Yang 295b1f2b024SZhong Yang //���Ƹ�� 296b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics) 297b1f2b024SZhong Yang { 298b1f2b024SZhong Yang //��ȡ�����ֿ�Ⱥ߶� 299b1f2b024SZhong Yang Gdiplus::RectF layoutRect(0,0,0,0); 300b1f2b024SZhong Yang Gdiplus::RectF boundingBox; 301b1f2b024SZhong Yang pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0); 302b1f2b024SZhong Yang //�����ʻ�����λ�� 3032256f4d4SZhong Yang Gdiplus::RectF dstRect; //���ֵľ��� 3042256f4d4SZhong Yang Gdiplus::RectF transRect; //�����ı��ľ��� 305*b6d5f9dcSzhongyang bool bDrawTranslate = m_bShowTranslate && !m_strTranslate.IsEmpty(); 306*b6d5f9dcSzhongyang if(!bDrawTranslate) 307f5ba4de7SZhong Yang { 3082256f4d4SZhong Yang dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, (m_nHeight - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height); 309f5ba4de7SZhong Yang } 310f5ba4de7SZhong Yang else 3112256f4d4SZhong Yang { 3122256f4d4SZhong Yang Gdiplus::RectF transBoundingBox; 3132256f4d4SZhong Yang pGraphics->MeasureString(m_strTranslate, -1, m_pFont, layoutRect, m_pTextFormat, &transBoundingBox, 0, 0); 3142256f4d4SZhong Yang Gdiplus::REAL translateHeight = boundingBox.Height * TRANSLATE_FONT_SIZE_FACTOR; 3152256f4d4SZhong Yang Gdiplus::REAL maxWidth = max(boundingBox.Width, transBoundingBox.Width); 3162256f4d4SZhong Yang Gdiplus::REAL gapHeight = boundingBox.Height * 0.2f; //��ʺͷ���֮��ļ�϶ 3172256f4d4SZhong Yang Gdiplus::REAL height = boundingBox.Height + gapHeight + translateHeight; 318f5ba4de7SZhong Yang Gdiplus::RectF textRect((m_nWidth - maxWidth) / 2, (m_nHeight - height) / 2, maxWidth, height); 3192256f4d4SZhong Yang dstRect = textRect; 3202256f4d4SZhong Yang dstRect.Height = boundingBox.Height; 3212256f4d4SZhong Yang transRect = textRect; 3222256f4d4SZhong Yang transRect.Y += (boundingBox.Height + gapHeight); 3232256f4d4SZhong Yang transRect.Height = translateHeight; 3242256f4d4SZhong Yang } 325e3d88825Szhongyang //if(dstRect.X<0)dstRect.X=0; 326e3d88825Szhongyang //if(dstRect.Width>m_nWidth)dstRect.Width=m_nWidth; 327e3d88825Szhongyang //if (transRect.X < 0)transRect.X = 0; 328e3d88825Szhongyang //if (transRect.Width > m_nWidth)transRect.Width = m_nWidth; 329b1f2b024SZhong Yang 330*b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true); 331*b6d5f9dcSzhongyang if (bDrawTranslate) 332*b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_strTranslate, transRect, false, true); 333b1f2b024SZhong Yang } 334*b6d5f9dcSzhongyang 335*b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricsDoubleLine(Gdiplus::Graphics* pGraphics) 336*b6d5f9dcSzhongyang { 337*b6d5f9dcSzhongyang static bool bSwap = false; 338*b6d5f9dcSzhongyang if (m_lyricChangeFlag) //�����ʷ����˸ı䣬����ǰ��ʺ���һ���ʵ�λ�� 339*b6d5f9dcSzhongyang bSwap = !bSwap; 340*b6d5f9dcSzhongyang //��ȡ�����ֿ�Ⱥ߶� 341*b6d5f9dcSzhongyang Gdiplus::RectF layoutRect(0, 0, 0, 0); 342*b6d5f9dcSzhongyang Gdiplus::RectF boundingBox; 343*b6d5f9dcSzhongyang pGraphics->MeasureString(m_lpszLyrics, -1, m_pFont, layoutRect, m_pTextFormat, &boundingBox, 0, 0); 344*b6d5f9dcSzhongyang Gdiplus::RectF nextBoundingBox; 345*b6d5f9dcSzhongyang pGraphics->MeasureString(m_strNextLyric, -1, m_pFont, layoutRect, m_pTextFormat, &nextBoundingBox, 0, 0); 346*b6d5f9dcSzhongyang //�����ʻ�����λ�� 347*b6d5f9dcSzhongyang Gdiplus::RectF dstRect; //���ֵľ��� 348*b6d5f9dcSzhongyang Gdiplus::RectF nextRect; //��һ���ı��ľ��� 349*b6d5f9dcSzhongyang 350*b6d5f9dcSzhongyang dstRect = Gdiplus::RectF(0, (m_nHeight / 2 - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height); 351*b6d5f9dcSzhongyang nextRect = Gdiplus::RectF(m_nWidth - nextBoundingBox.Width, dstRect.Y + m_nHeight / 2, nextBoundingBox.Width, nextBoundingBox.Height); 352*b6d5f9dcSzhongyang 353*b6d5f9dcSzhongyang if (bSwap) 354*b6d5f9dcSzhongyang { 355*b6d5f9dcSzhongyang std::swap(dstRect.Y, nextRect.Y); 356*b6d5f9dcSzhongyang nextRect.X = 0; 357*b6d5f9dcSzhongyang dstRect.X = m_nWidth - dstRect.Width; 358*b6d5f9dcSzhongyang } 359*b6d5f9dcSzhongyang 360*b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true); 361*b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_strNextLyric, nextRect, false); 362*b6d5f9dcSzhongyang 363*b6d5f9dcSzhongyang } 364*b6d5f9dcSzhongyang 365b1f2b024SZhong Yang //���Ƹ������ 366b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect) 367b1f2b024SZhong Yang { 368b1f2b024SZhong Yang if(m_nHighlight<=0)return; 369b1f2b024SZhong Yang Gdiplus::Region* pRegion=NULL; 370b1f2b024SZhong Yang if(m_nHighlight<1000){ 371b1f2b024SZhong Yang Gdiplus::RectF CliptRect(dstRect); 372b1f2b024SZhong Yang CliptRect.Width=CliptRect.Width * m_nHighlight / 1000; 373b1f2b024SZhong Yang pRegion=new Gdiplus::Region(CliptRect); 374b1f2b024SZhong Yang pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace); 375b1f2b024SZhong Yang } 376b1f2b024SZhong Yang //-------------------------------------------- 377b1f2b024SZhong Yang if(m_pHighlightPen){ 378b1f2b024SZhong Yang pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿� 379b1f2b024SZhong Yang } 380b1f2b024SZhong Yang Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect); 381b1f2b024SZhong Yang pGraphics->FillPath (pBrush,pPath);//���·�� 382b1f2b024SZhong Yang delete pBrush;//���ٻ�ˢ 383b1f2b024SZhong Yang //-------------------------------------------- 384b1f2b024SZhong Yang if(pRegion){ 385b1f2b024SZhong Yang pGraphics->ResetClip(); 386b1f2b024SZhong Yang delete pRegion; 387b1f2b024SZhong Yang } 388b1f2b024SZhong Yang } 389b1f2b024SZhong Yang //�������仭ˢ 390b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect) 391b1f2b024SZhong Yang { 392b1f2b024SZhong Yang Gdiplus::PointF pt1; 393b1f2b024SZhong Yang Gdiplus::PointF pt2; 394b1f2b024SZhong Yang Gdiplus::Brush* pBrush=NULL; 395b1f2b024SZhong Yang switch (TextGradientMode) 396b1f2b024SZhong Yang { 397b1f2b024SZhong Yang case LyricsGradientMode_Two://��ɫ���� 398b1f2b024SZhong Yang { 399b1f2b024SZhong Yang Gdiplus::PointF point1(dstRect.X,dstRect.Y); 400b1f2b024SZhong Yang Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height); 401b1f2b024SZhong Yang pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2); 402b1f2b024SZhong Yang ((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY); 403b1f2b024SZhong Yang break; 404b1f2b024SZhong Yang } 405b1f2b024SZhong Yang 406b1f2b024SZhong Yang case LyricsGradientMode_Three://��ɫ���� 407b1f2b024SZhong Yang { 408b1f2b024SZhong Yang Gdiplus::PointF point1(dstRect.X,dstRect.Y); 409b1f2b024SZhong Yang Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2); 410b1f2b024SZhong Yang pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2); 411b1f2b024SZhong Yang ((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY); 412b1f2b024SZhong Yang break; 413b1f2b024SZhong Yang } 414b1f2b024SZhong Yang 415b1f2b024SZhong Yang default://���� 416b1f2b024SZhong Yang { 417b1f2b024SZhong Yang pBrush=new Gdiplus::SolidBrush(Color1); 418b1f2b024SZhong Yang break; 419b1f2b024SZhong Yang } 420b1f2b024SZhong Yang } 421b1f2b024SZhong Yang return pBrush; 422b1f2b024SZhong Yang } 423b1f2b024SZhong Yang 424b1f2b024SZhong Yang //���ø����ɫ 425b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1) 426b1f2b024SZhong Yang { 427b1f2b024SZhong Yang CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None); 428b1f2b024SZhong Yang } 429b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode) 430b1f2b024SZhong Yang { 431b1f2b024SZhong Yang m_TextColor1=TextColor1; 432b1f2b024SZhong Yang m_TextColor2=TextColor2; 433b1f2b024SZhong Yang m_TextGradientMode=TextGradientMode; 434b1f2b024SZhong Yang 435b1f2b024SZhong Yang } 436b1f2b024SZhong Yang //���ø�ʱ߿� 437b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth) 438b1f2b024SZhong Yang { 439b1f2b024SZhong Yang if(m_pTextPen){ 440b1f2b024SZhong Yang delete m_pTextPen; 441b1f2b024SZhong Yang m_pTextPen=NULL; 442b1f2b024SZhong Yang } 443b1f2b024SZhong Yang if(BorderColor.GetA()>0 && BorderWidth>0) 444b1f2b024SZhong Yang m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth); 445b1f2b024SZhong Yang } 446b1f2b024SZhong Yang //���ø��������ɫ 447b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1) 448b1f2b024SZhong Yang { 449b1f2b024SZhong Yang CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None); 450b1f2b024SZhong Yang } 451b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode) 452b1f2b024SZhong Yang { 453b1f2b024SZhong Yang m_HighlightColor1=TextColor1; 454b1f2b024SZhong Yang m_HighlightColor2=TextColor2; 455b1f2b024SZhong Yang m_HighlightGradientMode=TextGradientMode; 456b1f2b024SZhong Yang 457b1f2b024SZhong Yang } 458b1f2b024SZhong Yang //���ø�����ʱ߿� 459b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth) 460b1f2b024SZhong Yang { 461b1f2b024SZhong Yang if(m_pHighlightPen){ 462b1f2b024SZhong Yang delete m_pHighlightPen; 463b1f2b024SZhong Yang m_pHighlightPen=NULL; 464b1f2b024SZhong Yang } 465b1f2b024SZhong Yang if(BorderColor.GetA()>0 && BorderWidth>0) 466b1f2b024SZhong Yang m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth); 467b1f2b024SZhong Yang } 468b1f2b024SZhong Yang //���ø����Ӱ 469b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset) 470b1f2b024SZhong Yang { 471b1f2b024SZhong Yang if(m_pShadowBrush){ 472b1f2b024SZhong Yang delete m_pShadowBrush; 473b1f2b024SZhong Yang m_pShadowBrush=NULL; 474b1f2b024SZhong Yang } 475b1f2b024SZhong Yang if(ShadowColor.GetA()>0 && nShadowOffset>0){ 476b1f2b024SZhong Yang m_nShadowOffset=nShadowOffset; 477b1f2b024SZhong Yang m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor); 478b1f2b024SZhong Yang }else{ 479b1f2b024SZhong Yang m_nShadowOffset=0; 480b1f2b024SZhong Yang } 481b1f2b024SZhong Yang } 482b1f2b024SZhong Yang //���ø������ 483b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit) 484b1f2b024SZhong Yang { 485b1f2b024SZhong Yang if(m_pFont){ 486b1f2b024SZhong Yang delete m_pFont; 487b1f2b024SZhong Yang m_pFont=NULL; 488b1f2b024SZhong Yang } 489b1f2b024SZhong Yang Gdiplus::FontFamily family(familyName,NULL); 490b1f2b024SZhong Yang Gdiplus::Status lastResult = family.GetLastStatus(); 491b1f2b024SZhong Yang if (lastResult != Gdiplus::Ok) 492b1f2b024SZhong Yang { 493b1f2b024SZhong Yang HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); 494b1f2b024SZhong Yang LOGFONTW lf; 495b1f2b024SZhong Yang ZeroMemory(&lf,sizeof(LOGFONTW)); 496b1f2b024SZhong Yang GetObjectW(hFont,sizeof(LOGFONTW),&lf); 497b1f2b024SZhong Yang Gdiplus::FontFamily family2(lf.lfFaceName,NULL); 498b1f2b024SZhong Yang m_pFont=new Gdiplus::Font(&family2,emSize,style,unit); 499b1f2b024SZhong Yang }else{ 500b1f2b024SZhong Yang m_pFont=new Gdiplus::Font(&family,emSize,style,unit); 501b1f2b024SZhong Yang } 502b1f2b024SZhong Yang //---------------- 503b1f2b024SZhong Yang //����һЩ��������,����·��ʱҪ�õ� 504b1f2b024SZhong Yang m_pFont->GetFamily (m_pFontFamily); 505b1f2b024SZhong Yang m_FontSize=m_pFont->GetSize (); 506b1f2b024SZhong Yang m_FontStyle=m_pFont->GetStyle (); 507b1f2b024SZhong Yang 508b1f2b024SZhong Yang 509b1f2b024SZhong Yang 510b1f2b024SZhong Yang } 511b1f2b024SZhong Yang 5122256f4d4SZhong Yang void CLyricsWindow::SetLyricDoubleLine(bool doubleLine) 5132256f4d4SZhong Yang { 5142256f4d4SZhong Yang m_bDoubleLine = doubleLine; 5152256f4d4SZhong Yang } 5162256f4d4SZhong Yang 5172256f4d4SZhong Yang void CLyricsWindow::SetNextLyric(LPCTSTR lpszNextLyric) 5182256f4d4SZhong Yang { 5192256f4d4SZhong Yang m_strNextLyric = lpszNextLyric; 5202256f4d4SZhong Yang } 5212256f4d4SZhong Yang 52232f06d7fSZhong Yang void CLyricsWindow::SetDrawBackground(bool drawBackground) 52332f06d7fSZhong Yang { 52432f06d7fSZhong Yang m_bDrawBackground = drawBackground; 52532f06d7fSZhong Yang } 52632f06d7fSZhong Yang 527*b6d5f9dcSzhongyang void CLyricsWindow::SetShowTranslate(bool showTranslate) 528*b6d5f9dcSzhongyang { 529*b6d5f9dcSzhongyang m_bShowTranslate = showTranslate; 530*b6d5f9dcSzhongyang } 531*b6d5f9dcSzhongyang 532be1c6be2Szhongyang void CLyricsWindow::SetAlpha(int alpha) 533be1c6be2Szhongyang { 534be1c6be2Szhongyang m_alpha = alpha; 535be1c6be2Szhongyang } 536be1c6be2Szhongyang 537e32f802dSZhong Yang const CString& CLyricsWindow::GetLyricStr() const 538e32f802dSZhong Yang { 539e32f802dSZhong Yang return m_lpszLyrics; 540e32f802dSZhong Yang } 541e32f802dSZhong Yang 542*b6d5f9dcSzhongyang void CLyricsWindow::SetLyricChangeFlag(bool bFlag) 543*b6d5f9dcSzhongyang { 544*b6d5f9dcSzhongyang m_lyricChangeFlag = bFlag; 545*b6d5f9dcSzhongyang } 546*b6d5f9dcSzhongyang 547b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point) 548b1f2b024SZhong Yang { 549b1f2b024SZhong Yang CWnd::OnLButtonDown(nFlags, point); 550b1f2b024SZhong Yang ReleaseCapture(); 551b1f2b024SZhong Yang SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL); 552b1f2b024SZhong Yang } 553b1f2b024SZhong Yang 554b1f2b024SZhong Yang void CLyricsWindow::OnLButtonUp(UINT nFlags, CPoint point) 555b1f2b024SZhong Yang { 556b1f2b024SZhong Yang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 557b1f2b024SZhong Yang 558b1f2b024SZhong Yang CWnd::OnLButtonUp(nFlags, point); 559b1f2b024SZhong Yang } 5609dc20028Szhongyang 5619dc20028Szhongyang 5629dc20028Szhongyang void CLyricsWindow::OnMouseMove(UINT nFlags, CPoint point) 5639dc20028Szhongyang { 5649dc20028Szhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 5659dc20028Szhongyang TRACKMOUSEEVENT tme; 5669dc20028Szhongyang tme.cbSize = sizeof(tme); 5679dc20028Szhongyang tme.hwndTrack = m_hWnd; 5689dc20028Szhongyang tme.dwFlags = TME_LEAVE | TME_HOVER; 5699dc20028Szhongyang tme.dwHoverTime = 1; 5709dc20028Szhongyang _TrackMouseEvent(&tme); 5719dc20028Szhongyang 5729dc20028Szhongyang CWnd::OnMouseMove(nFlags, point); 5739dc20028Szhongyang } 5749dc20028Szhongyang 5759dc20028Szhongyang 5769dc20028Szhongyang void CLyricsWindow::OnMouseHover(UINT nFlags, CPoint point) 5779dc20028Szhongyang { 5789dc20028Szhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 5799dc20028Szhongyang if (!m_bHot) 5809dc20028Szhongyang { 5819dc20028Szhongyang m_bHot = true; 5829dc20028Szhongyang //Invalidate(); 5839dc20028Szhongyang } 5849dc20028Szhongyang else 5859dc20028Szhongyang { 5869dc20028Szhongyang CWnd::OnMouseHover(nFlags, point); 5879dc20028Szhongyang } 5889dc20028Szhongyang } 5899dc20028Szhongyang 5909dc20028Szhongyang 5919dc20028Szhongyang void CLyricsWindow::OnMouseLeave() 5929dc20028Szhongyang { 5939dc20028Szhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 5949dc20028Szhongyang m_bHot = false; 5959dc20028Szhongyang //Invalidate(); 5969dc20028Szhongyang 5979dc20028Szhongyang CWnd::OnMouseLeave(); 5989dc20028Szhongyang } 599c7bf0801Szhongyang 600c7bf0801Szhongyang 601c7bf0801Szhongyang void CLyricsWindow::OnSizing(UINT fwSide, LPRECT pRect) 602c7bf0801Szhongyang { 603c7bf0801Szhongyang CWnd::OnSizing(fwSide, pRect); 604c7bf0801Szhongyang 605c7bf0801Szhongyang // TODO: �ڴ˴������Ϣ���������� 606c7bf0801Szhongyang m_bHot = true; 607c7bf0801Szhongyang } 608