xref: /MusicPlayer2/MusicPlayer2/LyricsWindow.h (revision f9c6e27d17ca383d11646aafc3e453b4e28bd267)
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