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