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