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" 9*b7f299bfSzhongyang #include "GdiPlusTool.h" 10b1f2b024SZhong Yang 11b1f2b024SZhong Yang 12b1f2b024SZhong Yang // CLyricsWindow 13b1f2b024SZhong Yang 142256f4d4SZhong Yang const Gdiplus::REAL TRANSLATE_FONT_SIZE_FACTOR = 0.88f; //��ʷ����ı���Сռ����ı���С�ı��� 152256f4d4SZhong Yang 16b1f2b024SZhong Yang IMPLEMENT_DYNAMIC(CLyricsWindow, CWnd) 17b1f2b024SZhong Yang 18b1f2b024SZhong Yang CLyricsWindow::CLyricsWindow() 19b1f2b024SZhong Yang { 20b1f2b024SZhong Yang HDC hDC=::GetDC(NULL); 21b1f2b024SZhong Yang m_hCacheDC=::CreateCompatibleDC(hDC); 22b1f2b024SZhong Yang ::ReleaseDC(NULL,hDC); 23b1f2b024SZhong Yang //--------------------------------- 24b1f2b024SZhong Yang m_nHighlight=NULL ; //������ʵİٷֱ� 0--100 25b1f2b024SZhong Yang m_TextGradientMode=LyricsGradientMode_Two ; //��ͨ��ʽ���ģʽ 26b1f2b024SZhong Yang m_pTextPen=NULL ; //��ͨ��ʱ߿� 27b1f2b024SZhong Yang m_HighlightGradientMode=LyricsGradientMode_Two ; //������ʽ���ģʽ 28b1f2b024SZhong Yang m_pHighlightPen=NULL ; //������ʱ߿� 29b1f2b024SZhong Yang m_pShadowBrush=NULL ; //��Ӱ��ˢ,GDIPlus��ˢ 3054359200SZhong Yang m_nShadowOffset=1 ; //��Ӱƫ�� 31b1f2b024SZhong Yang m_pFont=NULL ; //GDIPlus���� 32b1f2b024SZhong Yang m_FontStyle=NULL ; 33b1f2b024SZhong Yang m_FontSize=NULL ; 34b1f2b024SZhong Yang m_pTextFormat=NULL; 35b1f2b024SZhong Yang //--------------------------------- 36b1f2b024SZhong Yang m_pFontFamily=new Gdiplus::FontFamily(); 37b1f2b024SZhong Yang m_pTextFormat=new Gdiplus::StringFormat(); 38b1f2b024SZhong Yang m_pTextFormat->SetFormatFlags(Gdiplus::StringFormatFlagsNoWrap);//������ 39b1f2b024SZhong Yang m_pTextFormat->SetAlignment(Gdiplus::StringAlignmentCenter); //��ˮƽ���뷽ʽ 40b1f2b024SZhong Yang m_pTextFormat->SetLineAlignment(Gdiplus::StringAlignmentNear); //�ô�ֱ���뷽ʽ 41b1f2b024SZhong Yang //--------------------------------- 4254359200SZhong Yang //SetLyricsFont(L"���ź�", 40, Gdiplus::FontStyle::FontStyleRegular); 4354359200SZhong Yang //SetLyricsColor(Gdiplus::Color::Red,Gdiplus::Color(255,172,0),LyricsGradientMode_Three); 44b1f2b024SZhong Yang //SetLyricsBorder(Gdiplus::Color::Black,1); 4554359200SZhong Yang SetLyricsShadow(Gdiplus::Color(150,0,0,0),1); 4654359200SZhong Yang //SetHighlightColor(Gdiplus::Color(255,100,26),Gdiplus::Color(255,255,0),LyricsGradientMode_Three); 47b1f2b024SZhong Yang //SetHighlightBorder(Gdiplus::Color::Black,1); 48b1f2b024SZhong Yang 49b1f2b024SZhong Yang } 50b1f2b024SZhong Yang 51b1f2b024SZhong Yang CLyricsWindow::~CLyricsWindow() 52b1f2b024SZhong Yang { 53b1f2b024SZhong Yang if(m_pTextPen){ 54b1f2b024SZhong Yang delete m_pTextPen; 55b1f2b024SZhong Yang m_pTextPen=NULL; 56b1f2b024SZhong Yang } 57b1f2b024SZhong Yang if(m_pHighlightPen){ 58b1f2b024SZhong Yang delete m_pHighlightPen; 59b1f2b024SZhong Yang m_pHighlightPen=NULL; 60b1f2b024SZhong Yang } 61b1f2b024SZhong Yang if(m_pShadowBrush){ 62b1f2b024SZhong Yang delete m_pShadowBrush; 63b1f2b024SZhong Yang m_pShadowBrush=NULL; 64b1f2b024SZhong Yang } 65b1f2b024SZhong Yang if(m_pFontFamily){ 66b1f2b024SZhong Yang delete m_pFontFamily; 67b1f2b024SZhong Yang m_pFontFamily=NULL; 68b1f2b024SZhong Yang } 69b1f2b024SZhong Yang if(m_pTextFormat){ 70b1f2b024SZhong Yang delete m_pTextFormat; 71b1f2b024SZhong Yang m_pTextFormat=NULL; 72b1f2b024SZhong Yang } 73b1f2b024SZhong Yang if(m_pFont){ 74b1f2b024SZhong Yang delete m_pFont; 75b1f2b024SZhong Yang m_pFont=NULL; 76b1f2b024SZhong Yang } 77b1f2b024SZhong Yang } 78b1f2b024SZhong Yang 79b1f2b024SZhong Yang 80b1f2b024SZhong Yang BEGIN_MESSAGE_MAP(CLyricsWindow, CWnd) 81b1f2b024SZhong Yang 82b1f2b024SZhong Yang ON_WM_LBUTTONDOWN() 83b1f2b024SZhong Yang ON_WM_LBUTTONUP() 849dc20028Szhongyang ON_WM_MOUSEMOVE() 859dc20028Szhongyang ON_WM_MOUSEHOVER() 869dc20028Szhongyang ON_WM_MOUSELEAVE() 87c7bf0801Szhongyang ON_WM_SIZING() 88c45e940bSzhongyang ON_WM_RBUTTONUP() 897815ece2Szhongyang ON_WM_GETMINMAXINFO() 907815ece2Szhongyang ON_MESSAGE(WM_INITMENU, &CLyricsWindow::OnInitmenu) 91b1f2b024SZhong Yang END_MESSAGE_MAP() 92b1f2b024SZhong Yang 93b1f2b024SZhong Yang 94b1f2b024SZhong Yang 952256f4d4SZhong Yang BOOL CLyricsWindow::Create(int nHeight) 96b1f2b024SZhong Yang { 972256f4d4SZhong Yang return CLyricsWindow::Create(_T("CometLyricsWindow"), -1, nHeight); 98b1f2b024SZhong Yang } 99b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName) 100b1f2b024SZhong Yang { 101b1f2b024SZhong Yang return CLyricsWindow::Create(lpszClassName,-1,-1); 102b1f2b024SZhong Yang } 103b1f2b024SZhong Yang BOOL CLyricsWindow::Create(LPCTSTR lpszClassName,int nWidth,int nHeight) 104b1f2b024SZhong Yang { 105b1f2b024SZhong Yang if(!RegisterWndClass(lpszClassName)) 106b1f2b024SZhong Yang { 107b1f2b024SZhong Yang TRACE("Class��Registration��Failedn"); 108b1f2b024SZhong Yang } 109c45e940bSzhongyang 110c45e940bSzhongyang m_popupMenu.LoadMenu(IDR_DESKTOP_LYRIC_POPUP_MENU); 111c45e940bSzhongyang 112b1f2b024SZhong Yang //-------------------------------------------- 113b1f2b024SZhong Yang //ȡ�����湤������ 114b1f2b024SZhong Yang RECT rcWork; 115b1f2b024SZhong Yang SystemParametersInfo (SPI_GETWORKAREA,NULL,&rcWork,NULL); 116b1f2b024SZhong Yang int nWorkWidth=rcWork.right-rcWork.left; 117b1f2b024SZhong Yang int nWorkHeight=rcWork.bottom-rcWork.top; 118b1f2b024SZhong Yang //δ���ݿ�ȡ��߶Ȳ���ʱ���ø�Ĭ��ֵ 119c7bf0801Szhongyang if(nWidth<0)nWidth=nWorkWidth*2/3; //Ĭ�Ͽ��Ϊ�����ȵ�2/3 120b1f2b024SZhong Yang if(nHeight<0)nHeight=150; 121b1f2b024SZhong Yang //������ߡ�����λ��,�ô�������Ļ�·� 122b1f2b024SZhong Yang int x=rcWork.left+( (nWorkWidth-nWidth)/2 ); 123b1f2b024SZhong Yang int y=rcWork.bottom-nHeight; 124b1f2b024SZhong Yang //-------------------------------------------- 125c7bf0801Szhongyang DWORD dwStyle=WS_POPUP|WS_VISIBLE|WS_THICKFRAME; 126b1f2b024SZhong Yang DWORD dwExStyle=WS_EX_TOOLWINDOW|WS_EX_TOPMOST|WS_EX_LAYERED; 127b1f2b024SZhong Yang return CWnd::CreateEx(dwExStyle, lpszClassName, NULL, dwStyle, x, y, nWidth, nHeight, NULL, NULL); 128b1f2b024SZhong Yang } 129b1f2b024SZhong Yang BOOL CLyricsWindow::RegisterWndClass(LPCTSTR lpszClassName) 130b1f2b024SZhong Yang { 131b1f2b024SZhong Yang HINSTANCE hInstance=AfxGetInstanceHandle(); 132b1f2b024SZhong Yang WNDCLASSEX wndcls; 133b1f2b024SZhong Yang memset(&wndcls,0,sizeof(WNDCLASSEX)); 134b1f2b024SZhong Yang wndcls.cbSize=sizeof(WNDCLASSEX); 135b1f2b024SZhong Yang if(GetClassInfoEx(hInstance,lpszClassName,&wndcls)) 136b1f2b024SZhong Yang { 137b1f2b024SZhong Yang return TRUE; 138b1f2b024SZhong Yang } 139b1f2b024SZhong Yang if(GetClassInfoEx(NULL,lpszClassName,&wndcls)) 140b1f2b024SZhong Yang { 141b1f2b024SZhong Yang return TRUE; 142b1f2b024SZhong Yang } 143b1f2b024SZhong Yang 144b1f2b024SZhong Yang wndcls.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW; 145b1f2b024SZhong Yang wndcls.lpfnWndProc=::DefWindowProc; 146b1f2b024SZhong Yang wndcls.hInstance=hInstance; 147b1f2b024SZhong Yang wndcls.hIcon=NULL; 148b1f2b024SZhong Yang wndcls.hCursor=::LoadCursor(NULL,IDC_ARROW); 149b1f2b024SZhong Yang wndcls.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); 150b1f2b024SZhong Yang wndcls.lpszMenuName=NULL; 151b1f2b024SZhong Yang wndcls.lpszClassName=lpszClassName; 152b1f2b024SZhong Yang if(!RegisterClassEx(&wndcls)) 153b1f2b024SZhong Yang { 154b1f2b024SZhong Yang return FALSE; 155b1f2b024SZhong Yang } 156b1f2b024SZhong Yang return TRUE; 157b1f2b024SZhong Yang } 158b1f2b024SZhong Yang 159b1f2b024SZhong Yang 160b1f2b024SZhong Yang //���¸��(����ı�,�������Ȱٷֱ�) 161be1c6be2Szhongyang void CLyricsWindow::UpdateLyrics(LPCTSTR lpszLyrics,int nHighlight) 162b1f2b024SZhong Yang { 163be1c6be2Szhongyang m_lpszLyrics = lpszLyrics; 164b1f2b024SZhong Yang UpdateLyrics(nHighlight); 165b1f2b024SZhong Yang } 166b1f2b024SZhong Yang //���¸�������(�������Ȱٷֱ�) 167b1f2b024SZhong Yang void CLyricsWindow::UpdateLyrics(int nHighlight) 168b1f2b024SZhong Yang { 169b1f2b024SZhong Yang m_nHighlight=nHighlight; 170b1f2b024SZhong Yang if(m_nHighlight<0) 171b1f2b024SZhong Yang m_nHighlight=0; 172b1f2b024SZhong Yang if(m_nHighlight>1000) 173b1f2b024SZhong Yang m_nHighlight=1000; 174b1f2b024SZhong Yang Draw(); 175b1f2b024SZhong Yang } 1762256f4d4SZhong Yang 1772256f4d4SZhong Yang void CLyricsWindow::UpdateLyricTranslate(LPCTSTR lpszLyricTranslate) 1782256f4d4SZhong Yang { 1792256f4d4SZhong Yang m_strTranslate = lpszLyricTranslate; 1802256f4d4SZhong Yang } 1812256f4d4SZhong Yang 182b1f2b024SZhong Yang //�ػ���ʴ��� 183b1f2b024SZhong Yang void CLyricsWindow::Draw() 184b1f2b024SZhong Yang { 185b1f2b024SZhong Yang CRect rcClient; 186c7bf0801Szhongyang GetWindowRect(rcClient); 187b1f2b024SZhong Yang m_nWidth=rcClient.Width(); 188b1f2b024SZhong Yang m_nHeight=rcClient.Height(); 189b1f2b024SZhong Yang //---------------------------------- 190b1f2b024SZhong Yang BITMAPINFO bitmapinfo; 191b1f2b024SZhong Yang bitmapinfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 192b1f2b024SZhong Yang bitmapinfo.bmiHeader.biBitCount = 32; 193b1f2b024SZhong Yang bitmapinfo.bmiHeader.biHeight = m_nHeight; 194b1f2b024SZhong Yang bitmapinfo.bmiHeader.biWidth = m_nWidth; 195b1f2b024SZhong Yang bitmapinfo.bmiHeader.biPlanes = 1; 196b1f2b024SZhong Yang bitmapinfo.bmiHeader.biCompression=BI_RGB; 197b1f2b024SZhong Yang bitmapinfo.bmiHeader.biXPelsPerMeter=0; 198b1f2b024SZhong Yang bitmapinfo.bmiHeader.biYPelsPerMeter=0; 199b1f2b024SZhong Yang bitmapinfo.bmiHeader.biClrUsed=0; 200b1f2b024SZhong Yang bitmapinfo.bmiHeader.biClrImportant=0; 201b1f2b024SZhong Yang bitmapinfo.bmiHeader.biSizeImage = bitmapinfo.bmiHeader.biWidth * bitmapinfo.bmiHeader.biHeight * bitmapinfo.bmiHeader.biBitCount / 8; 202b1f2b024SZhong Yang HBITMAP hBitmap=CreateDIBSection (m_hCacheDC,&bitmapinfo, 0,NULL, 0, 0); 203b1f2b024SZhong Yang HBITMAP hOldBitmap = (HBITMAP)SelectObject (m_hCacheDC,hBitmap); 204b1f2b024SZhong Yang //---------------------------------- 205b1f2b024SZhong Yang Gdiplus::Graphics* pGraphics=new Gdiplus::Graphics(m_hCacheDC); 206b1f2b024SZhong Yang pGraphics->SetSmoothingMode (Gdiplus::SmoothingModeAntiAlias); 207b1f2b024SZhong Yang pGraphics->SetTextRenderingHint (Gdiplus::TextRenderingHintAntiAlias); 20832f06d7fSZhong Yang 20932f06d7fSZhong Yang //���ư������� 210c7bf0801Szhongyang if(m_bDrawBackground) 21132f06d7fSZhong Yang { 212c7bf0801Szhongyang BYTE alpha = m_bHot ? 80 : 2; 213c7bf0801Szhongyang Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(Gdiplus::Color(alpha, 255, 255, 255)); 214c7bf0801Szhongyang pGraphics->FillRectangle(pBrush, 0, 0, rcClient.Width(), rcClient.Height()); 21532f06d7fSZhong Yang delete pBrush; 21632f06d7fSZhong Yang } 217b6d5f9dcSzhongyang if (m_bDoubleLine) 218b6d5f9dcSzhongyang DrawLyricsDoubleLine(pGraphics); 219b6d5f9dcSzhongyang else 220b1f2b024SZhong Yang DrawLyrics(pGraphics); 221*b7f299bfSzhongyang 222*b7f299bfSzhongyang //���ƹ����� 223*b7f299bfSzhongyang if (m_bDrawBackground && m_bHot) 224*b7f299bfSzhongyang DrawToolbar(pGraphics); 225*b7f299bfSzhongyang 226b1f2b024SZhong Yang delete pGraphics; 227b1f2b024SZhong Yang //---------------------------------- 228b1f2b024SZhong Yang //���������� 229b1f2b024SZhong Yang CPoint DestPt(0,0); 230b1f2b024SZhong Yang CSize psize(m_nWidth,m_nHeight); 231b1f2b024SZhong Yang BLENDFUNCTION blendFunc32bpp; 232b1f2b024SZhong Yang blendFunc32bpp.AlphaFormat = AC_SRC_ALPHA; 233b1f2b024SZhong Yang blendFunc32bpp.BlendFlags = 0; 234b1f2b024SZhong Yang blendFunc32bpp.BlendOp = AC_SRC_OVER; 235be1c6be2Szhongyang blendFunc32bpp.SourceConstantAlpha = m_alpha; 236b1f2b024SZhong Yang HDC hDC=::GetDC(m_hWnd); 237b1f2b024SZhong Yang ::UpdateLayeredWindow(m_hWnd,hDC,NULL,&psize,m_hCacheDC,&DestPt,0,&blendFunc32bpp,ULW_ALPHA); 238b1f2b024SZhong Yang //---------------------------------- 239b1f2b024SZhong Yang //�ͷ���Դ 240b1f2b024SZhong Yang ::SelectObject (m_hCacheDC,hOldBitmap); 241b1f2b024SZhong Yang ::DeleteObject(hBitmap); 242b1f2b024SZhong Yang ::ReleaseDC(m_hWnd,hDC); 243b1f2b024SZhong Yang } 2442256f4d4SZhong Yang 245b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool bDrawHighlight, bool bDrawTranslate) 2462256f4d4SZhong Yang { 2472256f4d4SZhong Yang Gdiplus::REAL fontSize = bDrawTranslate ? m_FontSize * TRANSLATE_FONT_SIZE_FACTOR : m_FontSize; 2482256f4d4SZhong Yang if (fontSize < 1) 2492256f4d4SZhong Yang fontSize = m_FontSize; 2502256f4d4SZhong Yang 251e3d88825Szhongyang Gdiplus::REAL textWidth = rect.Width; 252e3d88825Szhongyang Gdiplus::REAL highlighWidth = rect.Width * m_nHighlight / 1000; 253b6d5f9dcSzhongyang 254b6d5f9dcSzhongyang if (!bDrawHighlight && !bDrawTranslate) 255b6d5f9dcSzhongyang { 256b6d5f9dcSzhongyang if (rect.X < 0) 257b6d5f9dcSzhongyang rect.X = 0; 258b6d5f9dcSzhongyang } 259b6d5f9dcSzhongyang else 260b6d5f9dcSzhongyang { 261e3d88825Szhongyang //����ı���ȴ��ڿؼ���ȣ���Ҫ���ݷָ��λ�ù����ı� 262e3d88825Szhongyang if (textWidth > m_nWidth) 263e3d88825Szhongyang { 264e3d88825Szhongyang //����ָ��λ�ã���ʽ��ȣ�ʣ�µĿ���Ѿ�С�ڿؼ���ȵ�һ�룬��ʱʹ�ı��Ҳ�Ϳؼ��Ҳ���� 265e3d88825Szhongyang if (textWidth - highlighWidth < m_nWidth / 2) 266e3d88825Szhongyang { 267e3d88825Szhongyang rect.X = m_nWidth - textWidth; 268e3d88825Szhongyang } 269e3d88825Szhongyang //�ָ�λ��ʣ�µĿ�Ȼ�û�е�С�ڿؼ���ȵ�һ�룬���Ƿָ�λ�õĿ���Ѿ����ڿؼ���ȵ�һ��ʱ����Ҫ�ƶ��ı�ʹ�ָ�λ�������ڿؼ����м� 270e3d88825Szhongyang else if (highlighWidth > m_nWidth / 2) 271e3d88825Szhongyang { 272e3d88825Szhongyang rect.X = m_nWidth / 2 - highlighWidth; 273e3d88825Szhongyang } 274e3d88825Szhongyang //�ָ�λ�û������ؼ���ȵ�һ��ʱ��ʹ�ı����Ϳؼ������� 275e3d88825Szhongyang else 276e3d88825Szhongyang { 277e3d88825Szhongyang rect.X = 0; 278e3d88825Szhongyang } 279e3d88825Szhongyang } 280b6d5f9dcSzhongyang } 281e3d88825Szhongyang 2822256f4d4SZhong Yang //----------------------------------------------------------- 2832256f4d4SZhong Yang //������Ӱ 2842256f4d4SZhong Yang if (m_pShadowBrush) { 2852256f4d4SZhong Yang Gdiplus::RectF layoutRect(0, 0, 0, 0); 2862256f4d4SZhong Yang layoutRect = rect; 2872256f4d4SZhong Yang layoutRect.X = layoutRect.X + m_nShadowOffset; 2882256f4d4SZhong Yang layoutRect.Y = layoutRect.Y + m_nShadowOffset; 2892256f4d4SZhong Yang Gdiplus::GraphicsPath* pShadowPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·�� 2902256f4d4SZhong Yang pShadowPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, layoutRect, m_pTextFormat); //�����ּ���·�� 2912256f4d4SZhong Yang pGraphics->FillPath(m_pShadowBrush, pShadowPath);//���·�� 2922256f4d4SZhong Yang delete pShadowPath; //����·�� 2932256f4d4SZhong Yang } 2942256f4d4SZhong Yang 2952256f4d4SZhong Yang //----------------------------------------------------------- 2962256f4d4SZhong Yang //������� 2972256f4d4SZhong Yang Gdiplus::GraphicsPath* pStringPath = new Gdiplus::GraphicsPath(Gdiplus::FillModeAlternate);//����·�� 2982256f4d4SZhong Yang pStringPath->AddString(strText, -1, m_pFontFamily, m_FontStyle, fontSize, rect, m_pTextFormat); //�����ּ���·�� 2992256f4d4SZhong Yang if (m_pTextPen) { 3002256f4d4SZhong Yang pGraphics->DrawPath(m_pTextPen, pStringPath);//��·��,���ֱ߿� 3012256f4d4SZhong Yang } 3022256f4d4SZhong Yang Gdiplus::Brush* pBrush = CreateGradientBrush(m_TextGradientMode, m_TextColor1, m_TextColor2, rect); 3032256f4d4SZhong Yang pGraphics->FillPath(pBrush, pStringPath);//���·�� 3042256f4d4SZhong Yang delete pBrush;//���ٻ�ˢ 305b6d5f9dcSzhongyang if(bDrawHighlight) 3062256f4d4SZhong Yang DrawHighlightLyrics(pGraphics, pStringPath, rect); 3072256f4d4SZhong Yang delete pStringPath; //����·�� 3082256f4d4SZhong Yang } 3092256f4d4SZhong Yang 310b1f2b024SZhong Yang //���Ƹ�� 311b1f2b024SZhong Yang void CLyricsWindow::DrawLyrics(Gdiplus::Graphics* pGraphics) 312b1f2b024SZhong Yang { 313b1f2b024SZhong Yang //��ȡ�����ֿ�Ⱥ߶� 314b1f2b024SZhong Yang Gdiplus::RectF layoutRect(0,0,0,0); 315b1f2b024SZhong Yang Gdiplus::RectF boundingBox; 316b1f2b024SZhong Yang pGraphics->MeasureString (m_lpszLyrics, -1, m_pFont,layoutRect, m_pTextFormat,&boundingBox, 0, 0); 317b1f2b024SZhong Yang //�����ʻ�����λ�� 3182256f4d4SZhong Yang Gdiplus::RectF dstRect; //���ֵľ��� 3192256f4d4SZhong Yang Gdiplus::RectF transRect; //�����ı��ľ��� 320b6d5f9dcSzhongyang bool bDrawTranslate = m_bShowTranslate && !m_strTranslate.IsEmpty(); 321b6d5f9dcSzhongyang if(!bDrawTranslate) 322f5ba4de7SZhong Yang { 3232256f4d4SZhong Yang dstRect = Gdiplus::RectF((m_nWidth - boundingBox.Width) / 2, (m_nHeight - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height); 324f5ba4de7SZhong Yang } 325f5ba4de7SZhong Yang else 3262256f4d4SZhong Yang { 3272256f4d4SZhong Yang Gdiplus::RectF transBoundingBox; 3282256f4d4SZhong Yang pGraphics->MeasureString(m_strTranslate, -1, m_pFont, layoutRect, m_pTextFormat, &transBoundingBox, 0, 0); 3292256f4d4SZhong Yang Gdiplus::REAL translateHeight = boundingBox.Height * TRANSLATE_FONT_SIZE_FACTOR; 3302256f4d4SZhong Yang Gdiplus::REAL maxWidth = max(boundingBox.Width, transBoundingBox.Width); 3312256f4d4SZhong Yang Gdiplus::REAL gapHeight = boundingBox.Height * 0.2f; //��ʺͷ���֮��ļ�϶ 3322256f4d4SZhong Yang Gdiplus::REAL height = boundingBox.Height + gapHeight + translateHeight; 333f5ba4de7SZhong Yang Gdiplus::RectF textRect((m_nWidth - maxWidth) / 2, (m_nHeight - height) / 2, maxWidth, height); 3342256f4d4SZhong Yang dstRect = textRect; 3352256f4d4SZhong Yang dstRect.Height = boundingBox.Height; 3362256f4d4SZhong Yang transRect = textRect; 3372256f4d4SZhong Yang transRect.Y += (boundingBox.Height + gapHeight); 3382256f4d4SZhong Yang transRect.Height = translateHeight; 3392256f4d4SZhong Yang } 340b1f2b024SZhong Yang 341b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true); 342b6d5f9dcSzhongyang if (bDrawTranslate) 343b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_strTranslate, transRect, false, true); 344b1f2b024SZhong Yang } 345b6d5f9dcSzhongyang 346b6d5f9dcSzhongyang void CLyricsWindow::DrawLyricsDoubleLine(Gdiplus::Graphics* pGraphics) 347b6d5f9dcSzhongyang { 348b6d5f9dcSzhongyang static bool bSwap = false; 349b6d5f9dcSzhongyang if (m_lyricChangeFlag) //�����ʷ����˸ı䣬����ǰ��ʺ���һ���ʵ�λ�� 350b6d5f9dcSzhongyang bSwap = !bSwap; 351b6d5f9dcSzhongyang //��ȡ�����ֿ�Ⱥ߶� 352b6d5f9dcSzhongyang Gdiplus::RectF layoutRect(0, 0, 0, 0); 353b6d5f9dcSzhongyang Gdiplus::RectF boundingBox; 354b6d5f9dcSzhongyang pGraphics->MeasureString(m_lpszLyrics, -1, m_pFont, layoutRect, m_pTextFormat, &boundingBox, 0, 0); 355b6d5f9dcSzhongyang Gdiplus::RectF nextBoundingBox; 356b6d5f9dcSzhongyang pGraphics->MeasureString(m_strNextLyric, -1, m_pFont, layoutRect, m_pTextFormat, &nextBoundingBox, 0, 0); 357b6d5f9dcSzhongyang //�����ʻ�����λ�� 358b6d5f9dcSzhongyang Gdiplus::RectF dstRect; //���ֵľ��� 359b6d5f9dcSzhongyang Gdiplus::RectF nextRect; //��һ���ı��ľ��� 360b6d5f9dcSzhongyang 361b6d5f9dcSzhongyang dstRect = Gdiplus::RectF(0, (m_nHeight / 2 - boundingBox.Height) / 2, boundingBox.Width, boundingBox.Height); 362b6d5f9dcSzhongyang nextRect = Gdiplus::RectF(m_nWidth - nextBoundingBox.Width, dstRect.Y + m_nHeight / 2, nextBoundingBox.Width, nextBoundingBox.Height); 363b6d5f9dcSzhongyang 364b6d5f9dcSzhongyang if (bSwap) 365b6d5f9dcSzhongyang { 366b6d5f9dcSzhongyang std::swap(dstRect.Y, nextRect.Y); 367b6d5f9dcSzhongyang nextRect.X = 0; 368b6d5f9dcSzhongyang dstRect.X = m_nWidth - dstRect.Width; 369b6d5f9dcSzhongyang } 370b6d5f9dcSzhongyang 371b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_lpszLyrics, dstRect, true); 372b6d5f9dcSzhongyang DrawLyricText(pGraphics, m_strNextLyric, nextRect, false); 373b6d5f9dcSzhongyang } 374b6d5f9dcSzhongyang 375b1f2b024SZhong Yang //���Ƹ������ 376b1f2b024SZhong Yang void CLyricsWindow::DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect) 377b1f2b024SZhong Yang { 378b1f2b024SZhong Yang if(m_nHighlight<=0)return; 379b1f2b024SZhong Yang Gdiplus::Region* pRegion=NULL; 380b1f2b024SZhong Yang if(m_nHighlight<1000){ 381b1f2b024SZhong Yang Gdiplus::RectF CliptRect(dstRect); 382b1f2b024SZhong Yang CliptRect.Width=CliptRect.Width * m_nHighlight / 1000; 383b1f2b024SZhong Yang pRegion=new Gdiplus::Region(CliptRect); 384b1f2b024SZhong Yang pGraphics->SetClip(pRegion, Gdiplus::CombineModeReplace); 385b1f2b024SZhong Yang } 386b1f2b024SZhong Yang //-------------------------------------------- 387b1f2b024SZhong Yang if(m_pHighlightPen){ 388b1f2b024SZhong Yang pGraphics->DrawPath (m_pHighlightPen,pPath);//��·��,���ֱ߿� 389b1f2b024SZhong Yang } 390b1f2b024SZhong Yang Gdiplus::Brush* pBrush = CreateGradientBrush(m_HighlightGradientMode, m_HighlightColor1,m_HighlightColor2,dstRect); 391b1f2b024SZhong Yang pGraphics->FillPath (pBrush,pPath);//���·�� 392b1f2b024SZhong Yang delete pBrush;//���ٻ�ˢ 393b1f2b024SZhong Yang //-------------------------------------------- 394b1f2b024SZhong Yang if(pRegion){ 395b1f2b024SZhong Yang pGraphics->ResetClip(); 396b1f2b024SZhong Yang delete pRegion; 397b1f2b024SZhong Yang } 398b1f2b024SZhong Yang } 399*b7f299bfSzhongyang 400*b7f299bfSzhongyang void CLyricsWindow::DrawToolbar(Gdiplus::Graphics* pGraphics) 401*b7f299bfSzhongyang { 402*b7f299bfSzhongyang const int toolbar_num = 4; 403*b7f299bfSzhongyang const int btn_size = theApp.DPI(24); 404*b7f299bfSzhongyang int toolbar_width = toolbar_num * btn_size; 405*b7f299bfSzhongyang Gdiplus::Rect toolbar_rect; 406*b7f299bfSzhongyang toolbar_rect.Y = 0; 407*b7f299bfSzhongyang toolbar_rect.X = (m_nWidth - toolbar_width) / 2; 408*b7f299bfSzhongyang toolbar_rect.Width = toolbar_width; 409*b7f299bfSzhongyang toolbar_rect.Height = btn_size; 410*b7f299bfSzhongyang 411*b7f299bfSzhongyang //���Ʊ��� 412*b7f299bfSzhongyang Gdiplus::Color back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light3, 180); 413*b7f299bfSzhongyang Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(back_color); 414*b7f299bfSzhongyang pGraphics->FillRectangle(pBrush, toolbar_rect); 415*b7f299bfSzhongyang delete pBrush; 416*b7f299bfSzhongyang 417*b7f299bfSzhongyang HDC hDC = pGraphics->GetHDC(); 418*b7f299bfSzhongyang CDrawCommon drawer; 419*b7f299bfSzhongyang drawer.Create(CDC::FromHandle(hDC)); 420*b7f299bfSzhongyang 421*b7f299bfSzhongyang // 422*b7f299bfSzhongyang CRect rcIcon = CRect(toolbar_rect.X, toolbar_rect.Y, toolbar_rect.GetRight(), toolbar_rect.GetBottom()); 423*b7f299bfSzhongyang rcIcon.right = rcIcon.left + btn_size; 424*b7f299bfSzhongyang 425*b7f299bfSzhongyang DrawToolIcon(pGraphics, drawer, theApp.m_icon_set.stop_l, rcIcon, BTN_STOP); 426*b7f299bfSzhongyang rcIcon.MoveToX(rcIcon.right); 427*b7f299bfSzhongyang DrawToolIcon(pGraphics, drawer, theApp.m_icon_set.previous, rcIcon, BTN_PREVIOUS); 428*b7f299bfSzhongyang rcIcon.MoveToX(rcIcon.right); 429*b7f299bfSzhongyang IconRes hPlayPauseIcon = (CPlayer::GetInstance().IsPlaying() ? theApp.m_icon_set.pause : theApp.m_icon_set.play); 430*b7f299bfSzhongyang DrawToolIcon(pGraphics, drawer, hPlayPauseIcon, rcIcon, BTN_PLAY_PAUSE); 431*b7f299bfSzhongyang rcIcon.MoveToX(rcIcon.right); 432*b7f299bfSzhongyang DrawToolIcon(pGraphics, drawer, theApp.m_icon_set.next, rcIcon, BTN_NEXT); 433*b7f299bfSzhongyang 434*b7f299bfSzhongyang pGraphics->ReleaseHDC(hDC); 435*b7f299bfSzhongyang } 436*b7f299bfSzhongyang 437*b7f299bfSzhongyang void CLyricsWindow::DrawToolIcon(Gdiplus::Graphics* pGraphics, CDrawCommon& drawer, IconRes icon, CRect rect, BtnKey btn_key, bool checked) 438*b7f299bfSzhongyang { 439*b7f299bfSzhongyang rect.DeflateRect(theApp.DPI(2), theApp.DPI(2)); 440*b7f299bfSzhongyang auto& btn = m_buttons[btn_key]; 441*b7f299bfSzhongyang btn.rect = rect; 442*b7f299bfSzhongyang 443*b7f299bfSzhongyang if (btn.pressed) 444*b7f299bfSzhongyang rect.MoveToXY(rect.left + theApp.DPI(1), rect.top + theApp.DPI(1)); 445*b7f299bfSzhongyang 446*b7f299bfSzhongyang Gdiplus::Color back_color; 447*b7f299bfSzhongyang if (btn.pressed && btn.hover) 448*b7f299bfSzhongyang back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.dark1, 160); 449*b7f299bfSzhongyang else if (btn.hover) 450*b7f299bfSzhongyang back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light1, 160); 451*b7f299bfSzhongyang else if(checked) 452*b7f299bfSzhongyang back_color = CGdiPlusTool::COLORREFToGdiplusColor(theApp.m_app_setting_data.theme_color.light2, 160); 453*b7f299bfSzhongyang Gdiplus::Brush* pBrush = new Gdiplus::SolidBrush(back_color); 454*b7f299bfSzhongyang pGraphics->FillRectangle(pBrush, rect.left, rect.top, rect.Width(), rect.Height()); 455*b7f299bfSzhongyang delete pBrush; 456*b7f299bfSzhongyang 457*b7f299bfSzhongyang //drawer.GetDC()->FillSolidRect(rect, theApp.m_app_setting_data.theme_color.light1); 458*b7f299bfSzhongyang 459*b7f299bfSzhongyang CRect rc_tmp = rect; 460*b7f299bfSzhongyang //ʹͼ���ھ����о��� 461*b7f299bfSzhongyang CSize icon_size = icon.GetSize(theApp.m_ui_data.full_screen); 462*b7f299bfSzhongyang rc_tmp.left = rect.left + (rect.Width() - icon_size.cx) / 2; 463*b7f299bfSzhongyang rc_tmp.top = rect.top + (rect.Height() - icon_size.cy) / 2; 464*b7f299bfSzhongyang rc_tmp.right = rc_tmp.left + icon_size.cx; 465*b7f299bfSzhongyang rc_tmp.bottom = rc_tmp.top + icon_size.cy; 466*b7f299bfSzhongyang 467*b7f299bfSzhongyang drawer.DrawIcon(icon.GetIcon(), rc_tmp.TopLeft(), rc_tmp.Size()); 468*b7f299bfSzhongyang } 469*b7f299bfSzhongyang 470b1f2b024SZhong Yang //�������仭ˢ 471b1f2b024SZhong Yang Gdiplus::Brush* CLyricsWindow::CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect) 472b1f2b024SZhong Yang { 473b1f2b024SZhong Yang Gdiplus::PointF pt1; 474b1f2b024SZhong Yang Gdiplus::PointF pt2; 475b1f2b024SZhong Yang Gdiplus::Brush* pBrush=NULL; 476b1f2b024SZhong Yang switch (TextGradientMode) 477b1f2b024SZhong Yang { 478b1f2b024SZhong Yang case LyricsGradientMode_Two://��ɫ���� 479b1f2b024SZhong Yang { 480b1f2b024SZhong Yang Gdiplus::PointF point1(dstRect.X,dstRect.Y); 481b1f2b024SZhong Yang Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height); 482b1f2b024SZhong Yang pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2); 483b1f2b024SZhong Yang ((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY); 484b1f2b024SZhong Yang break; 485b1f2b024SZhong Yang } 486b1f2b024SZhong Yang 487b1f2b024SZhong Yang case LyricsGradientMode_Three://��ɫ���� 488b1f2b024SZhong Yang { 489b1f2b024SZhong Yang Gdiplus::PointF point1(dstRect.X,dstRect.Y); 490b1f2b024SZhong Yang Gdiplus::PointF point2(dstRect.X,dstRect.Y+dstRect.Height/2); 491b1f2b024SZhong Yang pBrush=new Gdiplus::LinearGradientBrush(point1,point2,Color1,Color2); 492b1f2b024SZhong Yang ((Gdiplus::LinearGradientBrush*)pBrush)->SetWrapMode(Gdiplus::WrapModeTileFlipXY); 493b1f2b024SZhong Yang break; 494b1f2b024SZhong Yang } 495b1f2b024SZhong Yang 496b1f2b024SZhong Yang default://���� 497b1f2b024SZhong Yang { 498b1f2b024SZhong Yang pBrush=new Gdiplus::SolidBrush(Color1); 499b1f2b024SZhong Yang break; 500b1f2b024SZhong Yang } 501b1f2b024SZhong Yang } 502b1f2b024SZhong Yang return pBrush; 503b1f2b024SZhong Yang } 504b1f2b024SZhong Yang 505b1f2b024SZhong Yang //���ø����ɫ 506b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1) 507b1f2b024SZhong Yang { 508b1f2b024SZhong Yang CLyricsWindow::SetLyricsColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None); 509b1f2b024SZhong Yang } 510b1f2b024SZhong Yang void CLyricsWindow::SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode) 511b1f2b024SZhong Yang { 512b1f2b024SZhong Yang m_TextColor1=TextColor1; 513b1f2b024SZhong Yang m_TextColor2=TextColor2; 514b1f2b024SZhong Yang m_TextGradientMode=TextGradientMode; 515b1f2b024SZhong Yang 516b1f2b024SZhong Yang } 517b1f2b024SZhong Yang //���ø�ʱ߿� 518b1f2b024SZhong Yang void CLyricsWindow::SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth) 519b1f2b024SZhong Yang { 520b1f2b024SZhong Yang if(m_pTextPen){ 521b1f2b024SZhong Yang delete m_pTextPen; 522b1f2b024SZhong Yang m_pTextPen=NULL; 523b1f2b024SZhong Yang } 524b1f2b024SZhong Yang if(BorderColor.GetA()>0 && BorderWidth>0) 525b1f2b024SZhong Yang m_pTextPen=new Gdiplus::Pen(BorderColor,BorderWidth); 526b1f2b024SZhong Yang } 527b1f2b024SZhong Yang //���ø��������ɫ 528b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1) 529b1f2b024SZhong Yang { 530b1f2b024SZhong Yang CLyricsWindow::SetHighlightColor(TextColor1,Gdiplus::Color::Black,LyricsGradientMode_None); 531b1f2b024SZhong Yang } 532b1f2b024SZhong Yang void CLyricsWindow::SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode) 533b1f2b024SZhong Yang { 534b1f2b024SZhong Yang m_HighlightColor1=TextColor1; 535b1f2b024SZhong Yang m_HighlightColor2=TextColor2; 536b1f2b024SZhong Yang m_HighlightGradientMode=TextGradientMode; 537b1f2b024SZhong Yang 538b1f2b024SZhong Yang } 539b1f2b024SZhong Yang //���ø�����ʱ߿� 540b1f2b024SZhong Yang void CLyricsWindow::SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth) 541b1f2b024SZhong Yang { 542b1f2b024SZhong Yang if(m_pHighlightPen){ 543b1f2b024SZhong Yang delete m_pHighlightPen; 544b1f2b024SZhong Yang m_pHighlightPen=NULL; 545b1f2b024SZhong Yang } 546b1f2b024SZhong Yang if(BorderColor.GetA()>0 && BorderWidth>0) 547b1f2b024SZhong Yang m_pHighlightPen=new Gdiplus::Pen(BorderColor,BorderWidth); 548b1f2b024SZhong Yang } 549b1f2b024SZhong Yang //���ø����Ӱ 550b1f2b024SZhong Yang void CLyricsWindow::SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset) 551b1f2b024SZhong Yang { 552b1f2b024SZhong Yang if(m_pShadowBrush){ 553b1f2b024SZhong Yang delete m_pShadowBrush; 554b1f2b024SZhong Yang m_pShadowBrush=NULL; 555b1f2b024SZhong Yang } 556b1f2b024SZhong Yang if(ShadowColor.GetA()>0 && nShadowOffset>0){ 557b1f2b024SZhong Yang m_nShadowOffset=nShadowOffset; 558b1f2b024SZhong Yang m_pShadowBrush=new Gdiplus::SolidBrush(ShadowColor); 559b1f2b024SZhong Yang }else{ 560b1f2b024SZhong Yang m_nShadowOffset=0; 561b1f2b024SZhong Yang } 562b1f2b024SZhong Yang } 563b1f2b024SZhong Yang //���ø������ 564b1f2b024SZhong Yang void CLyricsWindow::SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style, Gdiplus::Unit unit) 565b1f2b024SZhong Yang { 566b1f2b024SZhong Yang if(m_pFont){ 567b1f2b024SZhong Yang delete m_pFont; 568b1f2b024SZhong Yang m_pFont=NULL; 569b1f2b024SZhong Yang } 570b1f2b024SZhong Yang Gdiplus::FontFamily family(familyName,NULL); 571b1f2b024SZhong Yang Gdiplus::Status lastResult = family.GetLastStatus(); 572b1f2b024SZhong Yang if (lastResult != Gdiplus::Ok) 573b1f2b024SZhong Yang { 574b1f2b024SZhong Yang HFONT hFont=(HFONT)GetStockObject(DEFAULT_GUI_FONT); 575b1f2b024SZhong Yang LOGFONTW lf; 576b1f2b024SZhong Yang ZeroMemory(&lf,sizeof(LOGFONTW)); 577b1f2b024SZhong Yang GetObjectW(hFont,sizeof(LOGFONTW),&lf); 578b1f2b024SZhong Yang Gdiplus::FontFamily family2(lf.lfFaceName,NULL); 579b1f2b024SZhong Yang m_pFont=new Gdiplus::Font(&family2,emSize,style,unit); 580b1f2b024SZhong Yang }else{ 581b1f2b024SZhong Yang m_pFont=new Gdiplus::Font(&family,emSize,style,unit); 582b1f2b024SZhong Yang } 583b1f2b024SZhong Yang //---------------- 584b1f2b024SZhong Yang //����һЩ��������,����·��ʱҪ�õ� 585b1f2b024SZhong Yang m_pFont->GetFamily (m_pFontFamily); 586b1f2b024SZhong Yang m_FontSize=m_pFont->GetSize (); 587b1f2b024SZhong Yang m_FontStyle=m_pFont->GetStyle (); 588b1f2b024SZhong Yang 589b1f2b024SZhong Yang 590b1f2b024SZhong Yang 591b1f2b024SZhong Yang } 592b1f2b024SZhong Yang 5932256f4d4SZhong Yang void CLyricsWindow::SetLyricDoubleLine(bool doubleLine) 5942256f4d4SZhong Yang { 5952256f4d4SZhong Yang m_bDoubleLine = doubleLine; 5962256f4d4SZhong Yang } 5972256f4d4SZhong Yang 5982256f4d4SZhong Yang void CLyricsWindow::SetNextLyric(LPCTSTR lpszNextLyric) 5992256f4d4SZhong Yang { 6002256f4d4SZhong Yang m_strNextLyric = lpszNextLyric; 6012256f4d4SZhong Yang } 6022256f4d4SZhong Yang 60332f06d7fSZhong Yang void CLyricsWindow::SetDrawBackground(bool drawBackground) 60432f06d7fSZhong Yang { 60532f06d7fSZhong Yang m_bDrawBackground = drawBackground; 60632f06d7fSZhong Yang } 60732f06d7fSZhong Yang 608b6d5f9dcSzhongyang void CLyricsWindow::SetShowTranslate(bool showTranslate) 609b6d5f9dcSzhongyang { 610b6d5f9dcSzhongyang m_bShowTranslate = showTranslate; 611b6d5f9dcSzhongyang } 612b6d5f9dcSzhongyang 613be1c6be2Szhongyang void CLyricsWindow::SetAlpha(int alpha) 614be1c6be2Szhongyang { 615be1c6be2Szhongyang m_alpha = alpha; 616be1c6be2Szhongyang } 617be1c6be2Szhongyang 618e32f802dSZhong Yang const CString& CLyricsWindow::GetLyricStr() const 619e32f802dSZhong Yang { 620e32f802dSZhong Yang return m_lpszLyrics; 621e32f802dSZhong Yang } 622e32f802dSZhong Yang 623b6d5f9dcSzhongyang void CLyricsWindow::SetLyricChangeFlag(bool bFlag) 624b6d5f9dcSzhongyang { 625b6d5f9dcSzhongyang m_lyricChangeFlag = bFlag; 626b6d5f9dcSzhongyang } 627b6d5f9dcSzhongyang 628b1f2b024SZhong Yang void CLyricsWindow::OnLButtonDown(UINT nFlags, CPoint point) 629b1f2b024SZhong Yang { 630*b7f299bfSzhongyang for (auto& btn : m_buttons) 631*b7f299bfSzhongyang { 632*b7f299bfSzhongyang if (btn.second.rect.PtInRect(point) != FALSE) 633*b7f299bfSzhongyang btn.second.pressed = true; 634*b7f299bfSzhongyang } 635*b7f299bfSzhongyang 636b1f2b024SZhong Yang CWnd::OnLButtonDown(nFlags, point); 637b1f2b024SZhong Yang ReleaseCapture(); 638b1f2b024SZhong Yang SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,NULL); 639b1f2b024SZhong Yang } 640b1f2b024SZhong Yang 641b1f2b024SZhong Yang void CLyricsWindow::OnLButtonUp(UINT nFlags, CPoint point) 642b1f2b024SZhong Yang { 643b1f2b024SZhong Yang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 644*b7f299bfSzhongyang for (auto& btn : m_buttons) 645*b7f299bfSzhongyang { 646*b7f299bfSzhongyang btn.second.pressed = false; 647*b7f299bfSzhongyang } 648b1f2b024SZhong Yang CWnd::OnLButtonUp(nFlags, point); 649b1f2b024SZhong Yang } 6509dc20028Szhongyang 6519dc20028Szhongyang 6529dc20028Szhongyang void CLyricsWindow::OnMouseMove(UINT nFlags, CPoint point) 6539dc20028Szhongyang { 6549dc20028Szhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 655*b7f299bfSzhongyang for (auto& btn : m_buttons) 656*b7f299bfSzhongyang { 657*b7f299bfSzhongyang btn.second.hover = (btn.second.rect.PtInRect(point) != FALSE); 658*b7f299bfSzhongyang } 659*b7f299bfSzhongyang 6609dc20028Szhongyang TRACKMOUSEEVENT tme; 6619dc20028Szhongyang tme.cbSize = sizeof(tme); 6629dc20028Szhongyang tme.hwndTrack = m_hWnd; 6639dc20028Szhongyang tme.dwFlags = TME_LEAVE | TME_HOVER; 6649dc20028Szhongyang tme.dwHoverTime = 1; 6659dc20028Szhongyang _TrackMouseEvent(&tme); 6669dc20028Szhongyang 6679dc20028Szhongyang CWnd::OnMouseMove(nFlags, point); 6689dc20028Szhongyang } 6699dc20028Szhongyang 6709dc20028Szhongyang 6719dc20028Szhongyang void CLyricsWindow::OnMouseHover(UINT nFlags, CPoint point) 6729dc20028Szhongyang { 6739dc20028Szhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 6749dc20028Szhongyang if (!m_bHot) 6759dc20028Szhongyang { 6769dc20028Szhongyang m_bHot = true; 6779dc20028Szhongyang //Invalidate(); 6789dc20028Szhongyang } 6799dc20028Szhongyang else 6809dc20028Szhongyang { 6819dc20028Szhongyang CWnd::OnMouseHover(nFlags, point); 6829dc20028Szhongyang } 6839dc20028Szhongyang } 6849dc20028Szhongyang 6859dc20028Szhongyang 6869dc20028Szhongyang void CLyricsWindow::OnMouseLeave() 6879dc20028Szhongyang { 6889dc20028Szhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 6899dc20028Szhongyang m_bHot = false; 6909dc20028Szhongyang //Invalidate(); 6919dc20028Szhongyang 6929dc20028Szhongyang CWnd::OnMouseLeave(); 6939dc20028Szhongyang } 694c7bf0801Szhongyang 695c7bf0801Szhongyang 696c7bf0801Szhongyang void CLyricsWindow::OnSizing(UINT fwSide, LPRECT pRect) 697c7bf0801Szhongyang { 698c7bf0801Szhongyang CWnd::OnSizing(fwSide, pRect); 699c7bf0801Szhongyang 700c7bf0801Szhongyang // TODO: �ڴ˴������Ϣ���������� 701c7bf0801Szhongyang m_bHot = true; 702c7bf0801Szhongyang } 703c45e940bSzhongyang 704c45e940bSzhongyang 705c45e940bSzhongyang void CLyricsWindow::OnRButtonUp(UINT nFlags, CPoint point) 706c45e940bSzhongyang { 707c45e940bSzhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 708c45e940bSzhongyang CPoint point1; //����һ������ȷ�����λ�õ�λ�� 709c45e940bSzhongyang GetCursorPos(&point1); //��ȡ��ǰ����λ�ã��Ա�ʹ�ò˵����Ը����꣬��λ������Ļ���Ͻǵ�Ϊԭ�㣬point���Կͻ������Ͻ�Ϊԭ�� 710c45e940bSzhongyang CMenu* pMenu = m_popupMenu.GetSubMenu(0); 711c45e940bSzhongyang if (pMenu != NULL) 712c45e940bSzhongyang pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point1.x, point1.y, this); 713c45e940bSzhongyang 714c45e940bSzhongyang //CWnd::OnRButtonUp(nFlags, point); 715c45e940bSzhongyang } 716c45e940bSzhongyang 717c45e940bSzhongyang 718c45e940bSzhongyang BOOL CLyricsWindow::OnCommand(WPARAM wParam, LPARAM lParam) 719c45e940bSzhongyang { 720c45e940bSzhongyang // TODO: �ڴ����ר�ô����/����û��� 721c45e940bSzhongyang if (CCommon::IsMenuItemInMenu(m_popupMenu.GetSubMenu(0), wParam)) 722c45e940bSzhongyang AfxGetMainWnd()->SendMessage(WM_COMMAND, wParam, lParam); //���˵�����ת���������� 723c45e940bSzhongyang 724c45e940bSzhongyang return CWnd::OnCommand(wParam, lParam); 725c45e940bSzhongyang } 7267815ece2Szhongyang 7277815ece2Szhongyang 7287815ece2Szhongyang void CLyricsWindow::OnGetMinMaxInfo(MINMAXINFO* lpMMI) 7297815ece2Szhongyang { 7307815ece2Szhongyang // TODO: �ڴ������Ϣ�����������/�����Ĭ��ֵ 7317815ece2Szhongyang lpMMI->ptMinTrackSize.x = theApp.DPI(400); 7327815ece2Szhongyang lpMMI->ptMinTrackSize.y = theApp.DPI(100); 7337815ece2Szhongyang 7347815ece2Szhongyang CWnd::OnGetMinMaxInfo(lpMMI); 7357815ece2Szhongyang } 7367815ece2Szhongyang 7377815ece2Szhongyang 7387815ece2Szhongyang afx_msg LRESULT CLyricsWindow::OnInitmenu(WPARAM wParam, LPARAM lParam) 7397815ece2Szhongyang { 7407815ece2Szhongyang AfxGetMainWnd()->SendMessage(WM_INITMENU, wParam, lParam); //��WM_INITMENU��Ϣת���������� 7417815ece2Szhongyang return 0; 7427815ece2Szhongyang } 743