1 // ======================================================== 2 // 文件:LyricsWindow.h 3 // 类名:CLyricsWindow 4 // 功能:歌词显示窗口 5 // 描述:使用GDIPlus绘制歌词 6 // 作者:邓学彬(泪闯天涯) 7 // ======================================================== 8 // 接口说明 9 // Create 创建歌词窗口 10 // UpdateLyrics 更新歌词(歌词文本,高亮进度百分比) 11 // Draw 重画歌词窗口 12 // SetLyricsColor 设置歌词颜色 13 // SetLyricsBorder 设置歌词边框 14 // SetHighlightColor 设置高亮歌词颜色 15 // SetHighlightBorder 设置高亮歌词边框 16 // SetLyricsShadow 设置歌词阴影 17 // SetLyricsFont 设置歌词字体 18 // ======================================================== 19 20 /* 21 说明:此类的原作者:邓学彬,地址:https://blog.csdn.net/CometNet/article/details/37508613 22 在原有的基础上有修改 23 */ 24 25 #pragma once 26 27 #include <gdiplus.h> 28 #pragma comment(lib,"GdiPlus.lib") 29 #include "DrawCommon.h" 30 31 //歌词渐变模式 32 enum LyricsGradientMode 33 { 34 LyricsGradientMode_None =0, //无渐变 35 LyricsGradientMode_Two =1, //两色渐变 36 LyricsGradientMode_Three =2 //三色渐变 37 }; 38 39 // CLyricsWindow 40 41 class CLyricsWindow : public CWnd 42 { 43 DECLARE_DYNAMIC(CLyricsWindow) 44 45 public: 46 CLyricsWindow(); 47 virtual ~CLyricsWindow(); 48 49 public: 50 //创建窗口 51 BOOL Create(int nHeight = -1); 52 BOOL Create(LPCTSTR lpszClassName); 53 BOOL Create(LPCTSTR lpszClassName,int nWidth,int nHeight); 54 public: 55 //设置是否双行显示 56 void SetLyricDoubleLine(bool doubleLine); 57 // 设置是否显示翻译 58 void SetShowTranslate(bool showTranslate); 59 // 更新当前歌词及高亮进度 60 void UpdateLyrics(LPCTSTR lpszLyrics, int nHighlight); 61 // 更新下一句歌词 62 void SetNextLyric(LPCTSTR lpszNextLyric); 63 // 更新歌词翻译文本 64 void UpdateLyricTranslate(LPCTSTR lpszLyricTranslate); 65 // 设置交换标志 66 void SetLyricChangeFlag(bool bFlag); 67 // 获取当前歌词文本 68 const CString& GetLyricStr() const; 69 70 //重画歌词窗口 71 void Draw(); 72 73 //设置歌词颜色 74 void SetLyricsColor(Gdiplus::Color TextColor1); 75 void SetLyricsColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode); 76 //设置歌词边框 77 void SetLyricsBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth = 1.0f); 78 //设置高亮歌词颜色 79 void SetHighlightColor(Gdiplus::Color TextColor1); 80 void SetHighlightColor(Gdiplus::Color TextColor1,Gdiplus::Color TextColor2,LyricsGradientMode TextGradientMode); 81 //设置高亮歌词边框 82 void SetHighlightBorder(Gdiplus::Color BorderColor, Gdiplus::REAL BorderWidth = 1.0f); 83 //设置歌词阴影 84 void SetLyricsShadow(Gdiplus::Color ShadowColor,int nShadowOffset=2); 85 //设置歌词字体 86 void SetLyricsFont(const WCHAR * familyName, Gdiplus::REAL emSize,INT style= Gdiplus::FontStyleRegular, Gdiplus::Unit unit= Gdiplus::UnitPixel); 87 88 //设置不透明度 89 void SetAlpha(int alpha); 90 //设置对齐方式 91 void SetAlignment(Alignment alignment); 92 //设置歌词卡拉OK样式显示 93 void SetLyricKaraokeDisplay(bool karaoke_disp); 94 private: 95 //绘制高亮歌词 96 void DrawHighlightLyrics(Gdiplus::Graphics* pGraphics,Gdiplus::GraphicsPath* pPath, Gdiplus::RectF& dstRect); 97 //创建渐变画刷 98 Gdiplus::Brush* CreateGradientBrush(LyricsGradientMode TextGradientMode,Gdiplus::Color& Color1,Gdiplus::Color& Color2, Gdiplus::RectF& dstRect); 99 //注册窗口类 100 BOOL RegisterWndClass(LPCTSTR lpszClassName); 101 102 protected: 103 // 在指定rect实际绘制一行歌词,is_current决定是否跟随进度滚动,is_translate决定字号大小,draw_highlight决定是否绘制高亮 104 void DrawLyricText(Gdiplus::Graphics* pGraphics, LPCTSTR strText, Gdiplus::RectF rect, bool is_current, bool is_translate, bool draw_highlight); 105 // 绘制单行歌词,含翻译 106 void DrawLyrics(Gdiplus::Graphics* pGraphics); 107 // 绘制能够交换显示的双行歌词 108 void DrawLyricsDoubleLine(Gdiplus::Graphics* pGraphics); 109 // 在绘制歌词前绘制/执行的内容 PreDrawLyric(Gdiplus::Graphics * pGraphics,Gdiplus::Font * pFont)110 virtual void PreDrawLyric(Gdiplus::Graphics* pGraphics, Gdiplus::Font* pFont) { } 111 //在绘制歌词后绘制的内容 AfterDrawLyric(Gdiplus::Graphics * pGraphics)112 virtual void AfterDrawLyric(Gdiplus::Graphics* pGraphics) { } 113 114 protected: 115 DECLARE_MESSAGE_MAP() 116 private: 117 HDC m_hCacheDC;//缓存DC 118 int m_nWidth; 119 int m_nHeight; 120 CString m_lpszLyrics;//Unicode格式的歌词 121 int m_nHighlight;//高亮歌词的百分比 0--1000 122 Gdiplus::Color m_TextColor1;//普通歌词颜色,ARGB颜色 123 Gdiplus::Color m_TextColor2;//普通歌词颜色,ARGB颜色 124 LyricsGradientMode m_TextGradientMode;//普通歌词渐变模式 125 Gdiplus::Pen* m_pTextPen;//普通歌词边框画笔 126 Gdiplus::Color m_HighlightColor1;//高亮歌词颜色,ARGB颜色 127 Gdiplus::Color m_HighlightColor2;//高亮歌词颜色,ARGB颜色 128 LyricsGradientMode m_HighlightGradientMode;//高亮歌词渐变模式 129 Gdiplus::Pen*m_pHighlightPen;//高亮歌词边框画笔 130 Gdiplus::Brush* m_pShadowBrush;//阴影画刷,GDIPlus画刷 131 int m_nShadowOffset;//阴影偏移 132 Gdiplus::Font* m_pFont;//GDIPlus字体 133 int m_FontStyle; 134 Gdiplus::REAL m_FontSize; 135 Gdiplus::FontFamily* m_pFontFamily; 136 Gdiplus::StringFormat* m_pTextFormat; 137 138 protected: 139 bool m_bDoubleLine = false; //歌词双行显示 140 bool m_bShowTranslate = false; //显示歌词翻译 141 CString m_strTranslate; //歌词翻译 142 CString m_strNextLyric; //下一句歌词 143 int m_alpha = 255; //不透明度 144 bool m_lyricChangeFlag = false; //歌词发生改变标志 145 CSize m_frameSize{}; 146 CRect m_rcWindow; 147 int m_toobar_height = 0; 148 Alignment m_alignment{ Alignment::AUTO }; //对齐方式 149 bool m_lyric_karaoke_disp = true; //歌词卡拉OK样式显示 150 151 protected: 152 afx_msg void OnLButtonDown(UINT nFlags, CPoint point); 153 154 }; 155